Slide 1

Slide 1 text

pnpmを活用した サプライチェーン攻撃への備え Daichi KUDO (@da1chi24) 多摩.dev #3 at パルテノン多摩

Slide 2

Slide 2 text

● npm パッケージを狙ったサプライチェーン攻撃が増えています ● パッケージマネージャーでは対策に役立つ設定が多いですが、 どのレイヤーに効果があるのか整理しないと分かりにくいです ● ここでは攻撃手順と比較しながら、普段パッケージ利用者の自分が 行っている pnpm (v11.5.2) でできる対策を紹介します ● 他の npm/yarn でも同様の設定はあるので、それらでも適用 できる内容が多いです 今回話すこと

Slide 3

Slide 3 text

自己紹介 ● Daichi KUDO ○ GitHub @kudoas ○ Twitter @da1chi24 ● 興味・関心ごと ○ UI/UX、フロントエンド全般 ○ 開発者体験、Devtools

Slide 4

Slide 4 text

サプライチェーン攻撃のプロセス(例) 1. 公開 危険性なパッケージ のバージョンが公開 される 2. インストール 利用者がパッケージ をインストールする 3. 自動実行 悪意のあるライフ サイクルスクリプト が実⾏される 4. 感染 認証トークンなどの 重要な情報が 外部に送信される パッケージ開発者 パッケージ利⽤者

Slide 5

Slide 5 text

パッケージ利用者が対策できる3つのフェーズ 1. 公開 危険性なパッケージ のバージョンが公開 される 2. インストール 利用者がパッケージ をインストールする 3. 自動実行 悪意のあるライフ サイクルスクリプト が実⾏される 4. 感染 認証トークンなどの 重要な情報が 外部に送信される パッケージ開発者 ライブラリ利⽤者 ①危険性のあるものを インストールしない

Slide 6

Slide 6 text

パッケージ利用者が対策できる3つのフェーズ 1. 公開 危険性なパッケージ のバージョンが公開 される 2. インストール 利用者がパッケージ をインストールする 3. 自動実行 悪意のあるライフ サイクルスクリプト が実⾏される 4. 感染 認証トークンなどの 重要な情報が 外部に送信される ②インストールスクリプ トを実行しない パッケージ開発者 パッケージ利⽤者

Slide 7

Slide 7 text

③認証情報を セキュアに管理する パッケージ利用者が対策できる3つのフェーズ 1. 公開 危険性なパッケージ のバージョンが公開 される 2. インストール 利用者がパッケージ をインストールする 3. 自動実行 悪意のあるライフ サイクルスクリプト が実⾏される 4. 感染 認証トークンなどの 重要な情報が 外部に送信される パッケージ開発者 パッケージ利⽤者

Slide 8

Slide 8 text

パッケージ利用者が対策できる3つのフェーズ 1. 公開 危険性なパッケージ のバージョンが公開 される 2. インストール 利用者がパッケージ をインストールする 3. 自動実行 悪意のあるライフ サイクルスクリプト が実⾏される 4. 感染 認証トークンなどの 重要な情報が 外部に送信される パッケージ開発者 ライブラリ利⽤者 ①危険性のあるものを インストールしない

Slide 9

Slide 9 text

● minimumReleaseAge (デフォルト 1440(分) v11.0.0~) セキュリティ対応されるまでの時間を稼ぐ https://pnpm.io/settings#minimumreleaseage 利用者 バージョン v1.0.0 汚染バージョン v1.0.1 削除 指定時間以上 経過したものを インストール

Slide 10

Slide 10 text

● blockExoticSubdeps (デフォルトtrue v11.0.0~) 推移的依存の参照先が信頼できるかチェック https://pnpm.io/settings#blockexoticsubdeps Package A Package B Package C Package D 信頼しないURL例 git+ssh://... https://.../package.tgz インストール対象

Slide 11

Slide 11 text

● trustPolicy: “no-downgrade” (デフォルト: “off”) リリース元の信頼レベル低下を検知 https://pnpm.io/settings#trustpolicy tear 1 staged publishing 2FA + メンテナー承認 tear 2 trusted publishing OIDCでの認証 tear 3 provenance 誰がいつpublishしたか証跡 tear 4 なし なし リリース元の信頼性レベルのランク 前回のリリース 今回のリリース 2026.6.7時点 pnpmのみ

Slide 12

