CVE: CVE-2025-21752
Published: 2025-02-27
Description: In the Linux kernel, the following vulnerability has been resolved:

btrfs: don't use btrfs_set_item_key_safe on RAID stripe-extents

Don't use btrfs_set_item_key_safe() to modify the keys in the RAID
stripe-tree, as this can lead to corruption of the tree, which is caught
by the checks in btrfs_set_item_key_safe():

 BTRFS info (device nvme1n1): leaf 49168384 gen 15 total ptrs 194 free space 8329 owner 12
 BTRFS info (device nvme1n1): refs 2 lock_owner 1030 current 1030
  [ snip ]
  item 105 key (354549[PII_REDACTED]0) itemoff 14587 itemsize 16
                  stride 0 devid 5 physical 67502080
  item 106 key (35463[PII_REDACTED]) itemoff 14571 itemsize 16
                  stride 0 devid 1 physical 88559616
  item 107 key (35463[PII_REDACTED]8) itemoff 14555 itemsize 16
                  stride 0 devid 1 physical 88555520
  item 108 key (354717[PII_REDACTED]2) itemoff 14539 itemsize 16
                  stride 0 devid 2 physical 67604480
  [ snip ]
 BTRFS critical (device nvme1n1): slot 106 key (35463[PII_REDACTED]8) new key (354635[PII_REDACTED])
 ------------[ cut here ]------------
 kernel BUG at fs/btrfs/ctree.c:2602!
 Oops: invalid opcode: 0000 [#1] PREEMPT SMP PTI
 CPU: 1 UID: 0 PID: 1055 Comm: fsstress Not tainted 6.13.0-rc1+ #1464
 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.2-3-gd478f380-rebuilt.opensuse.org 04/01/2014
 RIP: 0010:btrfs_set_item_key_safe+0xf7/0x270
 Code: <snip>
 RSP: 0018:ffffc90001337ab0 EFLAGS: 00010287
 RAX: [PII_REDACTED] RBX: ffff8881115fd000 RCX: [PII_REDACTED]
 RDX: [PII_REDACTED] RSI: [PII_REDACTED] RDI: 00000000ffffffff
 RBP: ffff888110ed6f50 R08: 00000000ffffefff R09: ffffffff8244c500
 R10: 00000000ffffefff R11: 00000000ffffffff R12: ffff[PII_REDACTED]00
 R13:[PII_REDACTED]0000c9 R14: ffffc90001337b1f R15: ffff888110f23b58
 FS:  00007f7d75c72740(0000) GS:ffff88813bd00000(0000) knlGS:[PII_REDACTED]
 CS:  0010 DS: 0000 ES: 0000 CR0: [PII_REDACTED]
 CR2: 00007fa811652c60 CR3: [PII_REDACTED] CR4:[PII_REDACTED]370eb0
 Call Trace:
  <TASK>
  ? __die_body.cold+0x14/0x1a
  ? die+0x2e/0x50
  ? do_trap+0xca/0x110
  ? do_error_trap+0x65/0x80
  ? btrfs_set_item_key_safe+0xf7/0x270
  ? exc_invalid_op+0x50/0x70
  ? btrfs_set_item_key_safe+0xf7/0x270
  ? asm_exc_invalid_op+0x1a/0x20
  ? btrfs_set_item_key_safe+0xf7/0x270
  btrfs_partially_delete_raid_extent+0xc4/0xe0
  btrfs_delete_raid_extent+0x227/0x240
  __btrfs_free_extent.isra.0+0x57f/0x9c0
  ? exc_coproc_segment_overrun+0x40/0x40
  __btrfs_run_delayed_refs+0x2fa/0xe80
  btrfs_run_delayed_refs+0x81/0xe0
  btrfs_commit_transaction+0x2dd/0xbe0
  ? preempt_count_add+0x52/0xb0
  btrfs_sync_file+0x375/0x4c0
  do_fsync+0x39/0x70
  __x64_sys_fsync+0x13/0x20
  do_syscall_64+0x54/0x110
  entry_SYSCALL_64_after_hwframe+0x76/0x7e
 RIP: 0033:0x7f7d7550ef90
 Code: <snip>
 RSP: 002b:00007ffd70237248 EFLAGS: 00000202 ORIG_RAX:[PII_REDACTED]00004a
 RAX: ffffffffffffffda RBX: [PII_REDACTED] RCX: 00007f7d7550ef90
 RDX:[PII_REDACTED]00013a RSI:[PII_REDACTED]40eb28 RDI: [PII_REDACTED]
 RBP:[PII_REDACTED]00001b R08: [PII_REDACTED] R09: 00007ffd7023725c
 R10: 00007f7d75400390 R11: [PII_REDACTED] R12: 028f5c28f5c28f5c
 R13: 8f5c28f5c28f5c29 R14:[PII_REDACTED]40b520 R15: 00007f7d75c726c8
  </TASK>

While the root cause of the tree order corruption isn't clear, using
btrfs_duplicate_item() to copy the item and then adjusting both the key
and the per-device physical addresses is a safe way to counter this
problem.
CVSS Score: 5.5 (MEDIUM)
References: https://git.kernel.org/stable/c/1c25eff52ee5a02a2c4be659a44ae972d9989742; https://git.kernel.org/stable/c/dc14ba10781bd[PII_REDACTED]b7cc1febf914768e9