レガシーPythonパッケージの脆弱性:ドメイン乗っ取りによりPyPIへのサプライチェーン攻撃の危険性

はじめに: レガシーPythonパッケージに潜む脅威

ReversingLabsの研究者たちは、レガシーPythonパッケージに潜む脆弱性について警鐘を鳴らしました。この脆弱性は、ドメインの侵害を通じて、Python Package Index (PyPI) のユーザーをサプライチェーン攻撃に晒す可能性があります。現代のプロジェクトではほとんど使用されない古いコードが、未だに存在する時代遅れのシステムに残っていることで、リスクが継続しています。

脆弱性の詳細: ドメイン乗っ取りのメカニズム

ReversingLabs Spectra Assure Communityの機械学習モデルが、既知のマルウェアに似たパッケージの動作を検出しました。複数のPyPIパッケージで配布されている、危険なブートストラップファイルが問題です。これらのスクリプトはPythonの依存関係、特に長らく廃止されたdistributeパッケージのインストーラーを、python-distribute.orgドメインから直接取得するように自動化されています。

致命的なことに、このドメインはもはやPythonコミュニティによって管理されておらず、現在広告収入のためにパークされ、売却中です。もし攻撃者がこのドメインを購入し、悪意のあるスクリプトをホストすれば、影響を受けるブートストラップファイルを実行するあらゆる開発者に悪質なペイロードを配信することが可能になります。

影響を受けるパッケージ

歴史的または現在このスクリプトにリンクしている著名なパッケージには以下のものが含まれます。

  • Tornado (非同期ネットワーキング)
  • pypiserver (プライベートPyPIサーバー)
  • slapos.core (分散OSオーバーレイ)
  • roman (数字変換)
  • xlutils (Excelファイル編集)
  • testfixtures (ユニットテスト)
  • imio-pm-locales
  • pyquery

pypiserverのように、最近になってスクリプトを削除したパッケージもありますが、Makefilesのような自動化ファイルを通じて残存するケースも存在します。この危険性は、ユーザーやビルドシステムがレガシーなブートストラップルーチンを実行した場合にのみ顕在化します。

Pythonパッケージングの歴史的背景と問題の根源

レポートによると、Pythonのオープンソース開発において、パッケージングと依存関係の解決は常に中心的な課題でした。初期にはdistutilsが提供されましたが(Python 3.12で削除)、その機能が不足するにつれてsetuptoolsのようなツールが登場しました。開発上の対立からdistributesetuptoolsから派生しましたが、2013年には再び統合されました。しかし、廃止されたdistutils2など、モダナイズの試みが複数存在し、エコシステムは互換性の問題が絡み合う複雑な状態になりました。

その結果、インストールを容易にするためにブートストラップスクリプトが普及し、しばしば依存関係を取得するためのURLがハードコードされました。コミュニティの監視やタイムリーな移行が行われなかったため、ドメインはやがて失効しました。python-distribute.orgのドメインは、2014年以降、公式にその使用や所有が監視されることなく、売却可能状態になっており、このリスクを明確に示しています。

過去の事例と実証された脅威

ドメイン乗っ取りは既知の攻撃ベクトルです。2023年には、npmパッケージfseventsが同様のスキームの犠牲になりました。攻撃者はバージョン1.0.0から1.2.11にハードコードされていた失効したクラウドドメインを登録し、悪意のあるペイロードを配信しました。これはCVE-2023-45311として文書化されています。

ReversingLabsの研究者たちは、Pythonのシナリオ、特にslapos.coreのブートストラップスクリプトを標的とした概念実証(Proof-of-Concept)エクスプロイトを示しました。PyPIは現在、より安全な慣行をデフォルトとしており、ほとんどの開発者はsetuptoolsに移行していますが、脆弱なパターンの残骸は広く配布されており、古いドメインが悪意のある者の手に渡った場合、現実的なリスクとなる可能性があります。

広がるサプライチェーンリスクと対策

オープンソースモデルはコード共有によって繁栄しますが、今回のケースが示すように、ハードコードされたドメインは隠れた落とし穴となります。古い依存関係やツールがサポート終了を迎えた際に、関連するインフラを廃止しなかったり、移行を確実に行わなかったりすると、ユーザーは静かでありながら深刻な脅威に晒されます。python-distribute.orgについて、現時点では悪用が確認されていませんが、攻撃者がサプライチェーンの脆弱性をより機会主義的に狙うようになるにつれて、警戒が必要です。

レガシーコードと放棄されたインフラは、ソフトウェアサプライチェーンにとって常に存在する危険です。オープンソースのメンテナーとユーザーは、時代遅れのドメインやブートストラップルーチンについて定期的に依存関係を監査し、非推奨の慣行から積極的に移行して、ドメイン侵害攻撃を防ぐ必要があります。python-distribute.orgのエピソードは、現代のエコシステムに忍び寄るレガシーコードの幽霊から身を守るための、すべての開発者への警告であり、行動を促すものです。

攻撃の兆候(IoCs)

以下のパッケージおよびバージョン範囲が影響を受けます。

  • pypiserver: >=1.1.1, <2.4.0
  • slapos.core: >=0, <=1.19.0
  • roman: >=2.0.0, <3.2
  • xlutils: >=1.6.0, <2.0.0
  • testfixtures: >=2.3.4, <3.0.2
  • imio-pm-locales: >=4.1.18.1, <4.2.20
  • pyquery: >=1.2.10, <2.0.0

元記事: https://gbhackers.com/python-package/