リモート開発環境のサプライチェーン攻撃対策

〜 個人の dotfiles 系リポジトリでやった対策 〜

HARUYAMA Seigo (@haruyama)
Cyber-sec+ Meetup vol.9 / 2026-06-18

いままでの環境の危うさ

  • 開発環境を make 一発 で全自動セットアップ
  • その裏で大量のツールを ダウンロードして実行 している
    • npm / go install / cargo / pipx / uv / curl | bash
  • 取得元やパッケージが汚染されたら?
    • 開発環境(=鍵も認証情報もある)が即陥落
  • 近年の現実
    • ソフトウェアサプライチェーン攻撃が猛威を奮っている

リポジトリの攻撃面

https://github.com/haruyama/Settings

経路
npm global textlint / prettier / codex / gemini-cli …
go install gopls / golangci-lint / pinact / k9s
cargo / pipx / uv mcat / pyright / flake8
curl | bash asdf / uv / rustup / claude install.sh
NeoVim プラグイン git の HEAD を追従

どれも「最新を取ってきて実行」がデフォルトだった → ここを塞ぐ

方針 = 4 本の柱

  1. 固定 (Pin) — 何を入れるか曖昧にしない
  2. 検証 (Verify) — 取得物のハッシュを確認する
  3. 待つ (Cooldown) — 公開直後の版を踏まない
  4. 自動追従 (Renovate) — 固定を腐らせず安全に更新する

① 固定 — すべてバージョン指定

  • Makefile: FOO_VERSION := vX.Y.Z で全ツール固定
  • .tool-versions / .default-npm-packagesname@version
  • 「latest」を使わないnpx <pkg> を無指定で叩かない
  • NeoVim プラグインは commit SHA で固定
# renovate: datasource=go depName=github.com/derailed/k9s
K9S_VERSION := v0.51.0

② 検証 — ハッシュで取得物を確認

curl | bash をやめ、DL → ハッシュ照合 → 実行

curl -fsSL -o $$tmp https://claude.ai/install.sh && \
  echo "$(CLAUDE_INSTALL_SCRIPT_SHA256)  $$tmp" | sha256sum -c - && \
  bash $$tmp
  • asdf / uv / rustup も同様に SHA256 を固定して照合
  • go install手動ハッシュ不要 — Go が公式チェックサムDB
    (sum.golang.org) で全モジュールの改竄を自動検証
  • cargo install --locked で lockfile のハッシュを尊重

③ 待つ — Cooldown + 信頼できる入口

  • npm .npmrc: min-release-age=3 (公開後 3 日は入れない)
  • uv uv.toml: exclude-newer = "3 days"
  • Renovate: minimumReleaseAge: '3 days'

汚染版が yank される前に踏む のを防ぐ時間稼ぎ

④ 自動追従 — pin を腐らせない

固定は「更新されない=脆弱性が残る」リスクと裏表

  • Renovate の custom managers が comment 駆動で全 pin を追跡
  • 1 更新 = 1 PR → 差分をレビューしてからマージ

まとめ

  • ソフトウェアサプライチェーンにとって今は過渡期と思われる
  • やりやすい部分をやってみた
  • やれてないこともある
    • ブラウザ拡張など