2026年5月19日、Microsoft公式のdurabletask Python SDK(PyPI)に3つの不正バージョンが公開された。28KBのペイロードがAWS / Azure / GCP / Kubernetesの認証情報をまとめて窃取するMini Shai-Hulud Here We Go Again キャンペーンの最新ターゲット。
5月19日。Azureで動くPythonワークフローを書いている人にとって、不吉な日になった。
Microsoftが公式に出しているdurabletask Python SDK——つまり Azure Durable Functions や Durable Task Scheduler で使うあれ ——のPyPIパッケージに、マルウェアを仕込まれた3つのバージョンが公開された。
「自分はAzureしか使ってないから他は関係ない」と思った人にこそ読んでほしい。このマルウェアが盗むのは Azure の認証情報だけではない。AWSのアクセスキー、GCPのサービスアカウント、Kubernetesのkubeconfig、SSH秘密鍵、Claude Codeのトークン ——開発者のマシンに置いてあるクラウド全方位のシークレットだ。Azure開発者を入口にして、AWSとGCPまで全部抜かれる構造になっている。
2026年5月19日、Microsoft公式のdurabletask Python SDK(リポジトリは microsoft/durabletask-python)のPyPI側に、3つの不正バージョンが連続で公開された。対象は 1.4.1 / 1.4.2 / 1.4.3。
StepSecurityの分析によれば、これらをインストールすると 28KBのペイロード が静かにダウンロードされ、AWS / Azure / GCP / Kubernetes / パスワードマネージャー、そして 90以上の開発者ツール設定 から認証情報を抜き取る。盗んだ後はそのクラウド認証情報を使って、AWS SSMやKubernetesクラスタに横展開していく。
これは単発のインシデントではない。TeamPCPによる Mini Shai-Hulud "Here We Go Again" キャンペーンの最新ターゲットだ。同じキャンペーンの過去事例:
つまり、5月19日は同日に2つの大きな波が走った日で、片方はnpm側のAntV、もう片方がPyPI側のMicrosoft durabletaskだ。
durabletaskが狙われたのか——「公式」の信頼が武器になるdurabletask-pythonは、Microsoft純正のAzure Durable Functions / Durable Task Scheduler用Python SDK だ。AIエージェントの長期実行、リトライ機構、サブオーケストレーションをPythonで書きたいAzure開発者が「公式だから」と信頼してpip install durabletaskする。
そして公式SDKを使うコードベースは、ほぼ確実に Azure認証情報、AWS S3アクセスキー(クロスクラウドで併用)、データベース接続文字列、GitHub PAT をローカルの.envやCIシークレットに置いている。攻撃者にとって、これ以上美味しい標的はない。
特にAWS Lambdaから移行してきたチームや、マルチクラウドでAWS S3 + Azure Functionsを組み合わせているチームは、AWSの認証情報も同じマシンにある。durabletaskの侵害ペイロードがそれを掻っ攫っていく。
Mini Shai-Hulud系のペイロードが直近のキャンペーンで収集する典型ターゲット:
クラウド認証情報
~/.aws/credentials (AWSアクセスキー / シークレット)~/.aws/config (リージョン / SSO設定)~/.config/gcloud/credentials.db (GCP)~/.azure/accessTokens.json (Azure CLI)~/.terraform.d/credentials.tfrc.json (Terraform Cloud)Kubernetes / Vault
~/.kube/config/etc/rancher/k3s/k3s.yaml~/.vault-token、/run/secrets/vault_token開発者トークン
~/.npmrc、~/.pypirc、.git-credentials、~/.netrc~/.docker/config.json~/.ssh/id_rsa、~/.ssh/id_ed25519、~/.ssh/config)AIツール
~/.claude.json (Claude Codeトークン)~/.claude/mcp.json (MCP設定)仮想通貨ウォレット
~/.bitcoin/wallet.dat、~/.ethereum/keystore/*、~/.electrum/wallets/*加えて、CI環境変数(GITHUB_TOKEN、ACTIONS_ID_TOKEN_REQUEST_TOKEN、AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_SESSION_TOKEN、VAULT_TOKEN、NPM_TOKEN等)、.envファイル、シェル履歴——あらゆる場所からシークレットを吸い上げる。
データはGitHub APIのdead-drop(攻撃者が侵害したGitHubアカウントの公開リポジトリにコミット)と、フォールバックのC2サーバー(過去事例ではt.m-kosche.comがOpenTelemetryコレクターを装っていた)の2チャンネルで送出される。
このキャンペーンの過去亜種で確認されている特徴として、盗んだAWS認証情報を使ってSSM経由で他のEC2インスタンスにペイロードを展開する ロジックがある。CanisterWormと呼ばれる亜種では、Kubernetesクラスタを検出すると、特権DaemonSetを全ノードに展開してsystemdサービスとして永続化する(PostgreSQLツールに偽装)。
さらに、システムのタイムゾーン / ロケールが イスラエルまたはイラン に設定されている場合、rm -rf /相当の破壊ペイロードが 1/6の確率で発火 する地政学的トリガーも、Microsoftが過去のmistralaiパッケージ分析で確認している。Kubernetesクラスタの場合は全ノードを破壊する"kamikaze"ペイロードを展開する。
durabletaskに同じ機能が含まれているかは現時点で完全には公開検証されていないが、同一キャンペーンの直近亜種の標準装備として持っている可能性が高い。
# pip / pipenv / poetry / uv
grep -r "durabletask" requirements*.txt Pipfile.lock poetry.lock pyproject.toml uv.lock 2>/dev/null
# Conda
grep "durabletask" environment.yml 2>/dev/null
検出されたバージョンが 1.4.1 / 1.4.2 / 1.4.3 のいずれか だったら、対応必要。
pip show durabletask
# Version: 1.4.x なら侵害バージョンの可能性
# 過去のキャンペーンで使われた典型的なドロップ先
ls -la /tmp/*.pyz 2>/dev/null
# 持続化されたサービス
systemctl list-units --type=service 2>/dev/null | grep -iE "pgsql-monitor|pgmonitor"
# Python の .pth ファイル経由の永続化
find ~/.local/lib /usr/local/lib -name "*.pth" -newer /tmp -exec ls -la {} \; 2>/dev/null
GitHub Actions / Azure DevOps Pipelines / GitLab CI で:
pip install durabletask を実行したワークフローpython3が/proc/*/memを読んだ形跡(Runner.Worker メモリスクレイピング)User-Agent: python-requests/2.31.0 で api.github.com への異常なPOST最悪のシナリオを前提に動く。「たぶん大丈夫」は通用しない。
即座にローテーション
~/.aws/credentials、IAMコンソールで失効 + 新規発行)az loginからやり直しgcloud auth revokeしてから再認証npm token list / PyPI APIトークン~/.ssh/配下全部、authorized_keys のローテーションも~/.claude.jsonを削除して再ログインマシン側
durabletaskを安全版にダウングレード:
pip uninstall durabletask
pip install "durabletask<1.4.1" # 安全版を確認してから
.venv、__pycache__、node_modulesを全削除して再構築.claude/settings.json、.vscode/tasks.json、.github/workflows/*.ymlに身に覚えのない変更がないかgit diff仮想通貨
過去のShai-Hulud侵害は、検知から削除まで 約94分 で完了したこともあった。94分。コーヒー2杯分の時間で、AWS鍵もAzureトークンもGCPキーも全部抜かれる。
人間が反応できる速度ではない。仕組みで防ぐしかない。
curl -fsSL https://github.com/AikidoSec/safe-chain/releases/latest/download/install-safe-chain.sh | sh
Safe Chainには 48時間ルール がある。公開から48時間以内のパッケージは自動的に1つ前の安全版に差し替え。durabletask 1.4.1の侵害ウィンドウもこれで防げた可能性が高い。npm / pip / uv / poetry / pnpm / pnpx / npx に対応。
# uv (推奨)
uv pip compile --exclude-newer 2026-05-15 requirements.in -o requirements.txt
# pip v26+
pip install --uploaded-prior-to 2026-05-15T00:00:00Z -r requirements.txt
新しすぎるパッケージは自動的に除外される。
AIエージェントに勝手に依存を追加させないルールを明文化:
## 依存関係のルール
- requirements.txt / pyproject.toml を編集する前に必ず確認を求める
- pip install / uv add を自動実行しない
- 新規依存パッケージは公開から48時間以上経過しているか確認する
これだけで、AIエージェント経由の自動感染リスクが大きく下がる。
# 悪い例(タグは攻撃者が書き換えられる)
- uses: actions/checkout@v4
# 良い例(コミットハッシュは変えられない)
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.2.2
Checkmarx侵害でも actions-cool/issues-helper侵害でも、タグ単位の参照が攻撃面だった。
permissions: を明示してデフォルトのwrite-allを回避aws-actions/configure-aws-credentials@<sha>)に切り替え、長期キーをやめるこれらは durabletask とは独立の汎用対策だが、今回のような侵害が起きたときの「血を流さない」設計に直結する。
5月19日のdurabletask侵害は、TeamPCPが Microsoftの公式PyPIパッケージにまで手を伸ばした ことを示している。「Microsoft公式だから安全」「PyPIの実績パッケージだから安全」という前提は、もう成り立たない。
特に Azure Durable Functions で実運用しているチーム、AWSとAzureを併用しているチームは、今すぐ:
pip show durabletaskでバージョン確認--exclude-newer を導入して、次の94分に備えるそして来週の自分が今週より少し安全であるために——Safe Chain でも CLAUDE.md のルールでも何でもいい、仕組みで防ぐ手 を1つ入れてほしい。94分は、人間が判断するには短すぎる。
そしてもう一度——あなたは今朝、pip install しましたか?
参考
関連記事
Aikido Community Japan
公開日: 2026/5/20
最終更新: 2026/5/19
セキュリティの最新情報をお届けします。