Slide 12 text

パッケージ利用者が対策できる3つのフェーズ 1. 公開 危険性なパッケージ のバージョンが公開 される 2. インストール 利用者がパッケージ をインストールする 3. 自動実行 悪意のあるライフ サイクルスクリプト が実⾏される 4. 感染 認証トークンなどの 重要な情報が 外部に送信される ②インストールスクリプ トを実行しない パッケージ開発者 パッケージ利⽤者

Slide 13

Slide 13 text

● v10.0.0よりデフォルト ● strictDepBuilds: true で必要なものだけ許可 インストールスクリプトを実行しない https://pnpm.io/settings#strictdepbuilds 設定例

Slide 14

Slide 14 text

③認証情報を セキュアに管理する パッケージ利用者が対策できる3つのフェーズ 1. 公開 危険性なパッケージ のバージョンが公開 される 2. インストール 利用者がパッケージ をインストールする 3. 自動実行 悪意のあるライフ サイクルスクリプト が実⾏される 4. 感染 認証トークンなどの 重要な情報が 外部に送信される パッケージ開発者 パッケージ利⽤者

Slide 15

Slide 15 text

pnpm-workspace.ymlに設定を集約する pnpm v10 pnpm v11~ .npmrc 設定全て auth/registry のみ pnpm-workspace.yml 設定全て auth以外の設定全て .npmrcを.gitignore に含めるのが推奨 https://pnpm.io/blog/releases/11.0#npmrc-is-authregistry-only

Slide 16

Slide 16 text

● .envに直接トークンを書くと流出のリスクがある ○ よくない例: export NPM_TOKEN=ghp_xxxx ● 1passwordなどを用いて認証情報を安全に保存する ○ 1password CLI なら参照するときだけ利用できる ○ NPM_TOKEN=”op://xxx” op run -- pnpm install トークンの平文でローカルに保存しない

Slide 17

Slide 17 text

紹介した対策 1. 公開 危険性なパッケージ のバージョンが公開 される 2. インストール 利用者がパッケージ をインストールする 3. 自動実行 悪意のあるライフ サイクルスクリプト が実⾏される 4. 感染 認証トークンなどの 重要な情報が 外部に送信される minimumReleaseAge blockExoticSubdeps trustPolicy install script停止 strictDepsBuild .npmrcをgit管理しない トークンの脱平文管理

Slide 18

Slide 18 text

紹介した対策 1. 公開 危険性なパッケージ のバージョンが公開 される 2. インストール 利用者がパッケージ をインストールする 3. 自動実行 悪意のあるライフ サイクルスクリプト が実⾏される 4. 感染 認証トークンなどの 重要な情報が 外部に送信される minimumReleaseAge blockExoticSubdeps trustPolicy install script停止 strictDepsBuild .npmrcをgit管理しない トークンの脱平文管理 pnpm v11.0.0より 下線デフォルト有効

Slide 19

Slide 19 text

npm v12 でも同様にサポートされる予定 https://github.blog/changelog/2026-06-09-upcoming-breaking-changes-for-npm-v12/ 2026.6.9

Slide 20

Slide 20 text

● 基本的な防御策は「インストールしない」こと ● pnpm v11で安全に倒すデフォルトが増えた ○ minimumReleaseAge: 1440(分) ○ blockExoticSubdeps: true ○ strictDepBuilds: true ○ インストールスクリプトの無効化 ● 今後さまざまなオプションや対策が増えると思われる まとめ

Slide 21

Slide 21 text

● 企業で進める場合、各チームの全リポジトリで設定を 漏れなく適用するのは大変だと思います。 ● そこで「組織の共通設定を用意し、各リポジトリに 配布する」ということを進めています。 ● まだ私も試行錯誤の段階ですので、上手く進んだら どこかで続きをお話します。 今後の課題

Slide 22

Slide 22 text

● axios ソフトウェアサプライチェーン攻撃の概要と対応指針 - GMO Flatt Security Blog ● pnpm 11.0 ● Settings (pnpm-workspace.yaml) ● Package Managers Need to Cool Down | Andrew Nesbitt ● Staged publishing for npm packages ● Trusted publishing for npm packages ● Mitigating supply chain attacks | pnpm ● サプライチェーン攻撃への防御策 | blog.jxck.io ● Upcoming breaking changes for npm v12 - GitHub Changelog 参考URL