資安雷達 2026 年 10 月 13 日

2026-10-13 — quinn-proto 一天六則遠端 DoS 公告,五個封包就能 panic

primary=https://rustsec.org/advisories/RUSTSEC-2026-0338.html primary=https://rustsec.org/advisories/RUSTSEC-2026-0340.html primary=https://rustsec.org/packages/quinn-proto.html

quinn-proto 一天公告六則遠端 DoS,最小的觸發只要五個 QUIC 封包

RustSec · 2026-10-12

Rust QUIC 協定實作 quinn-proto 在同一天被 RustSec 掛上六則弱點公告,編號 RUSTSEC-2026-0338 到 RUSTSEC-2026-0343。共同點是遠端對等端不需認證,就能讓你的 QUIC 端點 panic 或吃光記憶體。其中三則在 RustSec 套件索引頁標為 HIGH。

這六則的發布日都是 2026-10-12。我們實際讀完全文的是 0338 與 0340,其餘四則只讀到套件索引頁上的一行摘要,細節以下文標註為準。

六則公告一覽

編號問題(依索引頁摘要)索引頁嚴重度
RUSTSEC-2026-0338unordered 讀取模式下,零長度 STREAM frame 可使程式 panic未標示
RUSTSEC-2026-0339待處理的 connection ID 退役項目無上限成長未標示
RUSTSEC-2026-0340對等端的最小 ACK 延遲在啟用 ACK_FREQUENCY 時可使程式 panicHIGH
RUSTSEC-2026-0341繞過 stream 重組的記憶體耗盡防護HIGH
RUSTSEC-2026-0342零長度 DATAGRAM frame 繞過接收緩衝上限未標示
RUSTSEC-2026-0343datagram 傳送緩衝的計帳錯誤可使傳送端 panicHIGH

同一個套件今年已有前科:索引頁還列著 2026-06-22 的 RUSTSEC-2026-0185(無上限的亂序 stream 重組導致記憶體耗盡)與 2026-03-09 的 RUSTSEC-2026-0037。0341 就是繞過這類防護的新手法。

漏洞機制:兩個讀過全文的例子

0338 是不變量被空區間破壞。應用程式啟用 unordered 讀取後,quinn-proto 用 RangeSet 記錄已收到的資料範圍來去重。若 STREAM frame 的 payload 是空的,iterator 的 Drop 實作仍會插入一個空區間,違反「集合內區間皆非空」的假設,之後重疊的 frame 就會 panic。公告指出,遠端只要送五個小型 STREAM frame、其中兩個零長度即可觸發。預設的 ordered 讀取不受影響。

0340 是標準庫 Duration::clamp 的前置條件被對等端打破。啟用 ACK_FREQUENCY 傳送(TransportConfig::ack_frequency_config(Some(..)))時,AckFrequencyState::candidate_max_ack_delay 會用對等端宣告的最小 ACK 延遲當下界。公告舉的例子:對等端宣告最小延遲 100 ms、最大延遲 100 ms,RTT 為 5 ms 時,clamp 的下界變成 100 ms、上界卻只有 25 ms,下界大於上界便 panic。這組參數能通過 transport parameter 的驗證。公告給的 CVSS 3.1 為 7.5,向量 AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H,只影響可用性。

// before:下界可能大於上界,clamp 直接 panic
delay.clamp(peer_min, upper)
// after(0.11.18):以明確的 min / max 邊界計算

上面是示意,不是原始 diff。兩個例子的共通模式是:協定欄位通過了格式檢查,卻違反內部函式的前置條件,而 Rust 在這種情況下選擇 panic,於是遠端輸入直接變成程序崩潰。

受影響版本與觸發條件

  • 0338:公告列出修補版本 >=0.11.18,僅在應用程式啟用 unordered 讀取時受影響。
  • 0340:修補版本同為 >=0.11.18,<0.11.0 不受影響;僅在啟用 ACK_FREQUENCY 傳送(預設關閉)時受影響。
  • 0339、0341、0342、0343:本文未讀到內文,修補版本請直接查各公告頁,不要假設與 0338 相同。

0338 與 0340 的公告都引用了 quinn-rs/quinn 的 PR #2868 作為修補。兩則的 GHSA 分別為 GHSA-465w-v9q3-7j98 與 GHSA-3g6h-r5qx-f6hq,公告皆未列 CVE。

影響範圍與該檢查什麼

直接依賴 quinn 或 quinn-proto 的服務都要查:自架的 QUIC 伺服器、HTTP/3 閘道,以及透過其他 crate 間接引入它的專案。用 cargo tree -i quinn-proto 能看出誰把它拉進來。

不同設定的暴露面不同:沒開 unordered 讀取與 ACK_FREQUENCY 的服務,不會踩到 0338 與 0340,但記憶體類與 datagram 類問題與這些選項無關的部分,需逐則確認。另一個實務重點是這些 panic 在每條連線的驅動路徑上發生,若你的程式沒有隔離連線任務,單一惡意對等端就可能拖垮整個程序。

修補與緩解

升級到 quinn-proto 的 0.11.18 或更新版本,是 0338 與 0340 公告明列的修補。0338 的修法是讓 RangeSet::replace 忽略空區間;0340 的修法是改用明確的最小、最大邊界計算延遲。公告未提供不升級的緩解方式,只有「不啟用相關選項」可降低 0338、0340 的暴露,這不能取代升級。

公告頁未載明 0338 的 CVSS 分數,也未提供其他四則的修補細節,本文不補完。

原始來源:RUSTSEC-2026-0338、RUSTSEC-2026-0340、RustSec quinn-proto 索引


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