🇰🇷 한글 설명
Linux 커널의 Btrfs 파일 시스템에서 발생하는 Use-After-Free 취약점입니다. 동일한 fsid를 가진 두 개의 이미지를 특정 순서로 마운트할 경우, 이미 해제된 블록 장치 파일 포인터를 참조하여 시스템 오류를 유발할 수 있습니다.
💡 쉬운 설명
컴퓨터가 이미 사용이 끝나서 버린 메모리 주소를 다시 사용하려고 시도할 때 발생하는 오류입니다. 특정 조건에서 파일을 마운트하면 시스템이 불안정해지거나 충돌할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
btrfs: fix use-after-free of block device file in __btrfs_free_extra_devids()
Mounting btrfs from two images (which have the same one fsid and two
different dev_uuids) in certain executing order may trigger an UAF for
variable 'device->bdev_file' in __btrfs_free_extra_devids(). And
following are the details:
1. Attach image_1 to loop0, attach image_2 to loop1, and scan btrfs
devices by ioctl(BTRFS_IOC_SCAN_DEV):
/ btrfs_device_1 → loop0
fs_device
\ btrfs_device_2 → loop1
2. mount /dev/loop0 /mnt
btrfs_open_devices
btrfs_device_1->bdev_file = btrfs_get_bdev_and_sb(loop0)
btrfs_device_2->bdev_file = btrfs_get_bdev_and_sb(loop1)
btrfs_fill_super
open_ctree
fail: btrfs_close_devices // -ENOMEM
btrfs_close_bdev(btrfs_device_1)
fput(btrfs_device_1->bdev_file)
// btrfs_device_1->bdev_file is freed
btrfs_close_bdev(btrfs_device_2)
fput(btrfs_device_2->bdev_file)
3. mount /dev/loop1 /mnt
btrfs_open_devices
btrfs_get_bdev_and_sb(&bdev_file)
// EIO, btrfs_device_1->bdev_file is not assigned,
// which points to a freed memory area
btrfs_device_2->bdev_file = btrfs_get_bdev_and_sb(loop1)
btrfs_fill_super
open_ctree
btrfs_free_extra_devids
if (btrfs_device_1->bdev_file)
fput(btrfs_device_1->bdev_file) // UAF !
Fix it by setting 'device->bdev_file' as 'NULL' after closing the
btrfs_device in btrfs_close_one_device().
📍 영향받는 시스템
Linux Kernel (Btrfs 파일 시스템 사용 환경)
⚔️ 공격 벡터
동일한 fsid를 가진 두 개의 Btrfs 이미지를 특정 순서로 마운트 시도
🛡️ 대응 방법
커널 업데이트를 통해 btrfs_close_one_device() 함수에서 장치 종료 후 bdev_file을 NULL로 설정하는 패치를 적용해야 합니다.
🔧 검증 코드
현재 실행 중인 커널 버전을 확인하여 해당 취약점이 해결된 최신 보안 패치 버전인지 확인합니다.