pnpm、GHSA-3qhv-2rgh-x77r(リポジトリ .npmrc の環境変数窃取)

510文字
3分
編集

pnpm は、リポジトリにコミットされた .npmrcpnpm-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_passwordusernametokenHelpercertkey)に ${...} が含まれるとその設定は無視され警告が出る。pnpm-workspace.yamlregistryregistriesnamedRegistries も同様。ユーザー ~/.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-noderegistry-urlNODE_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 など信頼場所で指定できる。

#参考文献