漏洞預警:CVE-2024-26809 利用 nftables 雙重釋放漏洞獲取 Root 權限
漏洞概述
Linux內核的nftables子系統(特別是net/netfilter模塊)中發現一個高危漏洞,攻擊者可利用nft_pipapo_destroy()函數中的雙重釋放(double-free)漏洞實現本地提權。該漏洞編號為CVE-2024-26809,影響內核版本6.1-rc1及以上以及5.15.54及以上的系統。
技術原理
該漏洞源于nftables數據包過濾功能中pipapo集合銷毀過程的邏輯缺陷。在特定條件下,某個元素可能同時存在于match和clone中,導致函數嘗試對同一內存區域執行兩次釋放操作,從而引發內存損壞。
問題函數關鍵片段:
static void nft_pipapo_destroy(const struct nft_ctx *ctx, const struct nft_set *set) {
struct nft_pipapo *priv = nft_set_priv(set);
struct nft_pipapo_match *m;
int cpu;
m = rcu_dereference_protected(priv->match, true);
if (m) {
...
nft_set_pipapo_match_destroy(ctx, set, m);
...
}
if (priv->clone) {
m = priv->clone;
if (priv->dirty)
nft_set_pipapo_match_destroy(ctx, set, m);
...
當dirty標志被設置時,該函數會對重疊的內存區域錯誤地調用兩次nft_set_pipapo_match_destroy()。
利用方式
CVE-2024-26809的利用過程涉及通過內核對象緩存系統(特別是kmalloc-256)進行堆布局和操控。攻擊者通過精心設計的內存分配與釋放操作實現:
- 重疊nftables對象
- 泄露內核地址
- 劫持函數指針(如expr->ops->dump)
- 執行ROP(返回導向編程)指令鏈獲取root權限
技術分析指出:"完成棧遷移后,我們可以運行ROPgadget并最終獲得root shell"。該攻擊展示了攻擊者對內核內存結構的深入理解,以及如何將細微的內存錯誤武器化以實現完全系統控制。
修復建議
目前已有可用的概念驗證(PoC)漏洞利用代碼,演示了如何串聯該漏洞實現內核代碼執行。受影響內核版本的用戶應立即更新系統以應用相關補丁,消除CVE-2024-26809帶來的安全風險。