Pythonの公式パッケージリポジトリであるPyPIに、マルウェアを仕込んだ悪質パッケージが定期的に発見されています。2025年から2026年にかけても複数の事例が報告されており、Python開発者にとって見過ごせない問題です。一方で、基本的な対策を知っていれば被害を防ぐことは十分可能です。

サプライチェーン攻撃とは

サプライチェーン攻撃とは、ソフトウェアの開発・配布プロセスに介入して、マルウェアを仕込む攻撃手法です。具体的には、開発者が信頼してインストールするパッケージやライブラリに悪意のあるコードを混入させます。

なぜこの攻撃が効果的かというと、開発者は通常「pip install パッケージ名」と打つだけでライブラリをインストールします。つまり、パッケージの中身を逐一確認する人はほとんどいないのが現実です。攻撃者はこの信頼関係を悪用しているわけです。

よく使われる攻撃手口

  • タイポスクワッティング:有名パッケージに似た名前で悪質パッケージを公開。例えば「requests」の代わりに「requets」や「reqeusts」といった微妙なスペルミスを狙います
  • スターゲイジング:GitHubのスター数を偽装して信頼性があるように見せかけ、ダウンロードを誘引する手口。最近増加傾向にあります
  • 依存関係の乗っ取り:メンテナンスされなくなったパッケージの管理権限を取得し、アップデートにマルウェアを仕込む方法
  • setup.pyの悪用:パッケージのインストール時に実行されるsetup.pyに悪意のあるコードを仕込み、インストールするだけでマルウェアが実行される仕組み

開発者が取るべき具体的な対策

まず、パッケージ名を正確に確認する習慣をつけましょう。コピペする際も、URLやパッケージ名が正しいか目視でチェックすることが大切です。

次に、仮想環境(venv)の使用は必須です。プロジェクトごとに仮想環境を分離することで、万が一悪質パッケージをインストールしてしまった場合でも被害をそのプロジェクト内に限定できます。

さらに、pip-auditやSafety CLIといった脆弱性スキャンツールの導入も効果的です。CI/CDパイプラインに組み込めば、自動的に既知の脆弱性を持つパッケージを検出できます。

requirements.txtのベストプラクティス

依存関係を管理するrequirements.txtでは、バージョンを固定(ピン留め)することをおすすめします。「requests>=2.28」のように範囲指定するのではなく、「requests==2.31.0」のように具体的なバージョンを指定しましょう。

加えて、ハッシュ値の検証も有効です。pip installに–require-hashesオプションをつけることで、パッケージのハッシュ値が一致しない場合にインストールを中断できます。これにより、改ざんされたパッケージのインストールを防げます。

まとめ

PyPIのサプライチェーン攻撃は、Python開発者なら誰でも遭遇する可能性がある脅威です。しかし、パッケージ名の確認・仮想環境の使用・脆弱性スキャンの3つを実践するだけで、リスクを大幅に低減できます。日頃からセキュリティを意識した開発を心がけましょう。