CVE-2024-47716

ARM: 9410/1: vfp: Use asm volatile in fmrx/fmxr macros

published October 21, 2024

CVSS
—
EPSS
0%
Percentile
11.7
In the wild
Unconfirmed
What it is

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

ARM: 9410/1: vfp: Use asm volatile in fmrx/fmxr macros

Floating point instructions in userspace can crash some arm kernels

built with clang/LLD 17.0.6:

BUG: unsupported FP instruction in kernel mode

FPEXC == 0xc0000780

Internal error: Oops - undefined instruction: 0 [#1] ARM

CPU: 0 PID: 196 Comm: vfp-reproducer Not tainted 6.10.0 #1

Hardware name: BCM2835

PC is at vfp_support_entry+0xc8/0x2cc

LR is at do_undefinstr+0xa8/0x250

pc : [<c0101d50>] lr : [<c010a80c>] psr: a0000013

sp : dc8d1f68 ip : 60000013 fp : bedea19c

r10: ec532b17 r9 : 00000010 r8 : 0044766c

r7 : c0000780 r6 : ec532b17 r5 : c1c13800 r4 : dc8d1fb0

r3 : c10072c4 r2 : c0101c88 r1 : ec532b17 r0 : 0044766c

Flags: NzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment none

Control: 00c5387d Table: 0251c008 DAC: 00000051

Register r0 information: non-paged memory

Register r1 information: vmalloc memory

Register r2 information: non-slab/vmalloc memory

Register r3 information: non-slab/vmalloc memory

Register r4 information: 2-page vmalloc region

Register r5 information: slab kmalloc-cg-2k

Register r6 information: vmalloc memory

Register r7 information: non-slab/vmalloc memory

Register r8 information: non-paged memory

Register r9 information: zero-size pointer

Register r10 information: vmalloc memory

Register r11 information: non-paged memory

Register r12 information: non-paged memory

Process vfp-reproducer (pid: 196, stack limit = 0x61aaaf8b)

Stack: (0xdc8d1f68 to 0xdc8d2000)

1f60: 0000081f b6f69300 0000000f c10073f4 c10072c4 dc8d1fb0

1f80: ec532b17 0c532b17 0044766c b6f9ccd8 00000000 c010a80c 00447670 60000010

1fa0: ffffffff c1c13800 00c5387d c0100f10 b6f68af8 00448fc0 00000000 bedea188

1fc0: bedea314 00000001 00448ebc b6f9d000 00447608 b6f9ccd8 00000000 bedea19c

1fe0: bede9198 bedea188 b6e1061c 0044766c 60000010 ffffffff 00000000 00000000

Call trace:

[<c0101d50>] (vfp_support_entry) from [<c010a80c>] (do_undefinstr+0xa8/0x250)

[<c010a80c>] (do_undefinstr) from [<c0100f10>] (__und_usr+0x70/0x80)

Exception stack(0xdc8d1fb0 to 0xdc8d1ff8)

1fa0: b6f68af8 00448fc0 00000000 bedea188

1fc0: bedea314 00000001 00448ebc b6f9d000 00447608 b6f9ccd8 00000000 bedea19c

1fe0: bede9198 bedea188 b6e1061c 0044766c 60000010 ffffffff

Code: 0a000061 e3877202 e594003c e3a09010 (eef16a10)

---[ end trace 0000000000000000 ]---

Kernel panic - not syncing: Fatal exception in interrupt

---[ end Kernel panic - not syncing: Fatal exception in interrupt ]---

This is a minimal userspace reproducer on a Raspberry Pi Zero W:

#include <stdio.h>

#include <math.h>

int main(void)

{

double v = 1.0;

printf("%fn", NAN + *(volatile double *)&v);

return 0;

}

Another way to consistently trigger the oops is:

calvin@raspberry-pi-zero-w ~$ python -c "import json"

The bug reproduces only when the kernel is built with DYNAMIC_DEBUG=n,

because the pr_debug() calls act as barriers even when not activated.

This is the output from the same kernel source built with the same

compiler and DYNAMIC_DEBUG=y, where the userspace reproducer works as

expected:

VFP: bounce: trigger ec532b17 fpexc c0000780

VFP: emulate: INST=0xee377b06 SCR=0x00000000

VFP: bounce: trigger eef1fa10 fpexc c0000780

VFP: emulate: INST=0xeeb40b40 SCR=0x00000000

VFP: raising exceptions 30000000

calvin@raspberry-pi-zero-w ~$ ./vfp-reproducer

nan

Crudely grepping for vmsr/vmrs instructions in the otherwise nearly

idential text for vfp_support_entry() makes the problem obvious:

vmlinux.llvm.good [0xc0101cb8] <+48>: vmrs r7, fpexc

vmlinux.llvm.good [0xc0101cd8] <+80>: vmsr fpexc, r0

vmlinux.llvm.good [0xc0101d20

---truncated---

The record
Technical detail
CVSS
Not scored
CVSS v4.0
Not supplied
EPSS
0.00219 · 11.7th percentile
Published
2024-10-21T11:53Z
EPSS history
Timeline
  • 21 OCT 11:53Z
    ARM: 9410/1: vfp: Use asm volatile in fmrx/fmxr macros
    cvelistv5