月間110万ダウンロードのPyPI パッケージ「elementary-data」が改ざん-機密情報漏洩の恐れ

セキュリティニュース

投稿日時: 更新日時:

月間110万ダウンロードのPyPI パッケージ「elementary-data」が改ざん-機密情報漏洩の恐れ

2026年4月24日22:20:47(UTC)、データパイプライン観測ツール「elementary-data」のPyPI上の最新版(0.23.3)に情報窃取マルウェア(インフォスティーラー)が仕込まれていることが判明しました。月間ダウンロード数は110万件以上に達する人気パッケージです。

セキュリティ企業StepSecurityの調査報告によれば、攻撃者はパッケージメンテナーのアカウントを直接侵害したのではなく、GitHub ActionsのCI/CDワークフローに存在するスクリプトインジェクション脆弱性を悪用し、正規のリリースパイプラインを乗っ取ってトロイの木馬版をPyPIおよびGitHub Container Registry(GHCR)の両方に公開しました。

コミュニティメンバーcrisperikが2026年4月25日にGitHubのIssue #2205で通報し、メンテナーが問題を確認・対応。悪意ある0.23.3はPyPIから削除され、クリーンな代替版0.23.4が公開されました。ただし悪意ある版をインストールした環境は引き続き侵害された状態にあります。

この記事のサマリー

  • 月間110万ダウンロードのelementary-data0.23.3(2026年4月24日22:20 UTC公開)にインフォスティーラーが仕込まれました
  • 攻撃者はメンテナーアカウントを侵害せず、GitHub ActionsのPRコメントに悪意あるコードを埋め込む「スクリプトインジェクション」という手法でGITHUB_TOKENを奪取し、正規のリリースパイプラインを乗っ取りました。
  • Dockerイメージにも同様のペイロードが到達しており、:latestタグを使用していたすべての環境が影響を受けました。
  • インフォスティーラーの窃取対象はSSH鍵・AWS/GCP/Azure認証情報・Kubernetes・Dockerシークレット・.envファイル・暗号資産ウォレット(Bitcoin・Ethereum・Solanaなど)・シェル履歴と極めて広範です。
  • 特にバージョンを固定(ピン固定)せずpip install elementary-dataまたはdocker pull ghcr.io/elementary-data/elementary:latestを実行していた環境は自動的に悪意ある版を取得しています。
  • クリーンな0.23.4への更新に加え、すべてのシークレット・認証情報のローテーションが必要です。

elementary-dataとは

elementary-dataはdbt(Data Build Tool)エコシステム向けのオープンソースのデータ観測(Data Observability)ツールです。データパイプラインの品質監視・異常検知・テスト結果の可視化を行うツールとして、データエンジニア・アナリティクスエンジニアを中心に広く採用されています。PyPIでの月間ダウンロード数は110万件以上に達しています。

攻撃の仕組み

ステップ1:PRコメントに悪意あるコードを埋め込む

攻撃者は2日前に作成されたばかりのGitHubアカウントrealtungtungtungsahurを使用し、プロジェクトのオープン中のPRにコメントを投稿しました。脆弱なワークフロー.github/workflows/update_pylon_issue.ymlは、コメント本文を${{ github.event.comment.body }}という式でシェルスクリプトに直接展開する「テキストブックのスクリプトインジェクション脆弱性」を持っていました。

2026年4月24日22:10:14(UTC)にコメントがワークフローを起動すると、ランナーはリポジトリのGITHUB_TOKENのスコープ内でハンドラジョブを実行し、攻撃者のcurl | bashステージャーを即座に実行しました。

ステップ2:正規ボットとして署名付きコミットを偽造

