🇰🇷 한글 설명
Device-mapper의 dm-raid 대상 사용 시 RAID 배열 중지 중 시스템 hang 발생 취약점입니다. md_stop() 호출 시 이미 suspend된 메타데이터 장치에 write-intent bitmap 쓰기를 시도하여 I/O가 무한 대기 상태에 빠집니다. 수정사항은 dm-raid destructor 경로에서 bitmap flushing을 방지하고 md_is_rdwr()로 suspend/destructor 경로를 구분합니다.
💡 쉬운 설명
RAID 저장 장치를 중지할 때 시스템이 멈추는 버그입니다. 이미 비활성화된 저장 장치에 데이터를 쓰려고 시도하기 때문에 무한 대기 상태에 빠집니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
md raid: fix hang when stopping arrays with metadata through dm-raid
When using device-mapper's dm-raid target, stopping a RAID array can cause
the system to hang under specific conditions.
This occurs when:
- A dm-raid managed device tree is suspended from top to bottom
(the top-level RAID device is suspended first, followed by its
underlying metadata and data devices)
- The top-level RAID device is then removed
Removing the top-level device triggers a hang in the following sequence:
the dm-raid destructor calls md_stop(), which tries to flush the
write-intent bitmap by writing to the metadata sub-devices. However, these
devices are already suspended, making them unable to complete the write-intent
operations and causing an indefinite block.
Fix:
- Prevent bitmap flushing when md_stop() is called from dm-raid
destructor context
and avoid a quiescing/unquescing cycle which could also cause I/O
- Still allow write-intent bitmap flushing when called from dm-raid
suspend context
This ensures that RAID array teardown can complete successfully even when the
underlying devices are in a suspended state.
This second patch uses md_is_rdwr() to distinguish between suspend and
destructor paths as elaborated on above.
📍 영향받는 시스템
Linux kernel의 dm-raid(device-mapper RAID) 설정 시스템, 영향받는 커널 버전은 md raid 메타데이터 처리 로직 적용 버전
⚔️ 공격 벡터
로컬 공격자가 RAID 배열 중지/재구성 작업 중 의도적으로 장치를 suspend하여 서비스 거부(DoS) 유발
🛡️ 대응 방법
Linux kernel을 최신 패치 버전으로 업데이트하여 md_stop() 함수의 bitmap flushing 로직 수정 적용
🔧 검증 코드
RAID 배열이 활성화되어 있으면 현재 시스템이 dm-raid를 사용 중인 것으로 확인되며, 커널 버전으로 패치 상태를 검증해야 합니다.
cat /proc/mdstat | grep -E 'md.*raid|personality' && lsblk | grep -i raid