Rebounder Tech Blog

運用している当事者が書く、本番システムの記録。

古いNext.jsのままVercelにpushしたら、ビルド前にデプロイがブロックされた(15.1.6が脆弱版判定)

公開 読了時間 約3分執筆: Rebounder 開発チーム(当該システムの運用当事者)

※本記事にはアフィリエイトリンクを含む場合があります。内容は広告の有無に影響されません。

結論

package.json の next が `15.1.6` に固定されていたため、Vercel はビルドを走らせる前の段階で脆弱バージョンと判定してデプロイをブロックし、`^15.5.23` へ上げて package-lock.json を再生成するまで通らなかった。

結論

package.jsonnext15.1.6 に固定したまま Vercel へ push したところ、ビルドが1行も走らないうちにデプロイそのものがブロックされました。 原因は Vercel が 15.1.6 を脆弱バージョンと判定したためで、next^15.5.23 へ上げて package-lock.json を再生成するまで直りませんでした。

症状

自社で運用している Next.js プロジェクトの package.json には、next がキャレット無しの固定値で書かれていました。

"dependencies": {
  "lucide-react": "^0.469.0",
  "next": "15.1.6",
  "react": "^19.0.0",
  "react-dom": "^19.0.0"
},

このリポジトリはこの時点でまだ2コミット目という初期段階で、依存関係を更新する習慣が根付く前にこの構成のまま Vercel へのデプロイを試みています。結果は、next build のログが1行も出ないままデプロイが止まる、という形でした。ビルドエラーではなく、ビルドに入る前の段階で弾かれているのが特徴です。

原因

コミットメッセージにそのまま残っている通り、理由は「Vercel が 15.1.6 を脆弱版として弾くため」でした。

Next.js を 15.5.23 へ。Vercel が 15.1.6 を脆弱版として弾くため

Vercel は、アップロードされたプロジェクトの package.json に書かれた next のバージョンを見て、既知の脆弱バージョンに該当する場合はビルドを実行する前の段階でデプロイをブロックします。ここで重要なのは、package-lock.json が実際にどのバージョンを解決しているかではなく、package.json に書かれた指定そのものが判定対象になっているという点です。このリポジトリでは next がキャレットの付かない 15.1.6 という固定値で書かれていたため、^ を付けて範囲指定にしていれば別のパッチバージョンに逃げられていた可能性のある状況を、そのまま固定してしまっていました。

直す

package.json の1行を書き換えています。

-    "next": "15.1.6",
+    "next": "^15.5.23",

これに伴い package-lock.json も npm によって再生成され、255行の追加・223行の削除が入りました。バージョンを1段上げるだけでも、依存ツリー全体の解決結果が変わるため、ロックファイルの差分はかなりの範囲に及びます。

package-lock.json | 478 +++++++++++++++++++++++++++++-------------------------
package.json      |   2 +-
2 files changed, 256 insertions(+), 224 deletions(-)

package.json を直しただけでは終わらず、ロックファイルを再生成してコミットするところまでがセットです。

再発防止

根拠となるコミットには、Vercel 側の判定基準を確認する手順や、以後のバージョン管理方針を変えたという記述はありません。今回の直し方も、指摘されたバージョンを1段上げてロックファイルを作り直しただけです。

構造として見えるのは、キャレット無しの固定バージョン指定は、脆弱性が新たに見つかったときに自分では動けないということです。^15.5.23 のような範囲指定であれば、パッチ更新の範囲内でインストール時に新しいバージョンが解決される余地がありますが、15.1.6 という完全固定はその余地自体を塞いでいました。このリポジトリは作られてからまだ日が浅く、依存関係を更新する運用が組み込まれる前の状態でこの指定のまま放置されていたことが、デプロイ時になって初めて表面化した形です。

よくある質問

Q1Vercelはどの段階でブロックしたのですか?

ビルドを実行する前の段階です。npm installやnext buildが走る前に、アップロードされたpackage.jsonのnextのバージョンを見て、脆弱と判定した時点でデプロイ自体を止めています。ビルドログにエラーが残る形ではありません。

Q215.1.6からどのバージョンへ上げたのですか?

package.jsonのnextの指定を、固定値の15.1.6からキャレット付きの^15.5.23へ変更しました。これによりpackage-lock.jsonも作り直され、255行の追加と223行の削除が入っています。

Q3なぜ15.1.6が脆弱と判定されたのですか?

根拠のコミットにはVercel側の具体的な判定基準やCVE番号の記載はなく、コミットメッセージに残っているのは「Vercelが15.1.6を脆弱版として弾くため」という事実だけです。判定基準そのものはVercel側が持っています。

確認した環境

  • package.json の next は 15.1.6 固定 → ^15.5.23 へ更新(npm解決、package-lock.jsonも再生成)
  • 2026-08-13 に自社運用のNext.jsプロジェクトのデプロイ前に発生・修正

この記事の根拠

  • JSONファイル 10〜15行目コミット a8f1bd0
  • JSONファイル 10〜15行目コミット 38bf7d1
  • JSONファイル 1〜30行目コミット 38bf7d1

本文の主張は、上の記録に書かれていることだけです。運用しているリポジトリは非公開のため リンクは張れませんが、どのファイルの何行目を、どのコミット時点で見て書いたかは 記事ごとに残しています。推測で書いた箇所はありません。