摘要

研究報告深入技術分析 CVE-2026-55407 ,這是在 buffa 程式庫中發現的嚴重記憶體放大(Memory-amplification)阻斷服務(DoS)漏洞。該漏洞經由 AI 增強的靜態分析安全測試(AI-SAST)發現,突顯了現代記憶體安全語言(如 Rust)在處理未受信任的序列化資料時仍存在顯著風險。攻擊者可藉由利用 Protocol Buffers(Protobuf)規格中的 StartGroup LengthDelimited 線路型別,達成約 22 倍的記憶體放大倍率,進而因記憶體不足(Out-Of-Memory, OOM)錯誤導致行程終止。報告剖析此漏洞的資料流、評估其對高效能系統的影響,並與當代記憶體安全研究進行比較。

AI-SAST 抓出 Rust 的盲區?Protobuf 記憶體放大 22 倍,阻斷服務如何悄悄降臨! | 資訊安全新聞

1. 簡介

Protocol Buffers 廣泛用於分散式系統中高效的資料序列化。然而,解碼邏輯的複雜性,尤其是向前相容與未知欄位處理,引入了細微的安全風險。CVE-2026-55407 專門針對 buffa 程式庫,這是 Anthropic 開發的高效能 Rust 實作。儘管 Rust 提供了強大的記憶體安全保證,可防範空間與時間性的記憶體錯誤,但其本質上並不能預防邏輯性的資源耗盡漏洞 [1] 。報告聚焦於未知欄位解碼器中無限制的記憶體配置,如何被武器化以引發阻斷服務

2. 漏洞機制:無限制的資料流

此漏洞的核心位於 encoding.rs 中的 decode_unknown_field 函式。當解碼器遇到未定義於訊息綱要中的欄位時,會嘗試保留該資料以維持向前相容性。AI-SAST 引擎標記了從未受信任的長度前綴到堆積記憶體配置的直接資料流 [1]

2.1. 扁平接收點分析:長度分隔(LengthDelimited)欄位

LengthDelimited 分支中,解碼器會讀取一個代表欄位長度的 varint ,並立即配置大小為該長度的 Vec<u8> 。雖然程式會檢查緩衝區是否含有足夠的資料,但並未對配置大小本身設定上限。

  1. // Source: encoding.rs:490-499
  2. // Analysis: Direct allocation based on attacker-controlled 'len'
  3. WireType::LengthDelimited => {
  4. let len = decode_varint(buf)?; // Source: len parsed from wire data
  5. let len = usize::try_from(len).map_err(|_| DecodeError::MessageTooLarge)?;
  6. if buf.remaining() < len {
  7. return Err(DecodeError::UnexpectedEof); // Ensures data exists, but not bounded
  8. }
  9. let mut data = alloc::vec![0u8; len]; // Sink: attacker-sized allocation
  10. buf.copy_to_slice(&mut data);
  11. UnknownFieldData::LengthDelimited(data)
  12. }

儘管此接收點允許 1:1 的配置與輸入比例,但總記憶體消耗仍受限於最大訊息大小。然而,許多實作中的預設上限常設為 2 GiB,這已足夠耗盡許多容器化環境的記憶體。

3. 進階利用:22 倍的記憶體放大

CVE-2026-55407 最嚴重的部分出現在 StartGroup 線路型別的處理過程中。 不同於扁平欄位,群組允許巢狀結構。漏洞的成因在於,解碼器會為群組內的每個巢狀欄位配置固定大小的堆積結構,無論該欄位的實際資料大小為何 [1]

3.1. 漏洞解碼流程的循序圖

sequenceDiagram participant Attacker participant Decoder as buffa::decode_unknown_field participant Heap as Memory Allocation Attacker->>Decoder: Send StartGroup Tag Decoder->>Heap: Allocate UnknownFields Vec loop For each nested field Attacker->>Decoder: Send 2-byte Varint (Tag + Value) Decoder->>Decoder: Recurse into decode_unknown_field Decoder->>Heap: Allocate UnknownField struct (~40 bytes) Decoder->>Heap: Push to nested fields Vec (Triggering reallocs) end Attacker->>Decoder: Send EndGroup Tag Decoder-->>Attacker: Return Group Object (Massive Heap Consumption)

