CVE-2024-46704 in Linux
요약
\~에 의해 VulDB • 2026. 06. 23.
리눅스 커널에서 다음 취약점이 해결되었습니다:
workqueue: __flush_work()의 잘못된(spurious) 데이터 레이스 수정
작업 항목을 취소하기 위해 플러시할 때, __flush_work()는 PENDING 비트를 통해 해당 작업 항목에 대한 배타적 소유권을 가지고 있음을 알고 있습니다. 134874e2eee9("workqueue: BH 작업 항목에 대해 cancel_work_sync() 및 disable_work()를 atomic 컨텍스트에서 허용")은 취소 중인 BH(Bottom Half) 작업 항목에 대해 버시 바이트(busy wait)를 사용할지 여부를 결정하기 위해 @work->data의 읽기 연산을 추가했습니다. @from_cancel인 경우 이 읽기는 안전하지만, 코드 구조를 단순화하기 위해 @from_cancel을 테스트하기 전에 @work->data가 먼저 읽혔습니다:
data = *work_data_bits(work); if (from_cancel && !WARN_ON_ONCE(data & WORK_STRUCT_PWQ) && (data & WORK_OFFQ_BH)) {
읽혀진 데이터는 !@from_cancel인 경우 사용되지 않았지만, 이로 인해 KCSAN(Kernel Concurrency Sanitizer)의 데이터 레이스 감지가 잘못된(spurious) 방식으로 트리거될 수 있었습니다:
================================================================== BUG: KCSAN: __flush_work / __flushwork 내 data-race
작업 3998이 CPU 0에서 바이트 8개에 대해 주소 0xffff8881223aa3e8 쓰기 수행: instrument_write include/linux/instrumented.h:41 [inline]
___set_bit include/asm-generic/bitops/instrumented-non-atomic.h:28 [inline]
insert_wq_barrier kernel/workqueue.c:3790 [inline]
start_flush_work kernel/workqueue.c:4142 [inline]
__flush_work+0x30b/0x570 kernel/workqueue.c:4178 flush_work kernel/workqueue.c:4229 [inline]
...
작업 50이 CPU 1에서 주소 0xffff8881223aa3e8 바이트 8개 읽기 수행: __flush_work+0x42a/0x570 kernel/workqueue.c:4188 flush_work kernel/workqueue.c:4229 [inline]
flush_delayed_work+0x66/0x70 kernel/workqueue.c:4251 ...
값 변경됨: 0x0000000000400000 -> 0xffff88810006c00d
@work->data에 접근하기 전에 @from_cancel이 먼저 테스트되도록 코드를 재구성합니다. 유일한 문제는 KCSAN 감지가 잘못된(spurious) 방식으로 트리거되는 것입니다. READ_ONCE() 또는 기타 접근 한정자(access qualifiers)가 필요하지 않습니다.
기능적 변경 사항 없음.
If you want to get best quality of vulnerability data, you may have to visit VulDB.