CVE-2026-98959 in Linux
요약
\~에 의해 VulDB • 2026. 10. 23.
리눅스 커널에서 다음 취약점이 해결되었습니다:
btrfs: 동일한 항목에 여러 xattrs가 패킹되어 있을 때 xattr 교체 시 오류 수정
여러 개의 xattrs를 하나의 btrfs_dir_item 항목에 패킹한 상태에서, setxattr(2) 시스템 콜 계열을 사용하여 그 중 하나의 값을 다른 크기의 값으로 대체하면 완전히 초기화되지 않은 btrfs_dir_item이 생성됩니다. 이로 인해 트리가 손상되며, 이는 extent buffer writeback 시점의 트리 체크어에서 감지됩니다.
그 이유는 btrfs_setxattr() 함수 내에서 이름의 crc32c 해시가 동일하여 여러 xattrs를 포함하는 btrfs_dir_item을 발견할 경우, 기존 xattr 항목(btrfs_dir_item) 중 하나를 삭제한 후 새 항목을 삽입하기 때문입니다. 그러나 이 삭제 및 삽입 작업은 리프(leaf) 내의 기존 데이터를 이동시키므로, 새로운 xattr 값의 크기가 다를 경우 새로 생성된 btrfs_dir_item이 초기화되지 않은 리프 섹션에 배치됩니다. 이때 우리는 단순히 값의 데이터와 길이를 새 btrfs_dir_item에 복사할 뿐, 이름(name), 이름의 길이(key length), 키(모든 xattrs는 0이어야 함), 플래그(BTRFS_FT_XATTR) 및 트랜잭션 ID(transaction ID)를 설정하지 않습니다.
다음 스크립트는 이 문제를 재현합니다:
```bash $ cat test.sh #!/bin/bash
DEV=/dev/sdi MNT=/mnt/sdi
mkfs.btrfs -f $DEV mount $DEV $MNT
touch $MNT/testfile
# btrfs에서 이름의 crc32c 해시가 동일하여 동일한 btrfs_dir_item에 패킹되는 두 개의 xattr을 추가합니다. setfattr -n user.foobar -v 123 $MNT/testfile setfattr -n user.WvG1c1Td -v qwerty $MNT/testfile
# xattrs가 존재하는지 확인합니다. echo "xattrs before:" getfattr --absolute-names --dump $MNT/testfile
# 이제 foobar xattr의 값을 훨씬 더 큰 값으로 대체합니다. setfattr -n user.foobar -v abcdefghijklmnopqrstuvwxyz $MNT/testfile
# xattrs가 예상된 값을 갖는지 확인합니다. echo "xattrs after:" getfattr --absolute-names --dump $MNT/testfile
umount $MNT ```
실행 결과:
```bash $ ./test.sh (...) xattrs before: # file: /mnt/sdi/testfile user.WvG1c1Td="qwerty" user.foobar="123"
xattrs after: # file: /mnt/sdi/testfile user.WvG1c1Td="qwerty" ```
따라서 "user.foobar" xattr이 누락되었으며, 파일 시스템을 언마운트할 때 트랜잭션 중단(transaction abort)이 발생하고 dmesg에 다음 트레이스가 표시됩니다:
```bash $ dmesg [869800.159271] BTRFS warning (device sdi): access to eb bytenr 30474240 len 16384 out of range start 16015 len 25964
[869800.159293] ------------[ cut here ]------------
[869800.159296] WARNING: fs/btrfs/extent_io.c:4408 at report_eb_range+0x44/0x60 [btrfs], CPU#8: getfattr/2605179
[869800.168961] Modules linked in: btrfs dm_thin_pool (...)
[869800.190527] CPU: 8 UID: 0 PID: 2605179 Comm: getfattr Tainted: G W 7.3.0-rc3-btrfs-next-244+ #1 PREEMPT(full)
[869800.193726] Tainted: [W]=WARN
[869800.194502] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.2-0-gea1b7a073390-prebuilt.qemu.org 04/01/2014
[869800.197576] RIP: 0010:report_eb_range+0x44/0x60 [btrfs]
[869800.198985] Code: 48 8b 7b 18 (...)
[869800.203531] RSP: 0018:ffffce4541937d58 EFLAGS: 00010246
[869800.204609] RAX: 0000000000000000 RBX: ffff8dde054b8738 RCX: 0000000000000000
[869800.206137] RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffffffffc04c92a0
[869800.207645] RBP: 0000000000003e8f R08: 0000000000000000 R09: 3fffffffffefffff
[869800.226175] R10: ffffce4541937a88 R11: 0000000000000003 R12: 000000000000656c
[869800.227594] R13: ffff8dde14be800f R14: 000000000000656c R15: 0000000000000069
[869800.229097] FS: 00007f59023bb780(0000) GS:ffff8de5788ed000(0000) knlGS:0000000000000000
[869800.231137] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[869800.232321] CR2: 0000558dc45e6a78 CR3: 0000000765b16004 CR4: 0000000000370ef0
[869800.233783] Call Trace:
[869800.234330] <TASK>
[869800.234791] read_extent_buffer+0x4d/0x100 [btrfs]
[869800.235898] btrfs_listxattr+0x199/0x240 [btrfs]
[869800.236912] vfs_listxattr+0x51/0
---truncated--- ```
If you want to get best quality of vulnerability data, you may have to visit VulDB.