3.2. 程式碼分析:StartGroup 遞迴配置

以下程式碼片段顯示,單一群組內缺乏欄位數量的上限檢查。雖然遞迴深度有檢查,但廣度(欄位數量)並未受限制。

  1. // Source: encoding.rs:500-520
  2. // Analysis: Every 2 bytes of input triggers a ~40-byte allocation
  3. WireType::StartGroup => {
  4. let depth = depth
  5. .checked_sub(1)
  6. .ok_or(DecodeError::RecursionLimitExceeded)?; // Bounds DEPTH, not COUNT
  7. let group_field_number = tag.field_number();
  8. let mut nested = UnknownFields::new();
  9. loop {
  10. let nested_tag = Tag::decode(buf)?;
  11. if nested_tag.wire_type() == WireType::EndGroup {
  12. if nested_tag.field_number() != group_field_number {
  13. return Err(DecodeError::InvalidEndGroup(nested_tag.field_number()));
  14. }
  15. break;
  16. }
  17. // Vulnerable Sink: Each iteration pushes a 40-byte struct to the Vec
  18. nested.push(decode_unknown_field(nested_tag, buf, depth)?);
  19. }
  20. UnknownFieldData::Group(nested)
  21. }

在 64 位元目標上,每個 UnknownField 結構約佔 40 位元組。由於線路上最小的有效欄位(零值 varint)僅 2 位元組,攻擊者可達成 20 倍的放大倍率。若計入 Vec 成長的開銷,則可達約 22 倍 [1]

4. 與當代研究的比較分析

CVE-2026-55407 的發現,與更廣泛的 Rust 關鍵系統安全研究相互呼應。例如, 前期文章 上有關 Windows Kernel GDI 中 Rust 的研究 [2] 指出,記憶體安全並不等於全面安全。這兩個案例皆顯示,資源管理中的邏輯缺陷——無論是在 GDI 中繼檔處理或是 Protobuf 解碼——都可能導致系統層級的不穩定。

特徵 CVE-2026-55407 (buffa) Windows Kernel GDI (Rust)
程式語言 Rust Rust
漏洞類型 記憶體放大 (阻斷服務) 邏輯錯誤 / 核心恐慌
發現方式 AI-SAST 資料流追蹤 目標導向模糊測試 (WinAFL)
根本原因 無限制的配置 複雜的介面互動

此外,Protocol Buffers 在惡意軟體(如 ResolverRAT )中的使用,正如 ResolverRAT 入侵解密 [3] 所討論,突顯了安全序列化的重要性。在 ResolverRAT 中,ProtoBuf 被用於混淆 C2 流量,增加網路分析的難度。反之,在 buffa 中,解碼器本身成為攻擊目標,將合法的序列化格式轉變為阻斷服務的攻擊向量。

5. 影響評估

此漏洞的影響程度為「中等」(CVSS 6.3),但在特定的部署情境下可能達到「高」風險。自動解碼未受信任 Protobuf 訊息的系統——例如 gRPC 閘道、訊息佇列或邊緣代理——均面臨立即風險。一個 64 MiB 的 payload 可膨脹至 1.4 GB 的堆積記憶體,輕易超過許多微服務的限制,並在 cluster 中引發連鎖故障。

6. 緩解措施與結論

CVE-2026-55407 的主要緩解方式是將 buffa 程式庫升級至 0.8.0 或更新版本。開發者也應實作明確的配置預算,並嚴格強制最大訊息大小。此案例證明,安全掃描工具必須超越簡單的樣式比對。AI-SAST 成功識別此漏洞,顯示追蹤從未受信任來源到配置接收點的資料流,對於確保現代記憶體安全應用程式的安全性至關重要。