
2022年12月31日、機械学習フレームワーク「PyTorch」は、自社のウェブサイト上で、パッケージの1つがPyPIリポジトリ経由で侵害されたことを発表しました。PyTorchは、強力なグラフィックス・プロセッシング・ユニット(GPU)アクセラレーションと、テープベースの自動グラフィカル・システム上に構築されたディープ・ニューラル・ネットワークを備えたテンソル計算向けに設計されたフレームワークです。
同社によると、2022年12月25日から12月30日の間にインストールされたPyTorchのナイトリーバージョンはすべて侵害を受けたとのことです。ナイトリーバージョンのソフトウェアは毎日更新されますが、バグや脆弱性を回避するためにより多くのテストが実施される安定版とは異なります。PyTorchの安定版は今回の攻撃の影響を受けていません。
ナイトリーバージョンの問題は、PyPI から pip 経由でインストールされた torchtriton というソフトウェア依存関係に影響を及ぼしました。この依存関係は侵害を受け、torchtriton がインポートされた時点で悪意のあるバイナリが実行されました。
PyPI コード リポジトリとは何ですか?
PyPI(Python Package Index)は、700万以上のファイルを含む40万以上のプロジェクトを格納しています。このパッケージマネージャーは、開発者がコードのメンテナンスとアップデートの配布を行うのに役立ちます。Python言語で書かれた様々なソフトウェアを必要とする企業で広く利用されています。
参照:採用キット: Python 開発者(TechRepublic Premium)
PyPIは、Pythonソフトウェアのインストールやアップデートについて、例えばコマンドラインからpipコマンドを使って簡単に問い合わせることができます。このようなコードリポジトリは、ユーザーや管理者にとってソフトウェアの取り扱いを容易にする一方で、マルウェア拡散の手段を探している脅威アクターにとって格好の標的となる可能性があります。
PyTorch の侵害はどのようにして発生したのでしょうか?
PyTorch チームによると、悪意のある torchtriton 依存パッケージが 2022 年 12 月 30 日金曜日午後 4 時 40 分頃に PyPI コード リポジトリにアップロードされました。悪意のあるパッケージの名前は、PyTorch ナイトリー パッケージ インデックスで出荷されたものと同じでした。
PyTorchは、「PyPIインデックスが優先されるため、この悪意のあるパッケージは公式リポジトリのバージョンではなくインストールされていました。この設計により、サードパーティのインデックスに存在するパッケージと同じ名前のパッケージを登録することができ、pipはデフォルトでそのバージョンをインストールします」と説明しています。
Endor LabsのCISSP兼セキュリティ研究者であるヘンリック・プレート氏は、TechRepublicに対し、「この攻撃で使用されている手法は、よく知られている依存関係の混乱に似ており、プロジェクトの依存関係をダウンロードするために複数のパッケージリポジトリが使用される設定を悪用します。リポジトリへのアクセス順序など、パッケージマネージャーの解決アルゴリズムによっては、攻撃者はパッケージマネージャーに正規のパッケージではなく悪意のあるパッケージをダウンロードさせる可能性があります」と述べています。
悪意のあるペイロード
このサプライ チェーン攻撃では、悪意のあるコードは次のようなシステム情報を収集することを目的としていました。
- システムで使用されるネームサーバー
- ホスト名
- 現在ログインしているユーザー名
- 現在の作業ディレクトリ名
- 環境変数
また、複数のファイルを読み取るように設計されています。
- /etc/ホスト
- /etc/passwd
- ユーザーのホームフォルダからの最初の1,000個のファイル(サイズ制限は99,999バイト)
- gitconfigファイル
- マシンに保存されているSecure Shellキー
収集されたすべての情報は、wheezy(.)io の DNS サーバーを使用して、暗号化されたドメイン ネーム システム クエリ経由でドメイン h4ck(.)cfd にアップロードされました。
Twitterユーザーが攻撃の責任を認める
驚くべき展開として、BadRequestsというニックネームのTwitterユーザーが攻撃の責任を認め、謝罪しました。BadRequestsは、攻撃の意図は悪意ではなく、収集されたデータはすべて削除したと述べています。
このセキュリティエンジニアとされる人物は、これは依存関係の混乱の問題を調査するためのものであり、この問題は 12 月 29 日に Facebook に報告されたとも述べています。BadRequests は、PyTorch がもはや Facebook/Meta ではなく Linux Foundation によって扱われていることを知らなかったようです。
参照:パスワード侵害:ポップカルチャーとパスワードが混ざらない理由(無料PDF)(TechRepublic)
単純なバグ報奨金制度の場合、なぜこの人物が侵害されたユーザーのSSHフォルダからすべてのSSH鍵を収集し、すべてのデータがDNSリクエストで暗号化されて送信されたのか疑問に思うかもしれません。また、この事件はBadRequestsにとって法的問題となる可能性があります。攻撃者が個人情報を違法に収集したため、影響を受けた企業や個人がBadRequestsを訴える可能性もあるからです。
侵害をどうやって検出できるでしょうか?
PyTorch は、torchtriton パッケージを検索し、Python 環境が影響を受けるかどうかを印刷するコマンド ラインを提供します。
python3 -c "import pathlib;import importlib.util;s=importlib.util.find_spec('triton'); affected=any(x.name == 'triton' for x in (pathlib.Path(s.submodule_search_locations[0] if s is not None else '/' ) / 'runtime').glob('*'));print('You are {}affected'.format('' if affected else 'not '))"
システムが侵害された場合は、PyTorch と torchtriton をアンインストールし、最新のバイナリを使用して再インストールする必要があります。
また、SSH キーが侵害されて攻撃者に送信されているため、影響を受けるユーザーはすべての SSH キーを変更することを強くお勧めします。
これらの攻撃から組織を守る方法
PyTorchチームは、ナイトリーパッケージからtorchtritonへの依存関係を削除し、pytorch-tritonに置き換えたと発表しました。また、ダミーパッケージをPyPIに登録しました。これにより、同じ問題が再発するのを防ぐことができます。PyTorchはまた、PyPIに連絡を取り、torchtritonパッケージの適切な所有権を取得し、悪意のあるバージョンを削除しました。
この件について質問を受けたヘンリック・プレート氏は、TechRepublicに対し、「この攻撃ベクトルは、プライベートリポジトリを使用して内部パッケージをホストし、外部パッケージをミラーリングすることで対処できます。例えば、Pythonエコシステムであればdevpiが挙げられます。通常、このようなソリューションは依存関係の解決やパッケージのダウンロードプロセスをより細かく制御できます。しかし、その設定と運用には相当の労力が必要であり、ローカル開発者クライアントが適切に設定されている場合にのみ効果を発揮します。」と述べています。
開示:私はトレンドマイクロに勤務していますが、この記事で述べられている意見は私自身のものです。
TechRepublic Academy の Python のオンライン トレーニング コース、ブートキャンプ、マスター クラスについて詳しくは、この記事をお読みください。