Upgrade to Pro — share decks privately, control downloads, hide ads and more …

インシデント事例と
パッケージの全量解析に学ぶ
ソフトウェアサプライチェーンの守り方 / su...

インシデント事例と
パッケージの全量解析に学ぶ
ソフトウェアサプライチェーンの守り方 / supply-chain-attack-defense

Avatar for GMO Flatt Security

GMO Flatt Security

July 22, 2026

More Decks by GMO Flatt Security

Other Decks in Technology

Transcript

  1. 自己紹介 山川 大貴 @dai_shopper3 GMO Flatt Security(株) イネーブルメントプラット フォーム部 ソフトウェアエンジニア

    2021年、Flatt Security(現・GMO Flatt Security) に新卒入社 セキュリティエンジニアとして、多数のWebアプリ ケーション診断やFirebase診断に従事 現在はソフトウェアサプライチェーン領域で
 パッケージ全量解析基盤の開発・研究を牽引 © 2026 GMO Flatt Security Inc. All Rights Reserved.
  2. 直近のソフトウェアサプライチェーン侵害の概観 2025〜2026 にかけて事案は連続し、攻撃の質も変わってきている 侵入経路は毎回異なるが、狙いは開発者のクレデンシャルで共通 2026/4 2025/3 reviewdog・tj-actions @bitwarden/cli GitHub Actions

    の侵害 Trusted Publishing の悪用 2026/3 axios / LiteLLM / Telnyx publish 権限の奪取 2026/5 Laravel-lang git タグの書き換え 2026/4〜6 2026/6 Mastra Shai-Hulud 系 亜種・模倣が拡散 国家系の関与疑い 本日深掘り (例: Miasma / Hades) © 2026 GMO Flatt Security Inc. All Rights Reserved.
  3. 本日深掘りする事案: Mastra 侵害の概要 Mastra 関連パッケージが侵害され、端末を狙う RAT が仕込まれた Microsoft は本件を国家系アクター Sapphire

    Sleet に帰属(axios 侵害と同一グループ) 発生時期 侵入経路 約 5 時間後に npm から除去 140+ パッケージに RAT: 遠隔から 悪性依存を注入 任意コマンド実行 2026/6/17 検体構成 npm アカウント dropper→RAT 乗っ取り 端末に常駐 主たる標的 開発者端末の クレデンシャル クラウド・CI・ ウォレット等 出典: Microsoft Security Blog (2026/6/17), mastra-ai/mastra#18045 © 2026 GMO Flatt Security Inc. All Rights Reserved.
  4. Mastra: 攻撃チェーンの全体像 乗っ取りから永続化まで、6 ステップで開発者端末に到達している install される前(利用者には正規の更新に見える) 1 乗っ取り 2 準備

    6 永続化 5 RAT 3 注入 npm アカウントを dayjs を騙る 奪取する easy-day-js を用意 install してから(利用者の環境で発火) package.json に 依存を 1 行追記 再起動後も 残り続ける install 時に 自動で起動する 常駐して端末の 認証情報を窃取 4 dropper © 2026 GMO Flatt Security Inc. All Rights Reserved.
  5. 攻撃が刺さる面その1: 受け入れ時(dependency) install だけで、推移的依存を含めてコードが自動実行される 本講演ではここを「受け入れ面」と呼ぶ install しただけで lifecycle script が走る。npm

    install は推移的依存の分まで実行する 依存ツリーのどこか1つの侵害で、端末や CI で任意コードが動く axios も Mastra もこの自動実行が侵害点だった # package.json "scripts": { "postinstall": "node setup.js" ← install しただけで実行される } © 2026 GMO Flatt Security Inc. All Rights Reserved.
  6. 攻撃が刺さる面その2: 実行環境(CI/CD) 同種の攻撃は、publish や実行を担う CI/CD パイプラインも狙う 本講演ではここを「実行面」と呼ぶ @bitwarden/cli は publish

    workflow が改変され、Trusted Publishing の正規フローに
 乗って悪性版が公開された TanStack は workflow 未改変で、pull_request_target の Pwn Request から実行中の CI の OIDC トークンを奪取して公開された CI/CD 環境が侵害されると、設定されている本番権限や secrets がそのまま攻撃者に渡る © 2026 GMO Flatt Security Inc. All Rights Reserved.
  7. なぜ同じ侵害が繰り返されるのか 4 つの構造的条件が、攻撃を再現可能で経済的にしている 1 install 時の自動実行 2 牧歌的な依存管理 3 高い攻撃の経済性

    4 連鎖的な波及 依存を入れただけでコードが走る 仕組みが標準として存在する 人気パッケージを 1 つ侵害するだけで 利用者全体へ一度に届く 最新版をそのまま引き込む運用が残り 受け入れ時の審査がほぼない 推移的依存解決を介して波及し 直接使っていない組織にも及ぶ © 2026 GMO Flatt Security Inc. All Rights Reserved.
  8. AI エージェントが依存を選ぶ時代へ コーディングエージェントが依存の選定から install までを代行し始めている 開発生産性が上がるほど、受け入れ面の判断は無人化していく 従来 開発者 調べて選ぶ 確認する

    ✓ 人の目が挟まる install 提案と選定を代行 確認 install AI エージェント時代 コーディング エージェント 挟まりにくい AI が実在しない名前を勧め、攻撃者が先回りで登録していた(slopsquatting) © 2026 GMO Flatt Security Inc. All Rights Reserved.
  9. 第1部まとめ: リスクは2つの面に集約される 攻撃が成立するのは「受け入れ時(dependency)」と「実行時(CI/CD)」の2面 面 1・受け入れ時(dependency) 面 2・実行時(CI/CD) 例: axios /

    @bitwarden/cli / Mastra 例: @bitwarden/cli / TanStack / reviewdog 依存を入れた瞬間にコードが自動で走る lifecycle script が発火点になる 推移的な依存の分まで実行される infostealer が端末クレデンシャルを狙う → 備え: 受け入れの瞬間に止める層 publish や実行のパイプラインが狙われる Trusted Publishing や pull_request_target を悪用する 本番権限と secrets を握り被害が広がる → 備え: 実行時の挙動を可視化する層 この2面が、後半で示す備えの軸になる © 2026 GMO Flatt Security Inc. All Rights Reserved.
  10. 全量リアルタイム解析とは 1件を調べるのではなく、publish される全バージョンを検査している 週次スキャンではなく、publish された瞬間に検査が走る レジストリ 全量解析 npm 静的解析 メタデータ

    / 実コード PyPI リアルタイム 既知の悪性パターン検出 取り込み RubyGems イベントを逐次処理 動的解析 Packagist サンドボックス実行 Go Modules 通信・プロセス挙動 判定 allow block 正常 悪性 © 2026 GMO Flatt Security Inc. All Rights Reserved.
  11. どれだけ見ているか 毎日 約 12 万バージョン (※直近 30 日平均) 累計 約

    2,100 万バージョンを検査(2026/7 時点) この母数を常時見ているから、個別事案では見えない分布が見える 同じ理由で、点と点の繋がりも見える 日次 publish バージョン数(緑 = 週末帯 / 直近 30 日) 平均 約 12 万 / 日 15 万 10 万 5万 0 6/6 6/13 6/20 6/27 7/4 © 2026 GMO Flatt Security Inc. All Rights Reserved.
  12. 定番の型の上で、攻撃は進化している 攻撃の手口はテンプレート化し、その上でさらに新しい型が観測されている 定番の型(これまで) typosquat lifecycle dropper infostealer RAT(常駐型) 誤インストールを狙う install

    で第一段を起動 最近の観測(進化の最前線) 進化 認証情報を持ち出す Mastra が該当 常駐して遠隔操作 発火点の多様化 build 時 / import 時 / IDE で開いた瞬間にも発火 例: Miasma / Hades 信頼チェーンの悪用 OIDC / SLSA を突破し「正規ビルド」として発行 例: IronWorm / Hades カーネルレベルの隠蔽 eBPF ルートキットで /proc や通信を隠す 例: IronWorm © 2026 GMO Flatt Security Inc. All Rights Reserved.
  13. 点が線になる その1: 同一インフラの共有 無関係に見える複数パッケージが、同じ C2 や持ち出し先を共有していることがある Mastra でも、1ヶ月前から同じ C2 に接続する先行パッケージが公開されていた

    @iconifi/react 5/19 公開・typosquat tiny-naturalsort 5/27 公開・ユーティリティ装い 同一 C2 インフラ 実ホスト名は非公開 easy-day-js 6/17 悪性版・Mastra に注入 © 2026 GMO Flatt Security Inc. All Rights Reserved.
  14. 点が線になる その2: 公開順序とワーム拡散 攻撃者はレビュー回避のため publish の順序を設計し、拡散も時系列で進む easy-day-js も、無害版の公開から約半日後に悪性版が公開されていた 公開順序の設計 依存

    良性に見える B 馴染ませておく t1 先に公開 ワームの自己伝播 悪性版 A B に依存して公開 t2 後から公開 A だけ見ると、B は普通の依存に見える 時系列を全量で見ると、繋がりが見える 侵害された パッケージ 別パッケージ … 別パッケージ … 盗んだ token で次のパッケージへ広がる 全量+リアルタイムで伝播の波が見える © 2026 GMO Flatt Security Inc. All Rights Reserved.
  15. 例: leo-logger の発火チェーン 静的スキャンが見るのは発火まで。実行を追うと、常駐バックドアまで捉えられる 我々がサンドボックス上で実際に走らせて確認した挙動 静的スキャンが見える範囲 install binding.gyp 発火 npm

    i leo-logger ビルド時に実行 実行しないと見えない範囲 認証情報を窃取 常駐スクリプト AWS / SSH / PAT 等 GitHub を悪用 © 2026 GMO Flatt Security Inc. All Rights Reserved.
  16. leo-logger は GitHub を指令サーバ(C2)に使う 被害者マシン 常駐スクリプトが 毎時ポーリング 検索 取得 GitHub

    コミット検索 api.github.com/search q = firedalazer 攻撃者 合言葉つきコミットを リポジトリに push firestorm <URL(base64)>.<RSA署名> 1. RSA 署名を検証(秘密鍵を持つ攻撃者だけが命令を出せる) 2. base64 の URL からペイロードを取得して実行する 3. 正規サービス経由のため既知の C2 リスト・DNS ブロックに載らない © 2026 GMO Flatt Security Inc. All Rights Reserved.
  17. 全量解析から言えること 攻撃は量産され、繋がり、公開と同時に来る 01 型で量産される 母数が多すぎて 人手の審査は回らない 02 キャンペーンに連結する 横断して見ないと 繋がりに気づけない

    03 公開と同時に到来する 公式アドバイザリ待ちでは 間に合わない 人の注意力に依存せず、自動で効く層を「受け入れの瞬間」に置く © 2026 GMO Flatt Security Inc. All Rights Reserved.
  18. 備えの全体像 2つの面に、影響最小化と発生機会縮小の2原則で層を重ねる 銀の弾丸はない。一般策を層で重ねる。 面 1・受け入れ時(dependency) 面 2・実行時(CI/CD) 例: axios /

    @bitwarden/cli / Mastra 例: @bitwarden/cli / TanStack / reviewdog 依存を入れた瞬間にコードが自動で走る lifecycle script が発火点になる 推移的な依存の分まで実行される infostealer が端末クレデンシャルを狙う → 備え: 受け入れの瞬間に止める層 publish や実行のパイプラインが狙われる Trusted Publishing や pull_request_target を悪用する 本番権限と secrets を握り被害が広がる → 備え: 実行時の挙動を可視化する層 © 2026 GMO Flatt Security Inc. All Rights Reserved.
  19. 受け入れ時: Dependency Cooldown 公開直後のバージョンを数日避けるだけで、多くの侵害は引き込まずに済む # npm (.npmrc) min-release-age=7 # Python

    (uv) uv add --exclude-newer "7 days" <pkg> 大きな侵害は誰かが気づいてくれる。これに頼って最新を急がない ただし長期潜伏検体もあり、待てば安全とは限らない 緊急パッチとのトレードオフは運用で調整する 例えば「7日未満は使わない」を組織のルールにし、テンプレートや CI で強制する © 2026 GMO Flatt Security Inc. All Rights Reserved.
  20. 受け入れ時: 自動実行の停止と不変参照 install 時の自動実行を止め、参照を不変に固定するだけで攻撃面が減る npm install --ignore-scripts # 自動実行を止める npm

    approve-scripts # npm 12 は既定でオフ・承認制 - uses: actions/checkout@<sha> # SHA で固定 npm ci # lockfile で再現 n pm 12 で、install スクリプトも binding.gyp の node-gyp ビルドも既定で無効になった tag や latest ではなく commit SHA / hash に固定し、lockfile で再現性を担保する ただし発火点は import / IDE へも広がり、install 側の対策だけでは塞ぎきれない © 2026 GMO Flatt Security Inc. All Rights Reserved.
  21. 受け入れ時: キュレーション層を挟む 公式レジストリ直アクセスではなく、悪性パッケージを検査・遮断する層を間に置く これは一般的な防御の型。そういったサービスを提供している中の一つが Takumi Guard # レジストリを差し替えるだけ npm config

    set registry https://npm.flatt.tech/ # 対応: npm / PyPI / RubyGems / Go / Packagist レジストリと自社の間に検査層を挟み、悪性パッケージを到達前に止める ブロックリストは第2部で見せた全量解析が作り、Takumi Guard がそれを元にブロックする レジストリ設定なので、人にもエージェントにも同じように効き、開発を止めない MDM で配れば全端末に行き渡り、インストールログで「取り込んだのか」に答えられる © 2026 GMO Flatt Security Inc. All Rights Reserved.
  22. 実行時: 影響範囲を絞る 侵害が起きても被害が広がらない構造を、平時から作っておく 対策 ビルドとデプロイを分離する キーレスフェデレーション(OIDC) devcontainer / fence /

    docker 端末のシークレット散在を最小化 効果 ビルド侵害が本番に直結しない 長期 secret 漏洩のルートを消す install・開発時の被害を sandbox に閉じ込める 端末侵害時の流出量を減らす © 2026 GMO Flatt Security Inc. All Rights Reserved.
  23. 実行時: 監視の死角は CI/CD 侵害に気づき、後から調べる監視の目。CI/CD だけが死角 端末 クラウド本番 CI/CD EDR 等

    GuardDuty 等 トレースが取りづらい 開発者の PC 気づいて調査できる 監視あり AWS などの実行環境 既知の脅威に気づける 監視あり GitHub Actions 何が起きたか追えない 監視の死角 © 2026 GMO Flatt Security Inc. All Rights Reserved.
  24. 2層の備えまとめ 受け入れ面と実行面、それぞれに開発を止めない層を重ねる 面 受け入れ dependency 実行 CI/CD 重ねる対策 Cooldown ・

    ignore-scripts ・ SHA pinning / lockfile キュレーション層 → Takumi Guard ビルドとデプロイの分離 ・ OIDC ・ サンドボックス隔離 → Takumi Runner 挙動の可視化 © 2026 GMO Flatt Security Inc. All Rights Reserved.
  25. 対策の土台: SSC 診断の攻撃シナリオ例 STEP1 侵 害 公開パッケージ シ ナ の侵害

    リ オ 対 策 例 STEP2 STEP3 侵害された パッケージの
 インストール 悪意ある コードの実行 依存パッケージの監視 ロックファイルの固定 install スクリプトの 無効化 STEP4 STEP5 デプロイトークン
 経由で本番環境に
 到達 CIジョブの secretsの窃取 GitHub PAT経由で ソースコード 改ざん 外向き通信の遮断 / 監視 ジョブ環境の隔離 トークン権限の最小化 / 有効期限の管理 監査ログによる検知 © 2026 GMO Flatt Security Inc. All Rights Reserved.