Ultralytics AIのPwn Requestサプライチェーン攻撃
2024年12月11日
0 分で読めますultralyticsのサプライチェーン攻撃は、2024年12月4日から7日にかけて、明確に分かれた2つのフェーズで発生しました。第1フェーズでは、悪意あるバージョンが2つPyPIに公開されました。バージョン8.3.41は12月4日20:51 UTCにリリースされ、約12時間後の12月5日09:15 UTCに削除されるまで公開されていました。続いてバージョン8.3.42が12月5日12:47 UTCに公開され、約1時間後の13:47 UTCに削除されました。
第2フェーズは12月7日に発生しました。攻撃者はGitHub Actionsを完全に回避し、悪意あるバージョンをさらに2つPyPIに直接公開しました。バージョン8.3.45は01:41 UTCに公開され、約8時間後の10:08 UTCまで公開されていました。バージョン8.3.46は02:27 UTCにリリースされ、約7.5時間後の10:09 UTCに削除されました。
この攻撃は、複数の経路から最初に検知されました。そのうちの1つがGoogle Colabの自動不正利用検知システムで、最初の悪意あるリリースから数時間以内に不審なアクティビティを検出し始めました。複数のプロジェクトのユーザーが異常なCPU使用率を報告し、パッケージのメンテナーはGitHubリポジトリとPyPIのリリースに不一致があることを確認しました。
攻撃のタイムライン
2024-06-04 Snyk GitHub Actions Scannerの初回コミット
リンク: https://github.com/snyk-labs/github-actions-scanner
2024-08-14 Adnan KhanがGHSA-7x29-qqmq-v6qcをUltralyticsのメンテナーに報告 — テンプレートインジェクションの脆弱性
リンク: https://github.com/ultralytics/actions/security/advisories/GHSA-7x29-qqmq-v6q
2024-08-14 GHSA-7x29-qqmq-v6qcの修正を含むultralytics/actions v0.0.3をリリース
リンク: https://github.com/ultralytics/actions/security/advisories/GHSA-7x29-qqmq-v6qc
2024-08-24 コミットc1365ceでultralytics/actions v0.0.24に脆弱性が再導入される
2024-12-03 22:28:49 @jiwuwgknvmが攻撃を武器化する実験を開始
2024-12-03 22:33:47 @jiwuwgknvmがrun.shのトークン窃取スクリプトを含むPR #17984(現在は削除済み)を送信
2024-12-04 19:33:00 @openimbotがテンプレートインジェクションを含むPR #18018を送信
リンク: https://github.com/ultralytics/ultralytics/pull/18018
2024-12-04 19:57:00 @openimbotが別のテンプレートインジェクションを含むPR #18020を送信
リンク: https://github.com/ultralytics/ultralytics/pull/18020
2024-12-04 20:50:00 @UltralyticsAssistantによってv8.3.41のリリースが開始
2024-12-04 20:51:12 v8.3.41がPyPIに公開
2024-12-04 23:46:00 Google ColabのIssue #4979が報告 — 暗号資産マイニングによりアカウントがブロック
リンク: https://github.com/googlecolab/colabtools/issues/4979
2024-12-05 05:34:00 Issue #18027が作成 — PyPIとの不一致を報告
リンク: https://github.com/ultralytics/ultralytics/issues/18027
2024-12-05 05:35:00 ComfyUIのIssue #843が作成 — 暗号資産マイニングを報告
リンク: https://github.com/ltdrdata/ComfyUI-Impact-Pack/issues/843
2024-12-05 07:50:00 Issue #18030が作成 — CPU使用率が100%
リンク: https://github.com/ultralytics/ultralytics/issues/18030
2024-12-05 09:15:06 v8.3.41がPyPIから削除(約12時間後)
2024-12-05 09:39:00 Comic-translateのIssue #184が作成 — マイニングを報告
リンク: https://github.com/ogkalu2/comic-translate/issues/184
2024-12-05 12:46:00 @glenn-jocherによってv8.3.42のリリースが開始
2024-12-05 12:47:29 v8.3.42がPyPIに公開
2024-12-05 13:47:30 v8.3.42がPyPIから削除(約1時間後)
2024-12-05 15:17:00 @glenn-jocherが@openimbotをUltralyticsから追放したと発表
2024-12-06 19:51:00 AdvancedLivePortrait-WebUIのIssue #19が作成 — セキュリティ警告
リンク: https://github.com/jhj0517/AdvancedLivePortrait-WebUI/issues/19
2024-12-07 01:41:45 v8.3.45がPyPIに直接リリース(CI/CDなし)
2024-12-07 02:27:14 v8.3.46がPyPIに直接リリース(CI/CDなし)
2024-12-07 04:00:00 Adnan Khanがv8.3.45とv8.3.46は悪意あるバージョンだと発表
2024-12-07 10:08:32 v8.3.45がPyPIから削除(約8時間後)
2024-12-07 10:09:08 v8.3.46がPyPIから削除(約7.5時間後)
Moneroを採掘する暗号資産攻撃
ultralyticsの悪意あるバージョンには、バックグラウンドで気付かれないように動作しながら、システムリソースを大量に消費する暗号資産マイニング用ペイロードが含まれていました。マイナーはXMRigを実装したもので、Moneroの採掘に特化して設定されていました。このマルウェアは巧妙で、Google Colabの自動不正利用検知システムを作動させました。その結果、マイニング活動による高いCPU使用率を受け、一部のユーザーのアカウントが一時的に停止されました。
マイナーは、2つの重要な関数 safe_download と safe_run を改変してパッケージに挿入されました。最初の段階では、safe_download関数にパッチを適用したクライアント側のダウンローダーが、実際のマイニングペイロードを取得します。safe_run関数は、リソース使用量を気付かれにくくするため、マイナーをバックグラウンドで実行するよう改変されていました。しかし、暗号資産のマイニングには大量のCPUリソースが必要なため、多くのユーザーがマルウェアの存在に気付きました。
Ultralyticsの修復対応に備える方法
Pythonの依存関係に起因するリスクへの曝露状況を評価する
影響を受けたバージョンの公開期間:
v8.3.41: 2024-12-04 20:51 UTC~2024-12-05 09:15 UTC(約12時間)
v8.3.42: 2024-12-05 12:47 UTC~2024-12-05 13:47 UTC(約1時間)
v8.3.45: 2024-12-07 01:41 UTC~2024-12-07 10:08 UTC(約8時間)
v8.3.46: 2024-12-07 02:27 UTC~2024-12-07 10:09 UTC(約7.5時間)
影響を受けているか確認するには:
該当期間中の
pip installログを確認する現在のバージョンを確認する:
pip show ultralytics該当期間中の異常なCPUアクティビティについてシステムログを確認する
該当期間中に自動ビルドやCI/CDの実行がなかったか確認する
Ultralyticsに依存することが知られているプロジェクト
Ultralyticsは、特にコンピュータビジョンタスクで広く使われている、AI/ML向けPythonエコシステムのAIライブラリです。主な利用プロジェクトは次のとおりです。
ComfyUI: 多くの人気カスタムノードで物体検出にYOLOv8を使用。今回の状況に関する声明はこちら。
Comic-Translate: テキスト検出にYOLOモデルを使用
Roboflow: 物体検出にYOLOv8を統合
その他多数のStable DiffusionツールやWeb UI
ultralytics/actionsのサプライチェーン攻撃を解説
この攻撃では、GitHub Actionsの脆弱性を巧妙に連鎖させ、ブランチ名を介したテンプレートインジェクションと呼ばれる手法でワークフロー自動化システムを明確に標的としていました。攻撃の流れを詳しく見ていきましょう。
最初の侵害は、@openimbotアカウントから送信された2つの悪意あるプルリクエスト(PR #18018とPR #18020)を通じて発生しました。これらのPRは、エスケープされていないテンプレート式と、安全でないpull_request_targetトリガーを組み合わせていたformat.ymlワークフローの脆弱性を悪用しました。
攻撃はいくつかの段階を経て実行されました。
攻撃者は、シェルコマンドを含むよう慎重に細工した名前のブランチを作成しました。
ワークフローがこのブランチ名を処理した際、脆弱な次の行により、テンプレート式がシェルのコンテキスト内で直接展開されました。
展開されたコマンドは、次の処理を行う悪意あるシェルスクリプトをダウンロードして実行しました。
GitHubのトークンとシークレットを窃取
setup-pythonが使用するpipキャッシュを汚染
リリース配布物を改変し、暗号資産マイナーを埋め込み
PyPI APIの認証情報を窃取した可能性
この脆弱性が特に効果的だったのは、ultralytics/actionsのカスタムアクションを悪用し、以前に修正済みだったセキュリティ問題を再び持ち込んだからです。
Snyk Open Sourceでスキャンする
Snykの脆弱性データベースとCLIツールを使えば、侵害されたバージョンのUltralyticsパッケージを使用しているかどうかを確認できます。また、より広範なオープンソースプロジェクトのテストにも活用できます。プロジェクトをスキャンする手順は次のとおりです。
1. Snyk CLIをインストールします。
2. Snykで認証します。
3. Pythonプロジェクトをスキャンします。
これにより、Ultralyticsパッケージの既知の悪意あるバージョン(8.3.41、8.3.42、8.3.45、8.3.46)を使用しているかどうかを特定できるほか、依存関係に潜むその他の脆弱性も確認できます。
DevSecOpsツールキットでSnyk GitHub Actions Scannerを活用する
Snyk GitHub Actions Scannerは、今回のインシデントで悪用されたような、脆弱なGitHub Actionsの設定を特定するのに役立つオープンソースのユーティリティです。Snykの公式製品ではありませんが、DevSecOpsツールキットに加える価値のあるツールです。
スキャナーの使用方法:
1. リポジトリをクローンし、依存関係をインストールします。
2. GitHubトークンを設定します。
3. リポジトリをスキャンします。
このスキャナーは、次のような複数の重大な問題を検出します。
PWN_REQUEST: pull_request_targetを使用し、プルリクエストのブランチもチェックアウトするワークフローを特定します。これは今回のインシデントで悪用された脆弱性そのものです。pull_request_targetはリポジトリのシークレットにアクセスできる状態で実行される一方、信頼できない外部コントリビューターがトリガーできるため危険です。
CMD_EXEC: コマンドインジェクションにつながる可能性がある、runディレクティブ内の
${{ }}のようなエスケープされていないテンプレート式を検出します。
参照されているアクションも確認する、より詳細なスキャンを行うには:
参照されているアクションを最大5階層まで確認し、アクションチェーン全体に潜む脆弱性の特定に役立ちます。
AIセキュリティリスクとサプライチェーンセキュリティ
ultralyticsのインシデントは、オープンソースのサプライチェーンセキュリティ侵害が相次ぐ中で発生した、また1つのセキュリティインシデントです。npmとPyPIの両レジストリでは、暗号資産を狙ったマルウェア攻撃が続いています。多くの場合、こうした攻撃はメンテナーのセキュリティ対策や、プロジェクト設定の安全性に行き着きます。今回のGitHub Actions攻撃は、セキュリティのベストプラクティスを徹底することがいかに重要かを示しています。
AIセキュリティのリスクは、オープンソースのサプライチェーンインシデントにとどまらず、機械学習やモデル交換レジストリにも及びます。リモートコード実行などの差し迫った攻撃は、ディープラーニングのファイル形式に潜む脆弱性や、開発者がLLMを通じてよく利用する安全でないAI生成コードを介して、開発者に影響を及ぼす可能性があります。
Snykを活用してAI生成コードを保護する方法をご覧ください。
Snykとともに、コーディングアシスタントの未来を切り拓く
コーディングアシスタントについて学び、開発ワークフローに取り入れる方法をご紹介します。
