version pinningでサプライチェーン攻撃対策

-- Views

May 03, 26

スライド概要

Kansai Dev Garage セキュリティ勉強会 https://kansai-web-app-dev.connpass.com/event/391264/ で発表したスライドです

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

version pinning でサプライ チェーン攻撃対策 Kansai Dev Garage セキュリティ勉強会 荒巻拓哉 (@takaram71)

2.

自己紹介 ● 荒巻拓哉 ● X: @takaram71 GitHub: @takaram ● バックエンドエンジニア ● PHP, TypeScript

3.

今日話すこと ● 最近のサプライチェーン攻撃 ● サプライチェーン攻撃を防ぐ対策

4.

サプライチェーン攻撃が多発 ● 依存パッケージ、GitHub Actions、Docker image等の 汚染 ● 踏んでしまうと情報漏洩、不正コード実行、etc.

5.

事例: Nx / s1ngularity ● 2025年8月26日、Nx関連パッケージに悪意ある版が公 開 ● GitHub Actionsのinjection vulnerability経由で npm tokenが窃取 ● 悪意ある版は約4時間公開され、機密情報を探索して送信

6.

事例: Shai-Hulud ● 2025年9月、npm ecosystemで自己増殖型攻撃が発 生 ● 侵害された開発者アカウントから他パッケージへ連鎖 ● install 時に動くコードがCI secretsを狙う ● 踏むと1つの侵害が複数パッケージへ波及しうる

7.

事例: Axios ● 2026年3月31日、[email protected] と 0.30.4 に悪意あ る版 ● maintainer account経由で公開され、悪意ある依存が 注入

8.

事例: tj-actions/changed-files ● 2025年3月、tj-actions/changed-files が侵害 ● 既存のバージョンが置換された ● 悪意あるコードがsecretsをログへ出力

9.

事例: Trivy ● 2026年3月、Trivy関連のrelease / Action / image が侵害 ● 既存のversion tagが悪意あるcommitへ置き換えられた ● GitHub ActionsとDocker imageの両方が攻撃経路に なった

10.

最近の事例に共通すること ● 攻撃コードを含む新しいバージョンが公開 or 既存バージョ ンが置換 ○ npmパッケージの変更は公開後3日以内 ○ GitHubやDocker Hubは上書き可能 ● 多くは数時間~数日で発見・対処 ● それでもタイミング次第で踏んでしまう

11.

対策

12.

問題の本質は可変参照 ● ● ● ● ● "react": "^19.2.0" - uses: actions/checkout@v6 FROM node:24 固定に見えても、実体は後から変わりうる 「知らないうちに変わる」が攻撃の入口になる

13.

可変参照がなぜ危ないか ● 問題は、CI/CDが可変参照をその場で解決していること 対象 pinning方法 npm / Composer 解決結果がその時点で変わる GitHub Actions tag / branchの指すcommitが変わる Docker image tagの指すdigestが変わる

14.

version pinning とは ● 実行する外部コードを、後から勝手に変わらない参照で固 定 対象 pinning方法 パッケージマネージャ lockfile / install系コマンド GitHub Actions full-length commit SHA Docker image image digest

15.

パッケージマネージャ: lockfile で固定 ● lockfileをcommitし、CIでは更新系ではなくinstall系コ マンドを使用 ○ package-lock.json / pnpm-lock.yaml / composer.lock など ● lockfileに記録された依存ツリーを再現 ● 依存更新は通常のビルドやdeployから分離

16.

lockfileの検証情報はツールごとに少し違う ● ツールによって検証情報の強さやデフォルト設定が異なる ● 「CIで毎回再解決しない」は共通して重要 ツール チェックサム系 メモ npm ○ integrity を記録 pnpm ○ npm系のintegrity情報を利用 Composer △ Packagist経由のshasumは空が多い Bundler △ 2.6で追加、4.0でデフォルトON uv ○ uv.lock と uv sync --locked を使用

17.

GitHub Actions: commit SHA で固定 Before: - uses: actions/checkout@v6 After: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f54 47ce83dd # v6 ● @v6や@mainを回避 ● full-length commit SHAで実行内容を固定

18.

Docker image: digest で固定 Before: FROM node:24 After: FROM node:24@sha256:... ● tagは人間向け、digestは実体固定用 ● GitHub Actionsのcontainer:やservices:も対象

19.

pinact でGitHub Actionsのpinning運用 https://github.com/suzuki-shunsuke/pinact ● uses:をcommit SHAへ固定可能 ● CIで未pinのActionを検出可能 ● 更新はRenovate / dependabot等で

20.

dockerfile-pin でdigest pinningを自動化 https://github.com/azu/dockerfile-pin ● Dockerfile / compose.yaml / GitHub Actions内 のimage参照を固定 ● CIで未pinを検出 ● 更新はPRで明示的に流す ● CI設定内のimage参照もpinning対象

21.

まとめ ● 「いつの間にか変わる依存」を「明示的に変更される依存」へ 変換 対象 危ない指定 パッケージマ ネージャ semver range / version lockfile + install系コマンド constraintだけ GitHub Actions tag / branch full-length commit SHA Docker image tag image digest version pinning

22.

pinningで防げないこと ● すでに悪意ある版がlockfileに入っていれば防げない ● 悪意あるcommit SHAやdigestをpinすれば防げない ● maintainer account compromise自体は別対策が必 要 ● secrets最小権限化、MFA、provenance、Trusted Publishingも重要

23.

参考資料 ● Nx postmortem ● CISA: Widespread Supply Chain Compromise Impacting npm Ecosystem ● Unit 42: Shai-Hulud npm supply-chain attack analysis ● Axios postmortem ● Microsoft Security Blog: Axios npm supply chain compromise ● GitHub Advisory: tj-actions/changed-files GHSA-mrrh-fwg8-r2c3 ● tj-actions security advisory GHSA-mw4p-6x4p-x5m5

24.

参考資料 ● GitHub Docs: セキュリティで保護された使用に関するリファレンス ● kakakakakku blog: GitHub Actions のコミットハッシュ指定を Dependabot で更新する ● Zenn: GitHub Actions と pre-commit-config を SHA pinning

25.

参考資料 ● npm Docs: npm ci ● npm Docs: package-lock.json ● pnpm Docs ● Composer Docs: Basic usage ● Bundler Docs: What’s New in v4.0 ● Bundler Docs: bundle lock ● uv Docs: Projects and lockfile ● uv Docs: Locking and syncing