後端工坊 2026 年 6 月 7 日

2026-06-07 — nginx CVE-2026-9256 CVSS 9.2、Zeroserve io_uring 深度解析

primary=https://nginx.org/en/security_advisories.html primary=https://www.openwall.com/lists/oss-security/2026/05/22/14 primary=https://su3.io/posts/introducing-zeroserve primary=https://github.com/losfair/zeroserve

nginx CVE-2026-9256:Rewrite 模組堆積緩衝區溢位,CVSS 9.2,版本 0.1.17 起全部受影響

nginx Security Advisories · 2026-05-22

nginx 於 2026 年 5 月 22 日發布 1.31.1(mainline)與 1.30.2(stable),修復 CVE-2026-9256——一個遠端未認證攻擊者可觸發的堆積緩衝區溢位,CVSS v4.0 評分 9.2 Critical。受影響版本從 0.1.171.31.0,超過二十年版本線全數受波及,nginx Plus 亦在修補範圍內。

漏洞機制

根源在 ngx_http_rewrite_module 處理帶有重疊 PCRE captures 的 rewrite 規則時的緩衝區大小計算錯誤。當 rewrite 指令使用巢狀捕獲群組(如 ^/((.*))$),且替換字串同時引用多個捕獲(如 $1$2),模組在計算目標緩衝區大小時少計,導致堆積溢位。攻擊者透過構造特定 HTTP 請求路徑即可觸發,無需認證或特殊權限。

漏洞後果視系統環境而定:啟用 ASLR 的系統最壞情況是 worker process 崩潰後自動重啟(拒絕服務);停用 ASLR 的環境(部分嵌入式或容器設定)或攻擊者能繞過 ASLR 時,可能達成任意程式碼執行。此漏洞被社群命名為 nginx-poolslip

受影響版本

  • nginx 0.1.171.31.0(含 nginx Plus)
  • 1.31.1 mainline 及 1.30.2 stable 以上不受影響
  • 注意:先前為修補 CVE-2026-42945 而升級至 1.31.01.30.1 的環境,對本漏洞仍脆弱——這是獨立漏洞,不能依賴舊補丁保護

修補與緩解

修補方式:升級至 1.31.1(mainline)或 1.30.2(stable)。若短期無法升級,可審查設定中所有使用巢狀 PCRE captures 的 rewrite 指令,移除或改寫重疊 capture 規則作為暫時緩解。漏洞由 Mandiant 研究員發現並回報。同一補丁批次亦修復 CVE-2026-40701(OCSP resolver use-after-free)與 CVE-2026-40460(HTTP/3 位址偽造),兩者為 medium 級別。

原始來源:nginx Security Advisoriesoss-security 郵件列表


Zeroserve 的 io_uring 設計:completion-based I/O 如何讓單執行緒超越 nginx

GitHub · losfair/zeroserve · 2026-06-07

Zeroserve 在單核心上對小型靜態檔案的吞吐量超過 nginx,對反向代理請求也有 21% 優勢。這個結果的技術根源在於 Linux io_uring 的 completion-based I/O 模型、tarball 直接服務的 syscall 路徑最佳化,以及 Rust 的 zero-cost 抽象提供的記憶體效率。

io_uring 對比 epoll 的根本差異

epoll 模型每次 I/O 完成需要兩個核心介面點epoll_wait 通知 fd 可讀寫,加上對應的讀寫 syscall。io_uring 透過 submission queue(SQ)與 completion queue(CQ)的共享記憶體環形佇列,允許核心與用戶空間在不進行 syscall 的前提下交換 I/O 結果——在 SQPOLL 模式下甚至完全消除 syscall。Zeroserve 使用的 monoio 是 completion-based(而非 readiness-based)的 Rust 非同步執行環境:程式等待操作完成,而非等待 fd 可讀寫後再呼叫系統呼叫。

Tarball 直接服務避免了傳統靜態檔案服務的 open/stat/read 序列:網站打包時建立 path → byte-range 映射,請求到達後對 tarball 直接發出帶偏移的 read 操作,跳過目錄遍歷與 inode 查詢。

eBPF 在用戶空間的 JIT 路徑

eBPF 腳本透過 uBPF JIT 在 x86-64 原生程式碼中執行,無需核心介入。記憶體安全靠 pointer cage:JIT 輸出的每個記憶體存取指令都被遮罩為腳本 arena 內的偏移,這是無需核心 BPF verifier 的純軟體隔離,代價是只能透過 helper API 進行 I/O 操作。2ms 搶佔計時器確保腳本不阻塞 io_uring 事件迴圈超過一個調度週期。

閒置記憶體約 15 MB PSS,程式碼頁面跨多個 process 共享;TLS 1.3、Encrypted Client Hello、SNI 憑證選取、JA4 指紋均為零設定內建。

原始來源:su3.io blogGitHub losfair/zeroserve


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