---
title: version pinningでサプライチェーン攻撃対策
tags: 
author: [takaram](https://image.docswell.com/user/takaram)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/PJXQQ5837X.jpg?width=480
description: Kansai Dev Garage セキュリティ勉強会 https://kansai-web-app-dev.connpass.com/event/391264/ で発表したスライドです
published: May 03, 26
canonical: https://image.docswell.com/s/takaram/KE1LLD-version-pinning-supply-chain-attack
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/PJXQQ5837X.jpg)

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


# Page. 2

![Page Image](https://bcdn.docswell.com/page/3JK996KNJD.jpg)

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


# Page. 3

![Page Image](https://bcdn.docswell.com/page/LE3WW6ZZE5.jpg)

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


# Page. 4

![Page Image](https://bcdn.docswell.com/page/8EDKKVR47G.jpg)

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


# Page. 5

![Page Image](https://bcdn.docswell.com/page/V7PKKVWVJ8.jpg)

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


# Page. 6

![Page Image](https://bcdn.docswell.com/page/2JVVVZ8RJQ.jpg)

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


# Page. 7

![Page Image](https://bcdn.docswell.com/page/5EGLL456JL.jpg)

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


# Page. 8

![Page Image](https://bcdn.docswell.com/page/4JQYYGZ27P.jpg)

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


# Page. 9

![Page Image](https://bcdn.docswell.com/page/K74WW53PE1.jpg)

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


# Page. 10

![Page Image](https://bcdn.docswell.com/page/LJ1YYW1XEG.jpg)

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


# Page. 11

![Page Image](https://bcdn.docswell.com/page/GJWGG68K72.jpg)

対策


# Page. 12

![Page Image](https://bcdn.docswell.com/page/4EZLLY8N73.jpg)

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


# Page. 13

![Page Image](https://bcdn.docswell.com/page/Y76WWDP97V.jpg)

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


# Page. 14

![Page Image](https://bcdn.docswell.com/page/G75MM3KD74.jpg)

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


# Page. 15

![Page Image](https://bcdn.docswell.com/page/9J299Z6MER.jpg)

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


# Page. 16

![Page Image](https://bcdn.docswell.com/page/DEY44R9PJM.jpg)

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


# Page. 17

![Page Image](https://bcdn.docswell.com/page/VJNYYDLM78.jpg)

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


# Page. 18

![Page Image](https://bcdn.docswell.com/page/YE9PPG4WJ3.jpg)

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


# Page. 19

![Page Image](https://bcdn.docswell.com/page/GE8DDVQRED.jpg)

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


# Page. 20

![Page Image](https://bcdn.docswell.com/page/LELMM5X27R.jpg)

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


# Page. 21

![Page Image](https://bcdn.docswell.com/page/4JMYY3L9JW.jpg)

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


# Page. 22

![Page Image](https://bcdn.docswell.com/page/PJR99QK979.jpg)

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


# Page. 23

![Page Image](https://bcdn.docswell.com/page/PEXQQ5L3JX.jpg)

参考資料
●
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


# Page. 24

![Page Image](https://bcdn.docswell.com/page/3EK996LNED.jpg)

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


# Page. 25

![Page Image](https://bcdn.docswell.com/page/L73WW63Z75.jpg)

参考資料
●
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


