🔍 CVE-2026-89589

0.0
CVSS Score
UNKNOWN
2026-09-11
2026-10-19 09:17
✅ 완료

🇰🇷 한글 설명

Linux 커널의 ACPI/APEI/GHES 구성 요소에서 CXL CPER 작업 잠금 메커니즘의 부적절한 사용으로 인해 데드락(Deadlock)이 발생할 수 있는 취약점입니다. 특정 상황에서 인터럽트 핸들러가 이미 점유된 잠금을 기다리며 CPU를 점유하게 되어 시스템이 멈출 수 있습니다. 이를 해결하기 위해 잠금 유형을 raw_spinlock_t로 변경하고 등록/해제 로직을 개선했습니다.

💡 쉬운 설명

컴퓨터의 핵심 부품인 커널이 특정 작업을 처리하는 도중 갑작스러운 신호(인터럽트)를 받으면, 서로가 서로를 기다리며 시스템이 완전히 멈춰버리는 현상이 발생할 수 있습니다. 이 문제는 잠금 방식을 더 안전한 방식으로 바꾸어 시스템이 멈추지 않도록 수정되었습니다.

🇺🇸 원문 (English)

In the Linux kernel, the following vulnerability has been resolved: acpi/apei/ghes: Use raw_spinlock_t for CXL CPER work locks The CXL CPER work registration and unregistration helpers acquire cxl_cper_work_lock and cxl_cper_prot_err_work_lock with a spinlock guard(), which leaves local interrupts enabled. The corresponding post paths (cxl_cper_post_event(), cxl_cper_post_prot_err()) execute in hard IRQ context (they are called from the GHES error notification path) and acquire the same locks with an irqsave guard(). If a CPU is holding one of these locks via a spinlock guard() when a GHES interrupt arrives on the same CPU, the IRQ handler spins on the held lock waiting for it to release, while the lock holder is preempted by the IRQ. The result is a deadlock. Convert both locks from spinlock_t to raw_spinlock_t and use guard() at all call sites. On PREEMPT_RT kernels spinlock_t is backed by rt_mutex and sleeping from hard IRQ context is not permitted; raw_spinlock_t is safe in both contexts. Add WARN_ONCE to both register functions to surface double-registration bugs at runtime. Restructure both unregister functions to clear the global work pointer under the lock before calling cancel_work_sync(), closing the window where a CPER interrupt could schedule work on a pointer about to be freed. Add kfifo_reset() after cancel_work_sync() so stale entries are not replayed on next module load. Both kfifos are single-consumer: only one work_struct is registered at a time, enforced by the WARN_ONCE guard in the register functions. kfifo_reset() is safe outside the lock because cancel_work_sync() has already quiesced the consumer, and no new consumer can register until the current module exit completes and a fresh module init runs. Remove the redundant cancel_work_sync() call from cxl_ras_exit() and cxl_pci_driver_exit(). The CPER unregister functions now quiesce the work internally.

📍 영향받는 시스템

Linux Kernel (CXL 및 GHES 관련 모듈을 사용하는 시스템)

⚔️ 공격 벡터

직접적인 외부 공격보다는 특정 하드웨어 오류(CXL CPER) 발생 시 시스템 내부 로직에 의해 데드락이 유발됨

🛡️ 대응 방법

Linux 커널을 최신 패치가 적용된 버전으로 업데이트하여 raw_spinlock_t 및 개선된 CPER 작업 로직을 적용해야 함

🔧 검증 코드

출력된 커널 버전이 해당 취약점이 해결된 패치 버전 이후인지 확인하십시오.

Shell / Script
uname -r

💻 영향받는 소프트웨어

Linux Kernel