觀點 · 資訊分享
NGINX njs 爆 CVE-2026-8711:js_fetch_proxy 用了客戶端變數,沒登入的人也能打到 worker
F5 公開 NGINX JavaScript(njs)的 CVE-2026-8711:只要 js_fetch_proxy 用了客戶端可控的變數,又有 location 呼叫 ngx.fetch(),沒登入的攻擊者就能送特製請求,讓 worker 緩衝區溢位重啟,某些情況下甚至能執行程式碼。
- 發布
- 2026-05-19
- 篇幅
- 約 3 分鐘 · 1,545 字
- 結構
- 7 節 + 3 題常見問題
- 標籤

一句話看懂:NGINX 的 njs 模組有個漏洞,只要設定把客戶端傳來的值拿去當 proxy 位址,沒登入的人就能送特製請求,打到 NGINX 的工作程序。

先用白話講:njs 是什麼?
NGINX 平常像是一位只照固定規則轉接電話的總機。njs(NGINX JavaScript)則讓你用 JavaScript 幫總機加上自訂的小程式,例如「依照來電者的資料決定轉給誰」。
其中 ngx.fetch() 是這個小程式用來主動對外發出 HTTP 請求的功能,而 js_fetch_proxy 這個指令,決定這些請求要走哪個 proxy(代理伺服器)。
這次的問題是:如果 proxy 的位址是用客戶端自己可以傳來的值組出來的,就等於把一部分的控制權交給了陌生人。
發生什麼事
F5(NGINX 的母公司)在 2026 年 5 月 19 日公開了 CVE-2026-8711,影響 NGINX JavaScript 的 ngx_http_js_module 模組。
依 CVE 描述,必須同時符合兩個條件才會中:
js_fetch_proxy指令的值,至少有一個客戶端可控的 NGINX 變數(例如$http_*、$arg_*、$cookie_*)- 有某個 location 會呼叫
ngx.fetch()
符合條件時,不需要登入的攻擊者就能送特製 HTTP 請求,造成 NGINX worker(工作程序)發生堆積區的緩衝區溢位,結果是程序重啟。另外,在 ASLR(位址空間配置隨機化,一種讓攻擊更難成功的保護機制)被關閉,或攻擊者能繞過它的情況下,還可能執行程式碼。
影響範圍與嚴重度
| 項目 | 內容 |
|---|---|
| 受影響產品 | F5 NGINX JavaScript(njs) |
| 受影響版本 | NVD 記載 0.9.4 起、低於 0.9.9 |
| 嚴重度 | F5 給的 CVSS v4.0 為 9.2(Critical) |
| 不在評估範圍 | 已結束技術支援(EoTS)的版本 |
給開發者的技術細節
檢查自己有沒有中標,可以先在設定檔搜尋下面這種寫法:
# 示意(語法以官方文件為準):值裡含客戶端可控的變數就有風險
js_fetch_proxy $http_x_proxy;
- 如果
js_fetch_proxy的值是固定字串,依 CVE 描述不在觸發條件內 - 如果用了
$http_*、$arg_*、$cookie_*這類變數,先改成固定值或在前面做嚴格的白名單檢查 - 版本方面,請以 F5 官方公告為準升級;本文取自 NVD 的 CVE 描述,F5 的公告頁面需要 JavaScript 才能顯示,我沒能直接讀取內容
我的看法
這類漏洞的共通點是「把使用者輸入直接塞進基礎設施設定」。為了方便,常有人把 header 或參數拿去決定要轉到哪裡,功能上很彈性,但安全上等於讓外面的人幫你寫設定。
自架服務的人要注意,njs 不是預設一定會裝,多半是有人特地加進來做閘道或轉發才會用到。如果你的 NGINX 設定是別人留下來的,或是從網路上抄來的範本,花十分鐘搜尋一下 js_fetch_proxy 值得。
另外,即使這次只符合條件才會中,我還是會把 NGINX 與模組放進定期更新的清單。
名詞小辭典
- NGINX worker:NGINX 真正處理連線的工作程序,一個壞掉會被主程序重新拉起來。
- 緩衝區溢位(Buffer Overflow):程式往一塊固定大小的記憶體寫入太多資料,蓋到旁邊不該動的地方。
- ASLR:作業系統把程式放在記憶體的位置每次隨機排,讓攻擊者更難猜到要攻擊哪裡。
- CVSS:替漏洞嚴重程度打分數的標準,滿分 10 分。