觀點 · 資訊分享

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#CVE-2026-8711#F5#緩衝區溢位
NGINX njs 爆 CVE-2026-8711:js_fetch_proxy 用了客戶端變數,沒登入的人也能打到 worker

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

NGINX njs 的 js_fetch_proxy 漏洞資訊圖卡:設定把客戶端傳來的值拿去當 proxy,沒登入的人就能打到 worker

先用白話講: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 分。

資料來源

常見問題

njs 是什麼?
NGINX JavaScript,讓你用 JavaScript 在 NGINX 裡寫自訂邏輯,例如改寫請求、做簡單的 API 閘道。ngx.fetch() 是它用來對外發出 HTTP 請求的函式。
所有用 njs 的網站都受影響嗎?
不是。要同時符合:js_fetch_proxy 指令的值包含客戶端可以控制的 NGINX 變數,而且有 location 呼叫了 ngx.fetch()。沒用這個指令的設定,依 CVE 描述不在條件內。
我該怎麼檢查與處理?
搜尋設定檔裡有沒有 js_fetch_proxy 搭配 $http_、$arg_、$cookie_ 變數;有的話先改成固定值,並依 F5 公告升級 njs。F5 公告頁需要 JavaScript 才能完整顯示,本文以 NVD 的 CVE 描述為準。
LINE