rsyslog mmpstrucdata 改用動態緩衝區修復溢位
oss-security mailing list(Rainer Gerhards)· 2026-09-20
mmpstrucdata 模組原本把 RFC 5424 結構化資料的參數值複製進一個固定 32 KiB 的堆疊緩衝區,沒有做長度檢查;修補後改成依實際收到的長度動態配置儲存空間,並加上結構化資料的長度上限。這個修補其實已經隨 8.2606.0(2026 年 6 月排定的穩定版快照)出貨,但對應的資安通報直到 2026 年 9 月 20 日才由 Rainer Gerhards 在 oss-security 信件列表公開,GitHub Security Advisory GHSA-2whq-6rcm-64m8 同步發布,回報者是 Georgii Shutiaev(@gart0s)。目前尚未取得 CVE 編號,advisory 頁面標示為「No known CVE」。
漏洞機制
問題出在 mmpstrucdata 解析 RFC 5424 structured-data 欄位時的實作:參數值被直接複製進一個大小固定的堆疊緩衝區,卻沒有針對輸入長度做邊界檢查。當某個結構化資料參數值超過 32 KiB,多出來的內容會直接覆寫堆疊上的其他資料,導致 rsyslogd 行程崩潰、服務中斷。GHSA 頁面把攻擊條件寫得很明確:未經驗證的網路傳送端只要能送出一則刻意構造的 RFC 5424 訊息給受影響的 rsyslog 實例,就能觸發這個崩潰。目前沒有證據顯示可以藉此執行任意程式碼,advisory 也明確寫「未展示也未宣稱有程式碼執行」。
| 項目 | 8.2606.0 之前 | 8.2606.0 及之後 |
|---|---|---|
| 結構化資料緩衝區 | 固定 32 KiB 堆疊緩衝區 | 依實際收到長度動態配置 |
| 長度上限檢查 | 無 | 新增結構化資料長度上限 |
| 超長參數值的結果 | 覆寫堆疊、daemon 終止 | 被上限擋下,daemon 不受影響 |
受影響版本
受影響範圍是所有低於 8.2606.0 的 rsyslog 版本,但真正會被觸發需要同時滿足幾個條件,並非預設安裝就會中獎:
- 系統載入並實際使用
mmpstrucdata解析 RFC 5424 structured-data(模組預設不啟用) - 全域最大訊息長度被調高到超過預設值——advisory 指出預設上限本身低於能觸發溢位的門檻
- 允許來自網路、未經驗證的傳送端送入這類大訊息的收訊管線
換句話說,會受影響的多半是把 rsyslog 當成集中收集大型 RFC 5424 結構化日誌的中樞、且為此特意調高過訊息長度上限的環境;只單純轉送、不解析 structured-data 的一般日誌管線不受影響。
修補與緩解
官方建議直接升級到 8.2606.0 或更新版本,advisory 的 Patches 段落寫明修補內容:拿掉固定堆疊緩衝區、改用依結構化資料實際長度配置的儲存空間,並加入了大型 structured-data 訊息與長度上限的回歸測試。若暫時無法升級,advisory 給的緩解方式是停用或不要載入 mmpstrucdata,或是把全域最大訊息長度維持在預設值——這樣訊息就到不了會觸發溢位的長度,但官方仍把升級列為建議做法。使用發行版套件的使用者,應該對照自己發行版的資安公告或套件 changelog,確認是否已回溯(backport)這個修補。
原始來源:oss-security:rsyslog mmpstrucdata denial of service fixed in 8.2606.0、GHSA-2whq-6rcm-64m8、rsyslog 8.2606.0 release notes