🇰🇷 한글 설명
Linux 커널의 dm(device mapper) 드라이버가 fake timeout을 처리하지 않아, io-timeout-fail 에러 주입 시 request가 누출되고 작업이 무한 대기 상태에 빠지는 취약점. dm 드라이버에서 blk_should_fake_timeout() 체크를 제거하여 해결.
💡 쉬운 설명
Linux 저장소 관리 기능에서 오류 시뮬레이션 시 작업이 완료되지 않아 시스템이 멈추는 버그. 저장소 장치를 관리하는 dm 드라이버의 timeout 처리 부재로 발생.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
dm: remove fake timeout to avoid leak request
Since commit 15f73f5b3e59 ("blk-mq: move failure injection out of
blk_mq_complete_request"), drivers are responsible for calling
blk_should_fake_timeout() at appropriate code paths and opportunities.
However, the dm driver does not implement its own timeout handler and
relies on the timeout handling of its slave devices.
If an io-timeout-fail error is injected to a dm device, the request
will be leaked and never completed, causing tasks to hang indefinitely.
Reproduce:
1. prepare dm which has iscsi slave device
2. inject io-timeout-fail to dm
echo 1 >/sys/class/block/dm-0/io-timeout-fail
echo 100 >/sys/kernel/debug/fail_io_timeout/probability
echo 10 >/sys/kernel/debug/fail_io_timeout/times
3. read/write dm
4. iscsiadm -m node -u
Result: hang task like below
[ 862.243768] INFO: task kworker/u514:2:151 blocked for more than 122 seconds.
[ 862.244133] Tainted: G E 6.19.0-rc1+ #51
[ 862.244337] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
[ 862.244718] task:kworker/u514:2 state:D stack:0 pid:151 tgid:151 ppid:2 task_flags:0x4288060 flags:0x00080000
[ 862.245024] Workqueue: iscsi_ctrl_3:1 __iscsi_unbind_session [scsi_transport_iscsi]
[ 862.245264] Call Trace:
[ 862.245587] <TASK>
[ 862.245814] __schedule+0x810/0x15c0
[ 862.246557] schedule+0x69/0x180
[ 862.246760] blk_mq_freeze_queue_wait+0xde/0x120
[ 862.247688] elevator_change+0x16d/0x460
[ 862.247893] elevator_set_none+0x87/0xf0
[ 862.248798] blk_unregister_queue+0x12e/0x2a0
[ 862.248995] __del_gendisk+0x231/0x7e0
[ 862.250143] del_gendisk+0x12f/0x1d0
[ 862.250339] sd_remove+0x85/0x130 [sd_mod]
[ 862.250650] device_release_driver_internal+0x36d/0x530
[ 862.250849] bus_remove_device+0x1dd/0x3f0
[ 862.251042] device_del+0x38a/0x930
[ 862.252095] __scsi_remove_device+0x293/0x360
[ 862.252291] scsi_remove_target+0x486/0x760
[ 862.252654] __iscsi_unbind_session+0x18a/0x3e0 [scsi_transport_iscsi]
[ 862.252886] process_one_work+0x633/0xe50
[ 862.253101] worker_thread+0x6df/0xf10
[ 862.253647] kthread+0x36d/0x720
[ 862.254533] ret_from_fork+0x2a6/0x470
[ 862.255852] ret_from_fork_asm+0x1a/0x30
[ 862.256037] </TASK>
Remove the blk_should_fake_timeout() check from dm, as dm has no
native timeout handling and should not attempt to fake timeouts.
📍 영향받는 시스템
Linux kernel 6.19.0-rc1 이전 버전 및 dm(device mapper) 드라이버를 사용하는 모든 시스템
⚔️ 공격 벡터
로컬 권한자가 sysfs(/sys/class/block/dm-*/io-timeout-fail)를 통해 timeout 실패를 주입하여 시스템 무응답 유발
🛡️ 대응 방법
Linux kernel을 최신 버전으로 업데이트 또는 dm 드라이버 패치 적용
🔧 검증 코드
커널 버전 6.19.0 이전이면 취약할 가능성 있음. 최신 버전 확인 후 업데이트 필요 여부 판단.
cat /proc/version | grep -oP '\d+\.\d+' | head -1