漏洞預(yù)警:CVE-2024-26809 利用 nftables 雙重釋放漏洞獲取 Root 權(quán)限
漏洞概述
Linux內(nèi)核的nftables子系統(tǒng)(特別是net/netfilter模塊)中發(fā)現(xiàn)一個(gè)高危漏洞,攻擊者可利用nft_pipapo_destroy()函數(shù)中的雙重釋放(double-free)漏洞實(shí)現(xiàn)本地提權(quán)。該漏洞編號(hào)為CVE-2024-26809,影響內(nèi)核版本6.1-rc1及以上以及5.15.54及以上的系統(tǒng)。
技術(shù)原理
該漏洞源于nftables數(shù)據(jù)包過濾功能中pipapo集合銷毀過程的邏輯缺陷。在特定條件下,某個(gè)元素可能同時(shí)存在于match和clone中,導(dǎo)致函數(shù)嘗試對(duì)同一內(nèi)存區(qū)域執(zhí)行兩次釋放操作,從而引發(fā)內(nèi)存損壞。
問題函數(shù)關(guān)鍵片段:
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);
...
當(dāng)dirty標(biāo)志被設(shè)置時(shí),該函數(shù)會(huì)對(duì)重疊的內(nèi)存區(qū)域錯(cuò)誤地調(diào)用兩次nft_set_pipapo_match_destroy()。
利用方式
CVE-2024-26809的利用過程涉及通過內(nèi)核對(duì)象緩存系統(tǒng)(特別是kmalloc-256)進(jìn)行堆布局和操控。攻擊者通過精心設(shè)計(jì)的內(nèi)存分配與釋放操作實(shí)現(xiàn):
- 重疊nftables對(duì)象
- 泄露內(nèi)核地址
- 劫持函數(shù)指針(如expr->ops->dump)
- 執(zhí)行ROP(返回導(dǎo)向編程)指令鏈獲取root權(quán)限
技術(shù)分析指出:"完成棧遷移后,我們可以運(yùn)行ROPgadget并最終獲得root shell"。該攻擊展示了攻擊者對(duì)內(nèi)核內(nèi)存結(jié)構(gòu)的深入理解,以及如何將細(xì)微的內(nèi)存錯(cuò)誤武器化以實(shí)現(xiàn)完全系統(tǒng)控制。
修復(fù)建議
目前已有可用的概念驗(yàn)證(PoC)漏洞利用代碼,演示了如何串聯(lián)該漏洞實(shí)現(xiàn)內(nèi)核代碼執(zhí)行。受影響內(nèi)核版本的用戶應(yīng)立即更新系統(tǒng)以應(yīng)用相關(guān)補(bǔ)丁,消除CVE-2024-26809帶來的安全風(fēng)險(xiǎn)。