🇰🇷 한글 설명
Linux 커널의 md/bitmap 모듈에서 비트맵 영역에 잘못된 데이터가 있을 때 sanity check를 통과하지 못했음에도 chunksize 등 superblock 값이 설정되어, 값이 0이 되면서 DIV_ROUND_UP_SECTOR_T() 연산 중 divide error가 발생하는 문제입니다. 이로 인해 클러스터 RAID 환경에서 커널 크래시가 발생할 수 있습니다.
💡 쉬운 설명
RAID 디스크의 비트맵 정보가 손상되었을 때 시스템이 잘못된 값을 받아들여 커널이 멈출 수 있습니다. 클러스터 환경의 RAID 구성에서만 발생하는 문제입니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
md/bitmap: don't set sb values if can't pass sanity check
If bitmap area contains invalid data, kernel will crash then mdadm
triggers "Segmentation fault".
This is cluster-md speical bug. In non-clustered env, mdadm will
handle broken metadata case. In clustered array, only kernel space
handles bitmap slot info. But even this bug only happened in clustered
env, current sanity check is wrong, the code should be changed.
How to trigger: (faulty injection)
dd if=/dev/zero bs=1M count=1 oflag=direct of=/dev/sda
dd if=/dev/zero bs=1M count=1 oflag=direct of=/dev/sdb
mdadm -C /dev/md0 -b clustered -e 1.2 -n 2 -l mirror /dev/sda /dev/sdb
mdadm -Ss
echo aaa > magic.txt
== below modifying slot 2 bitmap data ==
dd if=magic.txt of=/dev/sda seek=16384 bs=1 count=3 <== destroy magic
dd if=/dev/zero of=/dev/sda seek=16436 bs=1 count=4 <== ZERO chunksize
mdadm -A /dev/md0 /dev/sda /dev/sdb
== kernel crashes. mdadm outputs "Segmentation fault" ==
Reason of kernel crash:
In md_bitmap_read_sb (called by md_bitmap_create), bad bitmap magic didn't
block chunksize assignment, and zero value made DIV_ROUND_UP_SECTOR_T()
trigger "divide error".
Crash log:
kernel: md: md0 stopped.
kernel: md/raid1:md0: not clean -- starting background reconstruction
kernel: md/raid1:md0: active with 2 out of 2 mirrors
kernel: dlm: ... ...
kernel: md-cluster: Joined cluster 44810aba-38bb-e6b8-daca-bc97a0b254aa slot 1
kernel: md0: invalid bitmap file superblock: bad magic
kernel: md_bitmap_copy_from_slot can't get bitmap from slot 2
kernel: md-cluster: Could not gather bitmaps from slot 2
kernel: divide error: 0000 [#1] SMP NOPTI
kernel: CPU: 0 PID: 1603 Comm: mdadm Not tainted 5.14.6-1-default
kernel: Hardware name: QEMU Standard PC (i440FX + PIIX, 1996)
kernel: RIP: 0010:md_bitmap_create+0x1d1/0x850 [md_mod]
kernel: RSP: 0018:ffffc22ac0843ba0 EFLAGS: 00010246
kernel: ... ...
kernel: Call Trace:
kernel: ? dlm_lock_sync+0xd0/0xd0 [md_cluster 77fe..7a0]
kernel: md_bitmap_copy_from_slot+0x2c/0x290 [md_mod 24ea..d3a]
kernel: load_bitmaps+0xec/0x210 [md_cluster 77fe..7a0]
kernel: md_bitmap_load+0x81/0x1e0 [md_mod 24ea..d3a]
kernel: do_md_run+0x30/0x100 [md_mod 24ea..d3a]
kernel: md_ioctl+0x1290/0x15a0 [md_mod 24ea....d3a]
kernel: ? mddev_unlock+0xaa/0x130 [md_mod 24ea..d3a]
kernel: ? blkdev_ioctl+0xb1/0x2b0
kernel: block_ioctl+0x3b/0x40
kernel: __x64_sys_ioctl+0x7f/0xb0
kernel: do_syscall_64+0x59/0x80
kernel: ? exit_to_user_mode_prepare+0x1ab/0x230
kernel: ? syscall_exit_to_user_mode+0x18/0x40
kernel: ? do_syscall_64+0x69/0x80
kernel: entry_SYSCALL_64_after_hwframe+0x44/0xae
kernel: RIP: 0033:0x7f4a15fa722b
kernel: ... ...
kernel: ---[ end trace 8afa7612f559c868 ]---
kernel: RIP: 0010:md_bitmap_create+0x1d1/0x850 [md_mod]
📍 영향받는 시스템
Linux 커널의 md(RAID) 드라이버 중 클러스터 비트맵(md-cluster)을 사용하는 설정 (수정 전 커널 버전)
⚔️ 공격 벡터
로컬 권한을 가진 사용자가 RAID 멤버 디스크의 비트맵 영역을 손상시킨 뒤 mdadm으로 배열을 조립하면 커널 크래시를 유발할 수 있습니다.
🛡️ 대응 방법
커널을 해당 CVE 수정이 포함된 버전으로 업데이트하고, 배포판의 보안 업데이트를 적용하세요.
🔧 검증 코드
커널 버전이 배포판의 패치 완료 버전 이상인지 확인하고, 클러스터 비트맵 RAID(md-cluster) 사용 여부는 /proc/mdstat 출력에서 bitmap 및 cluster 관련 항목으로 판단합니다.
uname -r && (cat /proc/mdstat 2>/dev/null | head -n 20) && (modinfo md_mod 2>/dev/null | grep -E 'version|filename')