GITHUB_TOKENを取得した攻撃者は、github-actions[bot]の名義で偽のコミット(b1e4b1f3)を作成しました。コミットメッセージには9日前の正規PRタイトルrelease/v0.23.2 (#2188)をそのまま使用し、v0.23.3タグを付与。Pythonのpyproject.tomlのバージョンを0.23.3に変更するとともに、インフォスティーラーを含むelementary.pthファイルを追加しました。このコミットにはGitHubの「Verified」PGP署名が付与されており、一見すると正規のリリースと区別がつきません。

注目すべきは、最初のhandle_commentジョブが2時間46分間「実行中」の状態を維持しながら最終的に「失敗」で終了した点です。この間に残りの攻撃ステップが正規パイプラインを通じて完了しました。

ステップ3:正規のリリースパイプラインを起動してPyPIとGHCRに公開

偽造コミットとv0.23.3タグが配置されると、正規のRelease packageワークフローが起動しました。このワークフローはPyPIへのパッケージアップロードと同時にbuild-and-push-docker-imageジョブも実行するため、悪意あるPyPIパッケージとDockerイメージの両方が正規のリリースプロセスを通じて公開されました。

GitHub Releases上での偽造リリースのタイトルはdsajdkjsajkdsajk、本文はdsakdjsakjdjsaというランダムな文字列でしたが、PyPI・GHCRへの配信は正規パイプライン経由のため自動的に「公式リリース」として扱われました。


ペイロードの技術的詳細

elementary.pthファイルに含まれる約245KBのBase64エンコードされたペイロードは、XOR暗号を2段階で使う難読化が施されています。Pythonは.pthファイルをインタープリタ起動時に自動的に実行するため、import elementaryをしなくても、当該パッケージがインストールされた環境でPythonを呼び出すだけでペイロードが実行されます。

窃取対象の情報は以下の通りです。

カテゴリ 具体的な窃取対象
ID・認証情報 すべてのSSH秘密鍵・~/.git-credentialsgh auth token
AWS 認証情報ファイル+IMDSv2 APIからのロール取得+Secrets Manager・SSM Parameter Storeへの直接API呼び出し
GCP・Azure application_default_credentials.json~/.azure
コンテナ・K8s ~/.docker/config.json~/.kube/config・ServiceAccountトークン・kubectl get secrets --all-namespaces
シークレット・トークン .envファイル(深さ6まで)・~/.npmrc~/.pypirc~/.vault-token~/.netrc
暗号資産ウォレット Bitcoin・Litecoin・Dogecoin・Zcash・Dash・Monero・Ripple・Ethereum・Cardano・Solana
システム情報 /etc/passwd/etc/shadow・シェル履歴・/var/log/auth.log

収集されたデータはtrin.tar.gzに圧縮され、https://igotnofriendsonlineorirl-imgonnakmslmao.skyhanni.cloud/(ヘッダーX-Rise-To-The-Trinny: agree付き)にPOSTされます。


Dockerイメージへの影響

特にDockerイメージの影響は深刻です。悪意あるバージョンは0.23.3タグと:latestタグの両方に配信されました。Pythonパッケージのバージョンをロックファイルで固定している組織でも、コンテナイメージにダイジェストやバージョンタグでなく:latestを使用している場合は、2026年4月24日以降に自動的に悪意あるイメージを取得しています。

影響を受けた画像(削除済み)ghcr.io/elementary-data/elementary:0.23.3および:latest(ダイジェスト:sha256:31ecc5939de6...634255

クリーンな画像ghcr.io/elementary-data/elementary:0.23.2(ダイジェスト:sha256:b3bbfafde1a0...35d3d9)および0.23.4以降


今すぐ取るべきアクション

パッケージのアップデートとして、pip install --upgrade elementary-dataを実行して0.23.4以降に更新してください。

すべてのシークレット・認証情報のローテーションとして、elementary-data==0.23.3をインストールしたことがある環境では以下をすべてローテーションしてください。SSHキーペア、AWS IAMのアクセスキー・Secrets Manager内のシークレット、GCP・Azureの認証情報、Kubernetesのシークレット・ServiceAccountトークン、.envファイルやCI/CDのシークレット変数、暗号資産ウォレットのキーが対象です。

Dockerイメージの確認として、Kubernetes・Docker Compose・ArgoCD等でelementary-dataのコンテナを使用している場合は、イメージダイジェストを確認し、sha256:31ecc5939de6...634255と一致する場合は即座に置き換えてください。


開発者・DevSecOps担当者へのポイント

本件が示す最大の教訓は「アカウント侵害なしでもサプライチェーン攻撃が成立する」という点です。

GitHub Actionsのスクリプトインジェクション対策として、${{ github.event.comment.body }}${{ github.event.issue.title }}${{ github.event.pull_request.title }}${{ github.head_ref }}といったユーザー制御可能な入力値をワークフローのrun:ステップに直接展開しないことが基本原則です。これらの値はシェル変数経由($VAR形式)で渡すことで展開を防止できます。

パッケージ・コンテナイメージのバージョン固定として、requirements.txtpoetry.lockDockerfile・K8sマニフェスト等でパッケージバージョンおよびコンテナイメージのダイジェストを明示的に固定(ピン)することが推奨されます。:latestの使用は自動的な悪意あるバージョンの取得リスクを常に持っています。

GITHUB_TOKENの権限の最小化として、ワークフローで使用するGITHUB_TOKENの権限を最小限に絞り、pull-requests: writecontents: write等の権限を不必要なジョブに付与しないことが重要です。


よくある質問(FAQ)

Q. 0.23.3をインストールしたか確認するにはどうすればいいですか? pip show elementary-dataでバージョンを確認してください。0.23.3と表示された場合は直ちに対応が必要です。過去のインストール履歴はpip install --verboseのログやpip listの履歴から確認できます。

Q. クリーンな0.23.4に更新すれば安全ですか? パッケージの更新は必要ですが、それだけでは不十分です。0.23.3が一度でもインストールされた環境では、ペイロードがPythonの起動時に実行された可能性があります。すべてのシークレット・認証情報のローテーションが必要です。

Q. Dockerイメージを:latestタグで使用していた場合は? 2026年4月24日〜25日の間にDockerイメージを取得・実行していた場合は影響を受けている可能性があります。現在は:latestタグはクリーンな0.23.4に更新されていますが、その期間中に取得したイメージを継続使用している場合は即座に置き換えてください。

Q. このような攻撃を防ぐにはどうすればいいですか? GitHub ActionsのスクリプトインジェクションはStepSecurityのHarden-Runner等のツールで検出できます。また、OpenSSF Scorecardによるサプライチェーンセキュリティスコアの定期確認も有効です。


参考情報