概要

npmが新機能「ステージ公開(Staged Publishing)」を正式にリリースした。従来、開発者がパッケージの新バージョンをアップロードすると即座に公開されていたが、この機能を有効にすると、パッケージはいったん「ステージングキュー」に入り、npmjs.com上やCLIで内容を確認したうえでメンテナが明示的に承認するまでは一般に配信されない仕組みになる。承認にあたっては2要素認証(2FA)が必須となり、CI経由の乗っ取りなどによる不正な自動公開を防ぐ狙いがある。

技術的な仕組み

ステージ公開は、npm CLIに新たに追加された一連のサブコマンドで操作する。npm stage publishでバージョンをステージングキューに送信し、npm stage listで承認待ちの一覧を確認、npm stage view <stage-id>でアップロードされたtarballの中身を検査できる。問題がなければnpm stage approve <stage-id>で本番レジストリに昇格させ、不審な場合はnpm stage reject <stage-id>で破棄する。

重要な設計上の工夫として、ステージングへのアップロード自体は2FA要件をバイパスできるため、非対話的なCIパイプラインからの公開フローは従来通り動作する。人間による確認はその後の承認ステップに移されており、CI環境が乗っ取られたとしても攻撃者が直接悪意あるバージョンを一般公開することはできない構造になっている。利用にはnpm CLI 11.15.0以降とNode.js 22.14.0以降が必要で、GitHubは2026年5月にこの機能を一般提供(GA)した。

導入の背景

この機能は、Shai-Huludワームによる攻撃をはじめとする一連の深刻なサプライチェーン侵害事件と、クラシックトークンからの移行に伴う混乱を受けて開発された。セキュリティ研究者のAdnan Khan氏は「npmに公開しているすべての人は今すぐこの機能を有効にすべきだ。OIDC経由でCIから公開し、一般公開される前にパッケージを承認するようにしよう」と述べ、早期の導入を強く推奨している。

他ツールの追随と今後の展望

同様の仕組みは他のパッケージマネージャーにも急速に広がっている。pnpm 11.3では同名のpnpm stageコマンド群が追加され、Yarnもyarn npm stage listなどの形で対応した。リリース自動化ツールのrelease-itも"stage": trueという設定オプションを追加している。さらにpnpmは、公開されたばかりの新しいバージョンのインストールをデフォルトで一定期間遅延させる補完的な防御も実装済みだ。

開発者コミュニティの反応は賛否が分かれている。あるReddit(r/programming)のコメントは、ステージ公開を万能の解決策ではなく「拡散速度を下げるもの」と位置づける一方、あるHacker Newsのコメントでは「CI乗っ取りによる公開攻撃という攻撃手法全体を無力化する重要な改善」と評価する声もあった。メンテナが実際にこの機能を継続的に利用するかどうかについては懐疑的な見方も出ている。GitHubは今後、粒度の細かいアクセストークンをデフォルトでステージ専用モードにすることや、npm v12でインストールスクリプトをデフォルトでオプトイン化するallowScriptsフィールドの導入も計画している。