pnpm、GHSA-3qhv-2rgh-x77r(リポジトリ .npmrc の環境変数窃取)
pnpm は、リポジトリにコミットされた .npmrc や pnpm-workspace.yaml 内の ${ENV_VAR} プレースホルダを依存解決時に展開していた。悪意あるリポジトリはレジストリ URL や _authToken にプレースホルダを置き、install スクリプトが走る前に環境変数のシークレットを攻撃者指定のレジストリへ送り出せた。GHSA-3qhv-2rgh-x77r(CVE-2026-55180、Moderate、CVSS 6.5)として修正され、v10.34.2 と v11.5.3 以降ではリポジトリ由来の設定で環境変数展開を行わない。
影響を受けるのは pnpm 10.34.2 未満、および 11.0.0 以上 11.5.3 未満。修正版は 10.34.2 以上 11.0.0 未満、または 11.5.3 以上。攻撃は pnpm install など依存解決だけで成立し、CI_JOB_TOKEN や npm トークンなど推測可能な環境変数名を狙う。リクエスト URL への埋め込み、または Authorization: Bearer ヘッダー経由で漏洩する。
v10.34.2 / v11.5.3 以降、リポジトリ管理下の .npmrc では registry、@scope:registry、プロキシ URL、URL スコープキー(//host/…)、認証値(_authToken、_auth、_password、username、tokenHelper、cert、key)に ${...} が含まれるとその設定は無視され警告が出る。pnpm-workspace.yaml の registry、registries、namedRegistries も同様。ユーザー ~/.npmrc、グローバル設定、コマンドライン、環境変数由来の設定では従来どおり展開される。
対処は pnpm を修正版へ上げ、コミット済み .npmrc からトークンを信頼できる場所へ移す。
- ユーザーまたはグローバル設定へ書く:
pnpm config set "//registry.npmjs.org/:_authToken" "$NPM_TOKEN"(プロジェクト.npmrcには書かない) - v11.6 以降、ファイルなしで環境変数から渡す:
env "pnpm_config_//registry.npmjs.org/:_authToken=$NPM_TOKEN" pnpm install(変数名に/や:が含まれるためexportでは不可) - GitHub Actions では
actions/setup-nodeのregistry-urlとNODE_AUTH_TOKENの組み合わせは引き続き有効 - 信頼できる CI でのみ、環境変数
PNPM_CONFIG_NPMRC_AUTH_FILE=.npmrc(v11)またはNPM_CONFIG_USERCONFIG=.npmrc(v10)でリポジトリ.npmrcを信頼扱いにできる
レジストリ URL 自体を環境変数でテンプレートしていた場合も、信頼ソース(pnpm config set、ユーザー ~/.npmrc、CLI、環境設定)へ移す。URL が秘密でなければリテラル URL をプロジェクト .npmrc に直接書いてよい。v11.7 以降は同一ホストでもスコープ別に異なる _authToken をユーザー ~/.npmrc など信頼場所で指定できる。