长亭百川云 - 文章详情

Linux内核提权(CVE-2024-1086)

暗影安全

70

2024-07-13

0x00 漏洞简介

Linux内核的netfilter:nf_tables组件中存在释放后使用漏洞,可被利用来实现本地权限提升。 nft_verdict_init() 函数允许在钩子判定中使用正值作为丢弃错误,因此当 NF_DROP 发出类似于 NF_ACCEPT 的丢弃错误时,nf_hook_slow() 函数可能会导致双重释放漏洞。

0x01 漏洞详情

nf_hook_slow()函数:该函数循环遍历链中的所有规则,并在NF_DROP发出时立即停止评估(返回函数) 。

在NF_DROP处理过程中,它释放数据包并允许用户使用设置返回值NF_GET_DROPERR()。NF_ACCEPT在处理时使用 drop 错误使函数返回NF_DROP。经过一系列分析后,发现了一个双重释放。

// looping over existing rules when skb triggers chainint nf_hook_slow(struct sk_buff *skb, struct nf_hook_state *state,

当为 netfilter 挂钩创建判决对象时,内核允许正丢弃错误。这意味着攻击用户可能会导致以下情况,即从钩子/规则返回nf_hook_slow()时释放 skb 对象,然后返回,就像链中的每个钩子/规则都返回一样。这会导致调用者误解情况,并继续解析数据包并最终双重释放它。

// userland API (netlink-based) handler for initializing the verdict

nft_verdict_init()内核函数,构造一个netfilter verdict对象

// looping over existing rules when skb triggers chainint nf_hook_slow(struct sk_buff *skb, struct nf_hook_state *state,

nf_hook_slow()内核函数,它迭代 nftables 规则

static inline int NF_HOOK(uint8_t pf, unsigned int hook, struct net *net, struct sock *sk,

NF_HOOK()内核函数,成功时调用回调函数

双重释放会影响slab缓存struct sk_buff中的对象skbuff_head_cache,以及动态大小的sk_buff->head对象,范围从kmalloc-256直接来自伙伴分配器的最多4个页面(65536字节)与ipv4数据包 。

该sk_buff->head对象kmalloc_reserve()通过__alloc_skb()。这允许我们分配动态大小的对象。因此,我们可以从分配器分配大小从 256 到 65536 字节的完整页面的slab对象。

漏洞详见:https://pwning.tech/nftables/

0x02 影响版本

该漏洞影响从(包括)v5.14 到(包括)v6.6 的版本,不包括修补分支 v5.15.149>、v6.1.76>、v6.6.15>。这些版本的补丁于 2024 年 2 月发布。底层漏洞影响从 v3.15 到 v6.8-rc1 的所有版本(不包括已修补的稳定分支)。

0x03 漏洞验证

验证环境: ubuntu 23.04

0x04参考链接

https://github.com/Notselwyn/CVE-2024-1086

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2