資安雷達 2026 年 10 月 1 日

2026-10-01 — Next.js next/og ImageResponse 可遠端執行程式碼,升級 16.3.6

primary=https://github.com/advisories/GHSA-vcvr-r3jv-pc5j primary=https://github.com/vercel/next.js/commit/868fad38690d72088868f299fa2bef339b26838e primary=https://github.com/vercel/next.js/releases/tag/v16.3.6

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.616.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


End of article
0
Would love your thoughts, please comment.x
()
x