CVE-2021-47189

CVE-2021-47189

High · published April 10, 2024

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

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

btrfs: fix memory ordering between normal and ordered work functions

Ordered work functions aren't guaranteed to be handled by the same thread

which executed the normal work functions. The only way execution between

normal/ordered functions is synchronized is via the WORK_DONE_BIT,

unfortunately the used bitops don't guarantee any ordering whatsoever.

This manifested as seemingly inexplicable crashes on ARM64, where

async_chunk::inode is seen as non-null in async_cow_submit which causes

submit_compressed_extents to be called and crash occurs because

async_chunk::inode suddenly became NULL. The call trace was similar to:

pc : submit_compressed_extents+0x38/0x3d0

lr : async_cow_submit+0x50/0xd0

sp : ffff800015d4bc20

<registers omitted for brevity>

Call trace:

submit_compressed_extents+0x38/0x3d0

async_cow_submit+0x50/0xd0

run_ordered_work+0xc8/0x280

btrfs_work_helper+0x98/0x250

process_one_work+0x1f0/0x4ac

worker_thread+0x188/0x504

kthread+0x110/0x114

ret_from_fork+0x10/0x18

Fix this by adding respective barrier calls which ensure that all

accesses preceding setting of WORK_DONE_BIT are strictly ordered before

setting the flag. At the same time add a read barrier after reading of

WORK_DONE_BIT in run_ordered_work which ensures all subsequent loads

would be strictly ordered after reading the bit. This in turn ensures

are all accesses before WORK_DONE_BIT are going to be strictly ordered

before any access that can occur in ordered_func.

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.00670 · 51.4th percentile
Published
2024-04-10T23:15Z
Affected products (8)
ProductVersionsFixed in
linux/linux_kernel≥ 3.15, < 4.4.2934.4.293
linux/linux_kernel≥ 4.5, < 4.9.2914.9.291
linux/linux_kernel≥ 4.10, < 4.14.2564.14.256
linux/linux_kernel≥ 4.15, < 4.19.2184.19.218
linux/linux_kernel≥ 4.20, < 5.4.1625.4.162
linux/linux_kernel≥ 5.5, < 5.10.825.10.82
linux/linux_kernel≥ 5.11, < 5.15.55.15.5
linux/linux_kernelall versions—
References (16)
https://git.kernel.org/stable/c/45da9c1767ac31857df572f0a909fbe88fd5a7e9 · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/47e6f9f69153247109042010f3a77579e9dc61ff · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/637d652d351fd4f263ef302dc52f3971d314e500 · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/670f6b3867c8f0f11e5097f353b164cecfec6179 · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/6adbc07ebcaf8bead08b21687d49e0fc94400987 · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/804a9d239ae9cbe88e861a7cd62319cc6ec7b136 · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/bd660a20fea3ec60a49709ef5360f145ec0fe779 · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/ed058d735a70f4b063323f1a7bb33cda0f987513 · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/45da9c1767ac31857df572f0a909fbe88fd5a7e9 · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/47e6f9f69153247109042010f3a77579e9dc61ff · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/637d652d351fd4f263ef302dc52f3971d314e500 · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/670f6b3867c8f0f11e5097f353b164cecfec6179 · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/6adbc07ebcaf8bead08b21687d49e0fc94400987 · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/804a9d239ae9cbe88e861a7cd62319cc6ec7b136 · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/bd660a20fea3ec60a49709ef5360f145ec0fe779 · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/ed058d735a70f4b063323f1a7bb33cda0f987513 · af854a3a-2127-422b-91ae-364da2661108
EPSS history
Timeline
  • 10 APR 18:56Z
    btrfs: fix memory ordering between normal and ordered work functions
    cvelistv5