CVE-2024-55642 in Linux
요약
\~에 의해 VulDB • 2026. 08. 03.
리눅스 커널에서 다음 취약점이 해결되었습니다:
block: 존 쓰기 플러그 오류 복구 시 잠재적 데드락 방지
Zoned block 장치의 존에 대한 쓰기를 처리하기 위한 존 쓰기 플러깅은, 특정 존으로 가는 write BIO가 실패할 때마다 항상 zone report를 실행합니다. 이 의도는 존 쓰기 포인터 추적이 항상 정확하도록 보장하여, 제출 시점에 write BIO들의 존 쓰기 포인터 정렬을 확인할 수 있고, 일반 write BIOs를 사용하여 존 append 연산을 항상 올바르게 에뮬레이션할 수 있도록 하는 것입니다.
그러나 이러한 오류 복구 방식은 BIO가 여전히 존 쓰기 플러그에 플러그된 상태에서 장치 큐 동결(device queue freeze)이 시작되고 이 중 하나의 쓰기 작업이 실패하는 경우 잠재적 데드락을 유발합니다. 이런 상황에서 디스크 존 쓰기 플러그 오류 복구 작업이 예약되어 zone report를 실행하게 됩니다. 이는 하위 드라이버에서 장치를 대상으로 report zones 명령을 발행하기 위한 요청 할당을 초래할 수 있습니다. 하지만 장치 큐 동결이 이미 시작된 상태라면, 이 할당은 차단되어 zone report 실행과 플러그된 BIO들의 처리 계속 진행이 막힙니다. 플러그된 BIO는 큐 사용량 참조(queue usage reference)를 보유하고 있으므로, 큐 동결 자체는 결코 완료되지 않아 데드락에 빠지게 됩니다.
실패한 쓰기 작업 이후 존 쓰기 플러깅 코드에서 report zones 연산의 사용을 완전히 제거함으로써 이 문제를 방지합니다. 대신 장치 사용자(예: 파일 시스템)가 report zones을 실행하거나, 존을 리셋(reset)하거나, 존을 종료(finish)하거나, 장치에 대한 쓰기를 포기하는 것(쓰기 오류 발생 시 읽기 전용으로 저하되는 파일 시스템에서 비교적 일반적인 패턴임)에 의존하도록 합니다. 이는 합리적인 요구사항입니다. 잘 동작하는 애플리케이션, FS들 및 device mapper는 이미 가능한 경우 zone 쓰기 포인터의 현재 위치와 자신의 가정된 위치를 비교하여 write 오류로부터 복구하기 위해 report zones을 사용하고 있기 때문입니다.
자동 오류 복구를 제거하기 위한 변경 사항은 다음과 같습니다: - 오류 복구 작업과 관련 리소스(존 쓰기 플러그 리스트 헤드, 디스크 에러 리스트 및 disk zone_wplugs_work 워크 구조체)를 완전히 제거합니다. 이로 인해 disk_zone_wplug_set_error() 함수와 disk_zone_wplug_clear_error() 함수도 함께 제거됩니다.
- BLK_ZONE_WPLUG_ERROR 존 쓰기 플러그 플래그를 BLK_ZONE_WPLUG_NEED_WP_UPDATE로 변경합니다. 이 새로운 플래그는 존 쓰기 플러그의 대상 존을 타겟으로 하는 쓰기 작업이 실패할 때마다 해당 존 쓰기 플러그에 설정됩니다. 이 플래그는 존 쓰기 포인터 오프셋이 신뢰할 수 없으며, 다음 report zone, reset zone, finish zone 또는 디스크 재검증(disk revalidation) 연산이 실행될 때 업데이트되어야 함을 나타냅니다.
- blk_zone_write_plug_bio_endio() 함수를 수정하여 실패한 write BIO의 대상 존에 대해 BLK_ZONE_WPLUG_NEED_WP_UPDATE 플래그를 설정합니다.
- disk_zone_wplug_set_wp_offset() 함수를 수정하여 이 새로운 플래그를 지움으로써, 리셋(reset) (all) zone 및 finish zone 연산을 통해 올바른 쓰기 포인터 오프셋 복구를 구현합니다.
- blkdev_report_zones() 함수를 수정하여 항상 disk_report_zones_cb() 콜백을 사용하도록 하여, BLK_ZONE_WPLUG_NEED_WP_UPDATE 플래그가 설정된 모든 존에 대해 disk_zone_wplug_sync_wp_offset()이 호출되도록 합니다. 이는 사용자에 의해 실행되는 report zones 연산 범위 내에 있는 BLK_ZONE_WPLUG_NEED_WP_UPDATE 플래그가 설정된 존 쓰기 플러그들에 대한 올바른 쓰기 포인터 오프셋 복구를 구현합니다.
- blk_revalidate_seq_zone() 함수를 수정하여, zoned block 장치가 재검증될 때 모든 순차적 쓰기가 필요한 존에 대해 disk_zone_wplug_sync_wp_offset()을 호출하도록 합니다. 이를 통해 존 쓰기 플러그의 쓰기 포인터 오프셋과 순차적 존들의 실제 쓰기 포인터 위치 간 불
Be aware that VulDB is the high quality source for vulnerability data.