npm audit が next に「critical」を出した、あるいは委託先から「Next.jsの脆弱性の件、御社のサイトは対象ですか」と聞かれた。2026年9月に公開されたNext.jsのアドバイザリは、どちらも深刻度がCRITICALのリモートコード実行(RCE)です。ただ、当たる条件は「OG画像の作り方」と「サーバーのOS」で、バージョンが範囲に入っていても、コードやホスティングの条件を満たさなければ対象外と書かれています。
アドバイザリ本文、修正コミット、Next.jsのドキュメントを読み、自社のアプリが当たるかを判断する手順を整理します。編集部の検証環境(Linux、Node.js v22.22.0、npm 10.9.4)での npm audit の結果も示します。攻撃の再現はしていません。
9月の2件は、当たる条件がまったく違う
GitHub Advisory Databaseに収録された2件の内容です。
| next/og の ImageResponse | Windows上のサーバー | |
|---|---|---|
| ID | GHSA-vcvr-r3jv-pc5j | GHSA-p293-qw3h-jr36(CVE-2026-75604) |
| 公開日 | 2026年9月30日 | 2026年9月8日 |
| 対象の版 | 16.2.0以上16.3.6未満 | 13.4.0以上15.5.24未満、16.0.0以上16.3.3未満 |
| 当たる条件 | Node.js版のImageResponseで、攻撃者が操作できる値をSVGの内容・属性・スタイルに渡している | Windowsのファイルシステム上でサーバーを動かしている(Cache Componentsを使わないPages Router・App Router) |
| 回避策 | 外部の値を渡さない(アドバイザリ記載) | なし。Windowsなら即時更新 |
もう1件、9月8日に公開されたAVIF画像の最適化に関するアドバイザリ(GHSA-2xp9-vwfh-vxw4、修正版は同じく15.5.24と16.3.3)があります。こちらは画像最適化が使うsharpとlibheifの問題で、sharpとlibheifのAVIF脆弱性の確認手順で扱っています。
next/og:Node.jsで、外から来た値を画像に入れているか
next/og の ImageResponse は、JSXとCSSから記事ごとのOGP画像などを作る機能で、ドキュメントによれば内部で@vercel/og、Satori、Resvgを使ってPNGに変換します。
アドバイザリによれば、Node.js版のImageResponseが上流の脆弱性の影響を受け、RCEにつながる可能性があります。攻撃者が操作できる値をSVGの内容・属性・スタイルに渡すアプリが対象で、Edge版を使うアプリと、そうした値を渡さないアプリは対象外です。
Node.js版とEdge版のどちらが動くかは、ルートのランタイムで決まります。Next.js 16.3.6のパッケージ内のコードでは、NEXT_RUNTIME が edge ならEdge版、それ以外はNode.js版の@vercel/ogを読み込みます。そしてドキュメントでは、runtime の既定値は 'nodejs' で、'edge' は非推奨です。つまり、runtime を何も書いていない opengraph-image.tsx やRoute Handlerは、Node.js版で動きます。
修正は、Satoriの2026年9月22日のコミット「fix: Harden SVG serialization」(タグ0.33.5、値のエスケープとXML名・内部スタイルの検証を追加)と、同日のNext.jsのコミット「Harden next/og SVG serialization」(同梱の@vercel/og 0.11.1にパッチを当てる)で、後者が16.3.6に入っています。
Next.js 16.3の主な変更点はNext.js 16.3の開発サーバーのメモリ改善で扱いました。16.2.0以上の版はすべて今回の範囲に入るため、16.3系に上げて間もないアプリも、16.3.6以降になっているかを確認してください。
コードで確かめる検索コマンド
ここからは編集部の提案です。リポジトリの直下で次の検索を実行すると、確認すべきファイルが絞れます(編集部の検証環境で、検証用のファイルに対して動作を確認済み)。
# 1. next/og(または @vercel/og)を読み込んでいるファイル
grep -rlE "from ['\"](next/og|@vercel/og)['\"]" \
--include='*.ts' --include='*.tsx' --include='*.js' --include='*.jsx' --include='*.mjs' \
--exclude-dir=node_modules --exclude-dir=.next .
# 2. 画像を生成するファイル規約(opengraph-image / twitter-image / icon / apple-icon)
find . \( -path ./node_modules -o -path ./.next \) -prune -o -type f \
\( -name 'opengraph-image.*' -o -name 'twitter-image.*' -o -name 'icon.*' -o -name 'apple-icon.*' \) -print
# 3. ランタイムを明示しているファイル
grep -rnE "runtime\s*[:=]\s*['\"](edge|experimental-edge|nodejs)['\"]" \
--include='*.ts' --include='*.tsx' --include='*.js' --include='*.jsx' \
--exclude-dir=node_modules --exclude-dir=.next .
3つ目の検索で export const runtime = 'edge' や、Pages Routerの export const config = { runtime: 'edge' } が出なかったファイルは、Node.js版で動くものとして扱います(Pages Routerの config.runtime が読まれることは16.3.6のビルド処理のコードで確認)。

