CVE-2024-40958CWE-416

CVE-2024-40958

High · published July 12, 2024

CVSS v3.1
7.8
EPSS
0%
Percentile
18.1
In the wild
Unconfirmed
What it is

In the Linux kernel, the following vulnerability has been resolved:

netns: Make get_net_ns() handle zero refcount net

Syzkaller hit a warning:

refcount_t: addition on 0; use-after-free.

WARNING: CPU: 3 PID: 7890 at lib/refcount.c:25 refcount_warn_saturate+0xdf/0x1d0

Modules linked in:

CPU: 3 PID: 7890 Comm: tun Not tainted 6.10.0-rc3-00100-gcaa4f9578aba-dirty #310

Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.15.0-1 04/01/2014

RIP: 0010:refcount_warn_saturate+0xdf/0x1d0

Code: 41 49 04 31 ff 89 de e8 9f 1e cd fe 84 db 75 9c e8 76 26 cd fe c6 05 b6 41 49 04 01 90 48 c7 c7 b8 8e 25 86 e8 d2 05 b5 fe 90 <0f> 0b 90 90 e9 79 ff ff ff e8 53 26 cd fe 0f b6 1

RSP: 0018:ffff8881067b7da0 EFLAGS: 00010286

RAX: 0000000000000000 RBX: 0000000000000000 RCX: ffffffff811c72ac

RDX: ffff8881026a2140 RSI: ffffffff811c72b5 RDI: 0000000000000001

RBP: ffff8881067b7db0 R08: 0000000000000000 R09: 205b5d3730353139

R10: 0000000000000000 R11: 205d303938375420 R12: ffff8881086500c4

R13: ffff8881086500c4 R14: ffff8881086500b0 R15: ffff888108650040

FS: 00007f5b2961a4c0(0000) GS:ffff88823bd00000(0000) knlGS:0000000000000000

CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033

CR2: 000055d7ed36fd18 CR3: 00000001482f6000 CR4: 00000000000006f0

DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000

DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400

Call Trace:

<TASK>

? show_regs+0xa3/0xc0

? __warn+0xa5/0x1c0

? refcount_warn_saturate+0xdf/0x1d0

? report_bug+0x1fc/0x2d0

? refcount_warn_saturate+0xdf/0x1d0

? handle_bug+0xa1/0x110

? exc_invalid_op+0x3c/0xb0

? asm_exc_invalid_op+0x1f/0x30

? __warn_printk+0xcc/0x140

? __warn_printk+0xd5/0x140

? refcount_warn_saturate+0xdf/0x1d0

get_net_ns+0xa4/0xc0

? __pfx_get_net_ns+0x10/0x10

open_related_ns+0x5a/0x130

__tun_chr_ioctl+0x1616/0x2370

? __sanitizer_cov_trace_switch+0x58/0xa0

? __sanitizer_cov_trace_const_cmp2+0x1c/0x30

? __pfx_tun_chr_ioctl+0x10/0x10

tun_chr_ioctl+0x2f/0x40

__x64_sys_ioctl+0x11b/0x160

x64_sys_call+0x1211/0x20d0

do_syscall_64+0x9e/0x1d0

entry_SYSCALL_64_after_hwframe+0x77/0x7f

RIP: 0033:0x7f5b28f165d7

Code: b3 66 90 48 8b 05 b1 48 2d 00 64 c7 00 26 00 00 00 48 c7 c0 ff ff ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 b8 10 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 81 48 2d 00 8

RSP: 002b:00007ffc2b59c5e8 EFLAGS: 00000246 ORIG_RAX: 0000000000000010

RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f5b28f165d7

RDX: 0000000000000000 RSI: 00000000000054e3 RDI: 0000000000000003

RBP: 00007ffc2b59c650 R08: 00007f5b291ed8c0 R09: 00007f5b2961a4c0

R10: 0000000029690010 R11: 0000000000000246 R12: 0000000000400730

R13: 00007ffc2b59cf40 R14: 0000000000000000 R15: 0000000000000000

</TASK>

Kernel panic - not syncing: kernel: panic_on_warn set ...

This is trigger as below:

ns0 ns1

tun_set_iff() //dev is tun0

tun->dev = dev

//ip link set tun0 netns ns1

put_net() //ref is 0

__tun_chr_ioctl() //TUNGETDEVNETNS

net = dev_net(tun->dev);

open_related_ns(&net->ns, get_net_ns); //ns1

get_net_ns()

get_net() //addition on 0

Use maybe_get_net() in get_net_ns in case net's ref is zero to fix this

The record
Technical detail
CVSS v3.1
7.8 · HIGH
Vector
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CVSS v4.0
Not supplied
EPSS
0.00269 · 18.1th percentile
Weakness
CWE-416 · Use After Free
Published
2024-07-12T17:15Z
Affected products (10)
ProductVersionsFixed in
linux/linux_kernel≥ 5.2, < 5.4.2795.4.279
linux/linux_kernel≥ 5.5, < 5.10.2215.10.221
linux/linux_kernel≥ 5.11, < 5.15.1625.15.162
linux/linux_kernel≥ 5.16, < 6.1.966.1.96
linux/linux_kernel≥ 6.2, < 6.6.366.6.36
linux/linux_kernel≥ 6.7, < 6.9.76.9.7
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
References (18)
https://git.kernel.org/stable/c/1b631bffcb2c09551888f3c723f4365c91fe05ef · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/2b82028a1f5ee3a8e04090776b10c534144ae77b · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/3a6cd326ead7c8bb1f64486789a01974a9f1ad55 · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/3af28df0d883e8c89a29ac31bc65f9023485743b · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/cb7f811f638a14590ff98f53c6dd1fb54627d940 · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/ef0394ca25953ea0eddcc82feae1f750451f1876 · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/ff960f9d3edbe08a736b5a224d91a305ccc946b0 · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/1b631bffcb2c09551888f3c723f4365c91fe05ef · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/2b82028a1f5ee3a8e04090776b10c534144ae77b · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/3a6cd326ead7c8bb1f64486789a01974a9f1ad55 · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/3af28df0d883e8c89a29ac31bc65f9023485743b · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/cb7f811f638a14590ff98f53c6dd1fb54627d940 · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/ef0394ca25953ea0eddcc82feae1f750451f1876 · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/ff960f9d3edbe08a736b5a224d91a305ccc946b0 · af854a3a-2127-422b-91ae-364da2661108https://lists.debian.org/debian-lts-announce/2025/01/msg00001.html · af854a3a-2127-422b-91ae-364da2661108https://cert-portal.siemens.com/productcert/html/ssa-265688.html · 0b142b55-0307-4c5a-b3c9-f314f3fb7c5ehttps://cert-portal.siemens.com/productcert/html/ssa-355557.html · 0b142b55-0307-4c5a-b3c9-f314f3fb7c5ehttps://cert-portal.siemens.com/productcert/html/ssa-613116.html · 0b142b55-0307-4c5a-b3c9-f314f3fb7c5e
EPSS history
Timeline
  • 12 JUL 12:32Z
    netns: Make get_net_ns() handle zero refcount net
    cvelistv5