觀點 · 資訊分享
Next.js 動態分享圖功能有重大漏洞:把使用者輸入塞進 SVG 就可能被遠端執行程式,16.3.6 已修補
Next.js 公布 CVE-2026-94545:Node.js 版的 next/og ImageResponse 受上游套件漏洞影響,如果把網址參數等外部輸入放進 SVG 的內容、屬性或樣式,可能導致遠端執行程式。影響 16.2.0 到 16.3.5,請升級到 16.3.6。
- 發布
- 2026-09-23
- 篇幅
- 約 3 分鐘 · 1,556 字
- 結構
- 7 節 + 3 題常見問題
- 標籤

一句話看懂:Next.js 用來自動產生分享圖的 ImageResponse 有重大漏洞,只要把使用者輸入塞進 SVG,就可能被遠端執行程式;請升級到 16.3.6。

先用白話講:OG 分享圖是什麼?
你把一篇文章連結貼到 LINE 或 Facebook 時,會跳出一張預覽小圖,上面常常有文章標題。這張圖叫 OG 圖(Open Graph image)。
很多 Next.js 網站不會每篇文章都手動做圖,而是用 next/og 的 ImageResponse 自動產生:程式把標題文字塞進一個圖片模板,即時畫出一張圖。
問題就出在「把文字塞進模板」這一步。如果那段文字來自網址參數(例如 ?title=...),任何人都能隨意改它。這次的漏洞讓特製的內容可以在伺服器上執行程式,就像有人在你的影印機裡塞了一張紙,結果影印機開始照著紙上的指令做事。
發生什麼事
Next.js 在 GitHub 公布安全公告 GHSA-vcvr-r3jv-pc5j(CVE-2026-94545),發布時間是美國 9 月 22 日、台灣 9 月 23 日凌晨:
- 等級:重大(critical),CVSS 4.0 評分 9.5
- 原因:Node.js 版的
next/ogImageResponse 受到一個上游套件漏洞影響,可能導致遠端執行程式;公告沒有說明是哪一個上游套件 - 觸發條件:應用程式在產生圖片時,把攻擊者可以控制的值放進 SVG 的內容、屬性或樣式
- 受影響版本:
next16.2.0 以上、16.3.6 以前 - 修補版本:16.3.6
誰會受影響?
| 情況 | 是否受影響 |
|---|---|
| Node.js 版 ImageResponse,且把外部輸入放進 SVG | 受影響 |
| Edge 版 ImageResponse | 不受影響 |
| 沒有把外部輸入放進 SVG 的內容、屬性或樣式 | 不受影響 |
| 已升級到 16.3.6 | 已修補 |
公告裡舉的危險寫法,就是直接把網址參數放進 SVG 的 <title>:
import { ImageResponse } from 'next/og'
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>
)
}
給開發者的技術細節
- 先確認版本:
npm ls next
- 升級:
npm install [email protected](或用專案的套件管理器,例如pnpm add [email protected]),升級後重新建置部署 - 暫時做法:還不能升級時,不要把攻擊者可控制的值放進 Node.js 版 ImageResponse 的 SVG 內容、屬性或樣式
- 順手檢查:分享圖的文字盡量從資料庫依 ID 查出來,不要直接吃網址參數;需要參數時,也只接受固定格式(例如文章 ID)
我的看法
動態 OG 圖是很多網站「看起來很專業」的小細節,也正因為是小細節,最常被寫成「標題直接從網址拿」的懶人寫法。這次的漏洞剛好打在這個習慣上,而且等級是 9.5,接案者手上有 Next.js 專案的,建議今天就檢查版本。
用 Nuxt 或其他框架做分享圖的人也一樣,這件事點出一個通用原則:任何會「把文字畫成圖」的功能,都要把輸入當成不可信任的資料。不管用什麼框架,分享圖的內容最好來自自己的資料庫,而不是網址上任何人都能改的參數。
名詞小辭典
- OG 圖(Open Graph image):分享連結到社群平台時顯示的預覽圖片。
- SVG:用文字描述圖形的向量圖格式,可以包含屬性、樣式等內容。
- 上游套件(Upstream):你使用的工具本身所依賴的其他套件。
- Edge 執行環境:在 CDN 節點上執行的輕量環境,與一般 Node.js 伺服器的執行方式不同。