図はアドバイザリの条件を確認の順に並べた編集部の整理です。「外部の値」は、URLのパスから来る params、検索パラメータ、利用者が投稿したタイトルや名前などを指します。アドバイザリの例はSVG要素に値を入れる形ですが、ImageResponseはJSX全体をSVGにしてから画像にするため、編集部は更新までJSXのどこに入れる値も同じ扱いを推奨します。自社の値だけを使う画像でも、後から投稿機能が加わることはあります。範囲内の版なら、条件を詰めるより16.3.6以降に上げるほうが確実です。
Windows:コードより「どこで動いているか」
GHSA-p293-qw3h-jr36は、コードの書き方ではなくサーバーのOSが条件です。アドバイザリは、Cache Componentsを使わないPages Router・App Routerのアプリで、Windowsのファイルシステムを使うマシン上でサーバーを動かすとRCEにつながる可能性があると書き、回避策はないので直ちに更新するよう求めています。修正コミットの題名は「Fix ISR misses with backslashes in segments when deployed on Windows」で、ISRのキャッシュをファイルに保存する処理が変更されています。
確認するのは、本番でNext.jsのサーバーを動かしているマシンのOSです。Windows ServerやWindowsの仮想マシンで動かしている構成が候補になります。委託先が運用している場合はOSとNext.jsの版を文書で回答してもらい、OSが分からなければ該当するものとして更新を優先してください。
修正版の15.5.24と16.3.3は2026年8月25日にnpmに公開されており、アドバイザリの公開(9月8日)より前です。8月末以降に更新済みなら、この件は解消しています。保守契約の範囲で誰が更新するかの決め方は、React2Shellの放置サイトと保守契約の見直しで整理しました。
npm auditで見えること、見えないこと
編集部の検証環境で、next と react / react-dom(19.2.0)だけを依存に持つ package.json を作り、npm install --package-lock-only のあと npm audit --json を実行しました(2026年10月1日)。
| nextの版 | npm auditが示したNext.jsのアドバイザリ |
|---|---|
| 16.3.2 | GHSA-p293(Windows)、GHSA-2xp9(AVIF)、GHSA-vcvr(next/og)の3件 |
| 16.3.5 | GHSA-vcvr(next/og)の1件 |
| 16.3.6 / 16.3.8 | なし(指摘0件) |
| 15.5.23 | GHSA-p293、GHSA-2xp9の2件(ほかに同梱のpostcss・sharpの指摘) |
| 15.5.27 | Next.js本体のアドバイザリはなし。同梱のpostcssの指摘は残る |
npm audit は版だけで判定するため、Windowsで動かしていない、next/ogを使っていないといった条件は反映されず、条件に当たらなくても警告は更新まで残ります。
Satoriや@vercel/ogを直接依存にしているアプリは別の確認が要ります。satori@0.33.4 を依存に持つ構成で npm audit を実行したところ、今回のSatoriのアドバイザリは表示されませんでした(その本文は環境から開けず未読)。npmでは修正コミットを含むsatori 0.33.5と、それに依存する@vercel/og 1.0.3が9月22日に公開されています。直接依存の場合は版を自分で確かめます。
なお15.5.27でも同梱のpostcssの指摘が残り、npm audit はメジャー更新の16.3.8を示しました。postcssの指摘の影響は本記事では評価していません。
更新するときに迷いやすい点
- どの版に上げるか。 next/ogの修正は16.3.6からで、確認時点のnpmの
latestは16.3.8(9月30日公開)です。16.3.8のタグには、外部画像取得時のDNS解決の固定やドラフトモードの漏れの修正などのコミットが含まれますが、確認時点のAdvisory Databaseに対応するアドバイザリはありません。編集部は、16.3.6で止めず16.3.8まで上げて動作確認する進め方を提案します。 - Edgeに切り替えて回避しない。 Edge版は対象外とされていますが、ドキュメントでは
runtime = 'edge'は非推奨で、Cache ComponentsはNode.jsランタイムが前提です。回避策はアドバイザリにあるとおり「外部の値を渡さない」で、ランタイムの変更ではありません。 - 同梱物のバージョン表示を当てにしない。 16.3.5と16.3.6を展開して比べると、
dist/compiled/@vercel/ogの画像生成のファイルは変わっていますが、同じ場所のpackage.jsonの版は両方とも0.11.1です。修正の有無はnext自体のバージョン(npm ls next)で判断します。
2026年10月1日に、GitHub Advisory Database(commit 3113af4)のGHSA-vcvr-r3jv-pc5j・GHSA-p293-qw3h-jr36・GHSA-2xp9-vwfh-vxw4、Next.jsとSatoriのリポジトリの修正コミットとタグ、Next.jsのドキュメント(runtime、ImageResponse、Edge Runtime、cacheComponents)のソースを直接読みました。npmの公開日時は
npm viewで、Next.js 16.3.5と16.3.6の差分はパッケージを展開して確認しました。npm auditは編集部の検証環境(Linux、Node.js v22.22.0)で依存だけを入れた最小構成に対して実行したもので、アプリのビルドや脆弱性の再現、Windowsでの動作確認は行っていません。SatoriのアドバイザリGHSA-wx4j-mvgx-mqwpとNext.jsのリリースノートのページは、環境から開けず未読です。
Next.jsで作ったサイトやアプリの更新計画、委託先への確認の進め方は、グリームハブへご相談ください。
Sources
- GHSA-vcvr-r3jv-pc5j: Remote Code Execution in next/og ImageResponse — vercel/next.js
- GHSA-p293-qw3h-jr36: Unauthenticated Remote Code Execution on windows-hosted servers — vercel/next.js
- GHSA-2xp9-vwfh-vxw4: Remote Code Execution in Image Optimization API when AVIF files are used — GitHub Advisory Database
- github/advisory-database(収録JSON)
- Harden next/og SVG serialization — vercel/next.js commit 868fad3
- Fix ISR misses with backslashes in segments when deployed on Windows — vercel/next.js commit 968b9fc
- fix: Harden SVG serialization — vercel/satori commit 26a52af(0.33.5)
- runtime — Next.js Docs
- ImageResponse — Next.js Docs
- Edge Runtime Deprecated — Next.js Docs
- next — npm









