CVE-2021-47189
Severity CVSS v4.0:
Pending analysis
Type:
Unavailable / Other
Publication date:
10/04/2024
Last modified:
30/04/2025
Description
In the Linux kernel, the following vulnerability has been resolved:<br />
<br />
btrfs: fix memory ordering between normal and ordered work functions<br />
<br />
Ordered work functions aren&#39;t guaranteed to be handled by the same thread<br />
which executed the normal work functions. The only way execution between<br />
normal/ordered functions is synchronized is via the WORK_DONE_BIT,<br />
unfortunately the used bitops don&#39;t guarantee any ordering whatsoever.<br />
<br />
This manifested as seemingly inexplicable crashes on ARM64, where<br />
async_chunk::inode is seen as non-null in async_cow_submit which causes<br />
submit_compressed_extents to be called and crash occurs because<br />
async_chunk::inode suddenly became NULL. The call trace was similar to:<br />
<br />
pc : submit_compressed_extents+0x38/0x3d0<br />
lr : async_cow_submit+0x50/0xd0<br />
sp : ffff800015d4bc20<br />
<br />
<br />
<br />
Call trace:<br />
submit_compressed_extents+0x38/0x3d0<br />
async_cow_submit+0x50/0xd0<br />
run_ordered_work+0xc8/0x280<br />
btrfs_work_helper+0x98/0x250<br />
process_one_work+0x1f0/0x4ac<br />
worker_thread+0x188/0x504<br />
kthread+0x110/0x114<br />
ret_from_fork+0x10/0x18<br />
<br />
Fix this by adding respective barrier calls which ensure that all<br />
accesses preceding setting of WORK_DONE_BIT are strictly ordered before<br />
setting the flag. At the same time add a read barrier after reading of<br />
WORK_DONE_BIT in run_ordered_work which ensures all subsequent loads<br />
would be strictly ordered after reading the bit. This in turn ensures<br />
are all accesses before WORK_DONE_BIT are going to be strictly ordered<br />
before any access that can occur in ordered_func.
Impact
Base Score 3.x
6.30
Severity 3.x
MEDIUM
Vulnerable products and versions
| CPE | From | Up to |
|---|---|---|
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 3.15 (including) | 4.4.293 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.5 (including) | 4.9.291 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.10 (including) | 4.14.256 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.15 (including) | 4.19.218 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.20 (including) | 5.4.162 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.5 (including) | 5.10.82 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.11 (including) | 5.15.5 (excluding) |
| cpe:2.3:o:linux:linux_kernel:5.16:rc1:*:*:*:*:*:* |
To consult the complete list of CPE names with products and versions, see this page
References to Advisories, Solutions, and Tools
- https://git.kernel.org/stable/c/45da9c1767ac31857df572f0a909fbe88fd5a7e9
- https://git.kernel.org/stable/c/47e6f9f69153247109042010f3a77579e9dc61ff
- https://git.kernel.org/stable/c/637d652d351fd4f263ef302dc52f3971d314e500
- https://git.kernel.org/stable/c/670f6b3867c8f0f11e5097f353b164cecfec6179
- https://git.kernel.org/stable/c/6adbc07ebcaf8bead08b21687d49e0fc94400987
- https://git.kernel.org/stable/c/804a9d239ae9cbe88e861a7cd62319cc6ec7b136
- https://git.kernel.org/stable/c/bd660a20fea3ec60a49709ef5360f145ec0fe779
- https://git.kernel.org/stable/c/ed058d735a70f4b063323f1a7bb33cda0f987513
- https://git.kernel.org/stable/c/45da9c1767ac31857df572f0a909fbe88fd5a7e9
- https://git.kernel.org/stable/c/47e6f9f69153247109042010f3a77579e9dc61ff
- https://git.kernel.org/stable/c/637d652d351fd4f263ef302dc52f3971d314e500
- https://git.kernel.org/stable/c/670f6b3867c8f0f11e5097f353b164cecfec6179
- https://git.kernel.org/stable/c/6adbc07ebcaf8bead08b21687d49e0fc94400987
- https://git.kernel.org/stable/c/804a9d239ae9cbe88e861a7cd62319cc6ec7b136
- https://git.kernel.org/stable/c/bd660a20fea3ec60a49709ef5360f145ec0fe779
- https://git.kernel.org/stable/c/ed058d735a70f4b063323f1a7bb33cda0f987513



