Next.js next/og 的 ImageResponse 可遠端執行程式碼,升級至 16.3.6
GitHub Advisory Database · 2026-09-30
Next.js 的 Node.js 版 ImageResponse(next/og)把使用者輸入放進 SVG 時,會觸發上游元件的漏洞,結果是遠端程式碼執行(RCE)。修補版 16.3.6 已在 2026-09-22 發布,advisory GHSA-vcvr-r3jv-pc5j 則在 2026-09-30 公開,嚴重度為 critical,CVSS v4 分數 9.5。
漏洞機制
next/og 用來在伺服器端動態產生社群分享圖(Open Graph image)。advisory 指出,Node.js 版實作受上游元件的漏洞影響;advisory 未點名是哪個套件,但參考連結中列出 vercel/satori 的 advisory。
觸發條件是程式把攻擊者可控的值傳進 SVG 的內容、屬性或樣式。最典型的寫法,是 route handler 直接把 query string 塞進 <title>:
export async function GET(request: Request) {
const value = new URL(request.url)
.searchParams.get('value') ?? ''
return new ImageResponse(
<svg width="1200" height="630">
<title>{value}</title>
</svg>
)
}向量字串為 AV:N/AC:L/AT:P/PR:N/UI:N,代表網路可達、不需登入、不需使用者互動,而且機密性、完整性、可用性三項影響皆為 High。advisory 分類的 CWE 是 CWE-1395(依賴有漏洞的第三方元件)。
原本的問題
動態 OG 圖通常是公開路由:任何人、任何爬蟲都能帶著任意參數呼叫,不需要登入。這類 route 的輸入本來就被視為「只是要畫在圖上的字」,開發者很少把它當成需要跳脫的不可信資料。這次的問題正出在這個假設:字串經過 SVG 序列化之後,不只是被畫出來,還可能被當成指令處理,最終走到程式碼執行。
另一個麻煩是漏洞位於內建依賴。應用程式自己的程式碼可能完全沒有可疑的 eval 或 shell 呼叫,針對你自己依賴樹的掃描,也要等到 advisory 進資料庫才看得到。advisory 本身也把這類問題歸為第三方元件依賴(CWE-1395)。
受影響版本
- 受影響:
next>= 16.2.0, < 16.3.6,且使用 Node.js 版ImageResponse。 - 不受影響:使用 Edge 版
ImageResponse的應用程式。 - 不受影響:沒有把攻擊者可控的值傳進 SVG 內容、屬性或樣式的應用程式。
要注意的是,「我們沒有直接拼 SVG」不代表安全。只要任何請求參數、資料庫欄位或第三方 API 回傳值,最後流進 ImageResponse 的 JSX,就算攻擊者可控。動態 OG 圖的 route 通常正是把文章標題、作者名稱這類使用者資料塞進去,要逐一檢查。
修補與緩解
對應的修補 commit 是 868fad3,標題為「Harden next/og SVG serialization」,作者時間 2026-09-22。從檔案清單看,它新增了 patches/@vercel__og@0.11.1.patch,並更新 next/og 內建的 @vercel/og 編譯產物(Node 與 Edge 各一份)。v16.3.6 release 的說明只有一句,表示此版本含這個安全修補,沒有其他細節。
升級前後的對照如下:
| 項目 | 升級前 | 升級後 |
|---|---|---|
next 版本 | >= 16.2.0, < 16.3.6 | 16.3.6 |
| SVG 序列化 | 上游行為,可被注入 | commit 標題稱已強化(hardened) |
這個修補的規模不小:commit 的檔案清單顯示,index.node.js 有 2667 行新增、2633 行刪除,index.edge.js 有 2238 行新增、2204 行刪除,另有一個 17293 行的 patch 檔。多數行數可能只是編譯產物重新產生;advisory 與 commit 訊息都沒有說明實際改了哪些序列化邏輯,細節請以 vercel/satori 的 advisory 為準。
該檢查什麼
- 確認
package.json與 lockfile 解析出的next版本;落在>= 16.2.0, < 16.3.6就要升級。 - 搜尋
next/og的使用處,區分它跑在 Node.js runtime 還是 Edge runtime,只有 Node.js 版受影響。 - 追蹤每個
ImageResponse的 JSX 輸入:query string、路徑參數、資料庫內容,凡是使用者能影響的都算攻擊者可控。 - 部署平台若有固定 Next.js 版本的設定(例如 Docker image 或 CI cache),確認重新建置後確實換成
16.3.6。
無法立即升級時,advisory 給的緩解方式只有一條:不要把攻擊者可控的值傳進 Node.js 版 ImageResponse 的 SVG 內容、屬性或樣式。實務上可以先列出專案中所有 from 'next/og' 的 import,確認每個 route 的輸入來源,再決定是先升級還是先移除動態欄位。
advisory 未說明已知的實際攻擊案例,也未列出具體的 exploit 手法,本文不推測。
原始來源:GHSA-vcvr-r3jv-pc5j、vercel/next.js 868fad3、Next.js v16.3.6