SSD 咨询 - Linux 内核 Pipapo 存在双重释放本地权限提升(LPE)问题

主要内容总结:

  • 漏洞发现:Linux 内核 NFT 子系统的pipapo set模块存在严重的双重释放漏洞,未授权攻击者可通过发送特制netlink消息利用该漏洞,引发高稳定性的双重释放错误,进而实现本地权限提升。
  • 相关人员:由 Slavin 和 Le Premier Homme 两位独立安全研究员在 SSD Secure Disclosure 的协助下发现。
  • 厂商响应:已通知 Linux 厂商该漏洞,但自 2025 年 2 月 17 日起未提供任何更新,虽有补丁https://patchwork.ozlabs.org/project/netfilter-devel/patch/20250127234904.407398-1-pablo@netfilter.org/,但不清楚是否已合并。
  • 受影响版本:Linux 内核版本 5.6-rc1 至 6.13-rc3,需满足CONFIG_INIT_STACK_ALL_ZERO=nCONFIG_NETFILTER=yCONFIG_NF_TABLES=yCONFIG_USER_NS=y且具备CAP_NET_ADMIN能力,其中CONFIG_INIT_STACK_ALL_ZERO必须设为n,因未初始化局部变量会触发漏洞,部分发行版如 Red Hat Enterprise Linux 默认未启用该选项。
  • 技术分析:在net/netfilter/nf_tables_api.cnft_add_set_elem函数中,当CONFIG_INIT_STACK_ALL_ZERO配置选项未设置时,elem在栈中未初始化,函数使用用户传入的NFTA_SET_ELEM_KEY初始化elem内容,但只设置到klen,剩余部分为先前留在栈上的未初始化数据,其确切内容可能因内核版本和编译器而异,实验发现大多为指针,会污染键导致双重释放,删除元素时会触发两次释放elem_priv,大小从 32 字节到 256 字节不等,给攻击者提供了额外能力,该漏洞类似[CVE-2023-4004],但还需CONFIG_INIT_STACK_ALL_ZERO未设置。
  • 建议修复:在nf_tables_api.cnft_add_set_elem函数中对变量struct nft_set_elem elem添加零初始化,启用CONFIG_INIT_STACK_ALL_ZERO内核编译选项也可缓解漏洞。
  • 利用示例(PoC):提供了poc.c代码,通过一系列nftnl函数操作设置表和pipapo set,然后进行两次释放操作来触发漏洞;还有exp_usma.c代码,通过多个阶段实现泄露地址以绕过 KASLR、构建任意写原语、执行权限提升和容器逃逸等功能,包括创建fuse文件系统、利用nft链和各种系统调用等操作。
阅读 34
0 条评论