In this article
Pythonパッケージの命名規則に潜むセキュリティリスク:タイポスクワッティングとその先
何気ないpip installコマンドが、環境全体のセキュリティ侵害やバックドア、トロイの木馬、悪意あるパッケージによる大きな被害につながることがあります。なぜでしょうか?オープンソースのサプライチェーンセキュリティでは、パッケージマネージャーやパッケージリポジトリに注目することがよくあります。
オープンソースのサプライチェーンとは何でしょうか?サプライチェーンには、ソフトウェア製品に貢献するすべてのコンポーネント、ライブラリ、ツールが含まれます。Python開発者の場合、これにはPython Package Index(PyPI)から取得したパッケージが含まれることがよくあります。こうしたパッケージは非常に便利で多くの機能を提供する一方、セキュリティ上の脆弱性を招く可能性もあります。たとえば、悪意ある攻撃者が脆弱性を悪用してアプリケーションに有害なコードを注入し、データ侵害や不正アクセスなどのセキュリティインシデントを引き起こすことがあります。
攻撃手法としてのタイポスクワッティング
Pythonエコシステムでよく見られる攻撃手法の1つがタイポスクワッティングです。JavaScriptのnpmレジストリでよく見られる手法ですが、PyPIレジストリでも珍しくありません。正規のパッケージ名によく似た名前の悪意あるパッケージを作成する手口です。攻撃者は、開発者が名前を少し打ち間違えたり、正確なパッケージ名を誤って記憶したりすることで、気づかずに悪意あるパッケージをインストールするよう仕向けます。インストールされると、パッケージはコードを実行し、その環境にあるシステムを悪用しようとします。たとえば、マシンの環境変数から機密情報を盗み出すことがあります。
PythonのPyYAMLパッケージ名をめぐる混乱
攻撃者はパッケージ名の類似性を悪用して、悪意あるコードを配布することがよくあります。広く使われているPyYAMLパッケージを例に見てみましょう。インストールにはpip install pyyamlコマンドを使いますが、コードではimport yamlと記述します。この不一致が混乱を招き、開発者が誤ってpip install yamlを実行し、別の、場合によっては悪意あるパッケージをインストールしてしまう可能性があります。
公式のPyYAMLドキュメントにも、同様の例が見られます。

FAQ:インストールしたパッケージが悪意あるものだと疑われる場合、どうすればよいですか?
パッケージが悪意あるものだと疑われる場合は、次の手順を実施してください。
パッケージの使用を中止する:プロジェクトでのパッケージの使用を直ちに停止します。
パッケージを報告する:不審なパッケージについて、リポジトリのメンテナー(PyPIなど)に報告し、調査を依頼します。また、社内のAppSecチームとTrustSecチームがセキュリティ侵害への対応手順(シークレットのリセットやローテーションなど)に従うようにしてください。
システムを監査する:システムに不正な変更や不審な動作がないか確認します。
コードを確認する:悪意あるパッケージによって、コードベースやリモートコードリポジトリ(リモートレジストリやレジストリを保存するその他のアーティファクトを含む)が侵害されていないことを確認します。
データ侵害への対応手順:システムは侵害されたと見なされる可能性が高いため、そのように扱う必要があります。
pipでさらに起こりうるパッケージ名の混乱
PURL仕様と、アンダースコアとハイフンの扱いに関するpipパッケージマネージャーの仕様も、パッケージ名の混乱を招く一例です。たとえば、pip install langchain-community とpip install langchain_communityは、文字列が異なるにもかかわらず同じパッケージをインストールします。攻撃者はこの挙動を悪用し、わずかに異なる名前のパッケージを作成できます。その結果、悪意あるソフトウェアを誤ってインストールするリスクが高まります。

さらに、pipではパッケージ名の大文字と小文字が区別されません。つまり、pip install PackageNameとpip install packagenameは同じ結果になります。以前は大文字と小文字を区別していたnpmjsレジストリとは異なり、npmjsも最終的には区別しない方式を採用しました。攻撃者はpipで大文字と小文字が区別されないことを利用して、悪意あるパッケージをさらに見分けにくくすることができます。
FAQ:Pythonパッケージにおけるタイポスクワッティングとは何ですか?
タイポスクワッティングとは、攻撃者が人気のあるパッケージや正規のパッケージに似た名前のパッケージを作成する悪意ある手口です。よくある入力ミスや命名規則を利用して、開発者に悪意あるパッケージをインストールさせることを狙います。たとえば、人気のあるrequestsパッケージをインストールするつもりで、誤ってrequsetsと入力すると、気づかないうちに悪意あるパッケージをインストールしてしまう可能性があります。
まとめと参考情報
安全なソフトウェアサプライチェーンを維持するには、Pythonの悪意あるパッケージに伴うリスクを理解することが重要です。タイポスクワッティングやその他の名前の混同に巻き込まれないよう、パッケージをインストールする際は注意を払い、名前と入手元を必ず再確認しましょう。サプライチェーンのセキュリティリスクについて詳しく知りたい方は、PyPIで発生した依存関係の混同やメンテナーアカウントの乗っ取り事例をご覧ください。
開発者が悪意あるPythonパッケージのインストールを防ぐには、どうすればよいですか?
開発者は、次のような対策を講じることができます。
パッケージ名を再確認する:インストール前に、パッケージ名のスペルを必ず確認します。
パッケージのメタデータを確認する:メタデータやドキュメントに矛盾や不審な点がないか確認します。
信頼できる入手元を利用する:PyPIなど、信頼できるリポジトリからのみパッケージをインストールします。
セキュリティツールを導入する:脆弱性や悪意あるパッケージをスキャンするには、Snyk Open Sourceを活用します。
プロジェクトを効果的に保護するための、安全なオープンソース活用と強固なサプライチェーンセキュリティ対策について、さらに詳しくご紹介します。
Snykでセキュリティ態勢を強化
開発者やDevOps担当者にとって、サプライチェーン攻撃からプロジェクトを守ることは極めて重要です。タイポスクワッティングなどで持ち込まれる悪意あるパッケージのリスクは、強固なセキュリティ対策の必要性を示しています。Snykに登録すれば、セキュリティ態勢を強化し、こうした脅威からプロジェクトを守ることができます。
依存関係をプロアクティブに管理
Snykの包括的なツール群を活用して、依存関係をプロアクティブに管理しましょう。Snykはリアルタイムの脆弱性スキャンとアラートを提供し、パッケージに関連するリスクを常に把握できるようにします。このプロアクティブなアプローチにより、プロジェクトに影響が及ぶ前に潜在的な脅威を軽減できます。
Snykのインテグレーション機能を活用
Snykは既存の開発ワークフローにシームレスに統合できるため、CI/CDパイプラインやPython IDE、GitHub、GitLab、BitBucketなどのGit SCMにセキュリティチェックを組み込めます。これにより、セキュリティを後付けではなく、継続的なプロセスとして実践できます。
最新情報を学び続ける
Snyk LearnのPythonセキュリティに関するクイックレッスンは、もう受講しましたか?Snykは、最新のセキュリティ脅威やベストプラクティスを学べる多彩な教材を提供しています。こうした教材で常に最新情報を把握することで、変化し続けるアプリケーションセキュリティとオープンソースセキュリティの状況をより深く理解し、プロジェクトを守るための適切な対策を講じられます。
Fetch the Flag 2026に参加しよう!
2月12日〜13日、東部時間の正午から翌日正午まで開催されるCapture the Flagイベントで、セキュリティスキルを試しましょう。