CVE-2021-46958: btrfs: fix race between transaction aborts and fsyncs leading to use-after-free

Published Feb 27, 2024
·
Updated

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

btrfs: fix race between transaction aborts and fsyncs leading to use-after-free

There is a race between a task aborting a transaction during a commit, a task doing an fsync and the transaction kthread, which leads to an use-after-free of the log root tree. When this happens, it results in a stack trace like the following:

BTRFS info (device dm-0): forced readonly BTRFS warning (device dm-0): Skipping commit of aborted transaction. BTRFS: error (device dm-0) in cleanuptransaction:1958: errno=-5 IO failure BTRFS warning (device dm-0): lost page write due to IO error on /dev/mapper/error-test (-5) BTRFS warning (device dm-0): Skipping commit of aborted transaction. BTRFS warning (device dm-0): direct IO failed ino 261 rw 0,0 sector 0xa4e8 len 4096 err no 10 BTRFS error (device dm-0): error writing primary super block to device 1 BTRFS warning (device dm-0): direct IO failed ino 261 rw 0,0 sector 0x12e000 len 4096 err no 10 BTRFS warning (device dm-0): direct IO failed ino 261 rw 0,0 sector 0x12e008 len 4096 err no 10 BTRFS warning (device dm-0): direct IO failed ino 261 rw 0,0 sector 0x12e010 len 4096 err no 10 BTRFS: error (device dm-0) in writeallsupers:4110: errno=-5 IO failure (1 errors while writing supers) BTRFS: error (device dm-0) in btrfssynclog:3308: errno=-5 IO failure general protection fault, probably for non-canonical address 0x6b6b6b6b6b6b6b68: 0000 [#1] PREEMPT SMP DEBUGPAGEALLOC PTI CPU: 2 PID: 2458471 Comm: fsstress Not tainted 5.12.0-rc5-btrfs-next-84 #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.14.0-0-g155821a1990b-prebuilt.qemu.org 04/01/2014 RIP: 0010:mutexlock+0x139/0xa40 Code: c0 74 19 (...) RSP: 0018:ffff9f18830d7b00 EFLAGS: 00010202 RAX: 6b6b6b6b6b6b6b68 RBX: 0000000000000001 RCX: 0000000000000002 RDX: ffffffffb9c54d13 RSI: 0000000000000000 RDI: 0000000000000000 RBP: ffff9f18830d7bc0 R08: 0000000000000000 R09: 0000000000000000 R10: ffff9f18830d7be0 R11: 0000000000000001 R12: ffff8c6cd199c040 R13: ffff8c6c95821358 R14: 00000000fffffffb R15: ffff8c6cbcf01358 FS: 00007fa9140c2b80(0000) GS:ffff8c6fac600000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007fa913d52000 CR3: 000000013d2b4003 CR4: 0000000000370ee0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: ? btrfshandlefserror+0xde/0x146 [btrfs] ? btrfssynclog+0x7c1/0xf20 [btrfs] ? btrfssynclog+0x7c1/0xf20 [btrfs] btrfssynclog+0x7c1/0xf20 [btrfs] btrfssyncfile+0x40c/0x580 [btrfs] dofsync+0x38/0x70 x64sysfsync+0x10/0x20 dosyscall64+0x33/0x80 entrySYSCALL64afterhwframe+0x44/0xae RIP: 0033:0x7fa9142a55c3 Code: 8b 15 09 (...) RSP: 002b:00007fff26278d48 EFLAGS: 00000246 ORIGRAX: 000000000000004a RAX: ffffffffffffffda RBX: 0000563c83cb4560 RCX: 00007fa9142a55c3 RDX: 00007fff26278cb0 RSI: 00007fff26278cb0 RDI: 0000000000000005 RBP: 0000000000000005 R08: 0000000000000001 R09: 00007fff26278d5c R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000340 R13: 00007fff26278de0 R14: 00007fff26278d96 R15: 0000563c83ca57c0 Modules linked in: btrfs dmzero dmsnapshot dmthinpool (...) ---[ end trace ee2f1b19327d791d ]---

The steps that lead to this crash are the following:

1) We are at transaction N;

2) We have two tasks with a transaction handle attached to transaction N. Task A and Task B. Task B is doing an fsync;

3) Task B is at btrfssynclog(), and has saved fsinfo->logroottree into a local variable named 'logroottree' at the top of btrfssynclog(). Task B is about to call writeallsupers(), but before that...

4) Task A calls btrfscommittransaction(), and after it sets the transaction state to TRANSSTATECOMMITSTART, an error happens before it w ---truncated---

Affected Software

3 affected components
Linux Linux kernel>=5.7<5.10.36
Linux Linux kernel>=5.11<5.11.20
Linux Linux kernel>=5.12<5.12.3

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Upgrade

    Upgrade Linux kernel (btrfs) to a version that resolves this vulnerability.

    Patch btrfs: fix race between transaction aborts and fsyncs leading to use-after-free

Event History

Feb 27, 2024
CVE Published
via MITRE·06:46 PM
Data Sourced
via MITRE·06:46 PM
DescriptionSeverity
Data Sourced
via NVD·07:04 PM
RemedyDescriptionSeverityWeaknessAffected Software

Frequently Asked Questions

1

What is the severity of CVE-2021-46958?

CVE-2021-46958 is classified with a severity score that indicates a potential risk of use-after-free vulnerabilities, which can lead to arbitrary code execution.

2

How do I fix CVE-2021-46958?

To fix CVE-2021-46958, update the Linux kernel to version 5.10.36 or later, or version 5.11.20 or later, or version 5.12.3 or later.

3

What systems are affected by CVE-2021-46958?

CVE-2021-46958 affects various versions of the Linux kernel between 5.7 and 5.12.3.

4

What is the impact of CVE-2021-46958?

The impact of CVE-2021-46958 includes the potential for data corruption and system instability due to race conditions during transaction handling.

5

Is CVE-2021-46958 easy to exploit?

Exploitation of CVE-2021-46958 requires specific conditions to be met, making it moderately complex but still a significant concern in vulnerable systems.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203