Nftables漏洞原理分析(CVE-2022-32250)

💡 原文中文,约9300字,阅读约需23分钟。
📝

内容提要

nftables中的CVE-2022-32250漏洞是由于处理集合时存在uaf漏洞。攻击者可以通过创建特定的set和lookup表达式来触发漏洞。

🔎

延伸解读

漏洞触发条件与利用路径

根据文章分析,触发CVE-2022-32250需要创建三个set:第一个set(如set_stable)用于提供lookup表达式的搜索目标;第二个set(如set_trigger)在创建时附带lookup表达式,该表达式绑定到第一个set,但由于lookup表达式缺少NFT_EXPR_STATEFUL标志,会被销毁,然而销毁时因set->bindings非空而未能从链表中移除,导致残留指针;第三个set(如set_uaf)再次创建lookup表达式并绑定到第一个set,此时会将新表达式链接到已释放的残留指针上,从

关键缺陷:表达式创建与校验顺序不当

文章指出,在nft_set_elem_expr_alloc函数中,先调用nft_expr_init创建表达式,再检查其类型标志是否包含NFT_EXPR_STATEFUL。若不包含,则跳转到错误处理并销毁表达式。这种先创建后校验的顺序,使得即使表达式最终不被接受,其初始化过程已经完成,可能产生副作用。对于lookup表达式,其初始化时会绑定到指定的set,而销毁时又因绑定关系未解除而无法彻底清理,为后续UAF埋下隐患。

绑定机制与销毁逻辑的冲突

lookup表达式通过nft_set_binding结构体中的list成员挂接到set的bindings链表上,用于维护同一set下的多个表达式。当表达式因标志位校验失败而销毁时,会调用nft_lookup_destroy,进而调用nf_tables_destroy_set。该函数仅在set的bindings链表为空且set为匿名时才会执行销毁操作。由于此时bindings链表非空(表达式已绑定),销毁操作被跳过,导致表达式内存被释放后,其binding节点仍留在set的bindings链表中,形成悬空指针。

❓

Q&A

CVE-2022-32250漏洞的根本原因是什么?

该漏洞是由于nftables在处理集合时存在的使用后释放(uaf)漏洞。

攻击者如何利用CVE-2022-32250漏洞?

攻击者可以通过创建特定的集合和查找表达式来触发该漏洞。

在验证CVE-2022-32250漏洞时需要哪些环境配置?

需要在ubuntu20环境下搭建,包括特定的QEMU和Linux内核配置。

CVE-2022-32250漏洞的影响是什么?

该漏洞可能导致攻击者在系统中执行任意代码,影响系统安全性。

如何创建集合以触发CVE-2022-32250漏洞?

可以通过创建多个集合并链接已释放的查找表达式来触发漏洞。

CVE-2022-32250漏洞的检测是如何进行的?

使用KASAN工具可以检测到该漏洞的存在,特别是在处理集合时。

🏷️

标签

➡️

继续阅读