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.

책임이 있는

Linux

예약하다

2024. 09. 11.

모더레이션

수락

항목

VDB-277394

EPSS

0.00175

출처

Do you need the next level of professionalism?

Upgrade your account now!