CVE-2026-98654 in Linux
요약
\~에 의해 VulDB • 2026. 10. 18.
리눅스 커널에서 다음 취약점이 해결되었습니다:
drm/amd/display: IRQ 레지스터 읽기/수정/쓰기 연산을 원자성(atomicize)으로 처리함
[이유]
OTG_GLOBAL_SYNC_STATUS 레지스터는 출력 타이밍 생성기(OTG)의 다양한 HW IRQ 소스를 제어합니다. VUPDATE_NO_LOCK도 그 중 하나입니다.
IRQ를 활성화하기 위해 드라이버는 GLOBAL_SYNC_STATUS 레지스터에서 VUPDATE_NO_LOCK_EN 비트를 설정합니다.
IRQ가 발생(fire)한 후 이를 확인(ack)하려면, 드라이버는 동일한 GLOBAL_SYNC_STATUS 레지스터의 VUPDATE_NO_LOCK_CLEAR 비트를 설정합니다.
이러한 비트 설정은 원자성이 아닌(read/modify/write) 연산을 통해 수행되므로, 다음과 같은 Race Condition이 발생할 수 있습니다:
스레드 A: IRQ 핸들러: *HW IRQ 발생* # IRQ 비활성화 val = read(GLOBAL_SYNC_STATUS) unset(val, VUPDATE_NO_LOCK_EN) write(val, GLOBAL_SYNC_STATUS) # ACK는 VUPDATE_NO_LOCK_EN이 해제된 것을 읽음 val1 = read(GLOBAL_SYNC_STATUS) set(val1, VUPDATE_NO_LOCK_CLEAR) # IRQ 활성화 val = read(GLOBAL_SYNC_STATUS) set(val, VUPDATE_NO_LOCK_EN) write(val, GLOBAL_SYNC_STATUS) # BAD! VUPDATE_NO_LOCK_EN을 지움 write(val1, GLOBAL_SYNC_STATUS)
태그된 Fixes 변경 사항과 관련하여, 해당 변경으로 인해 이 Race Condition이 발생할 가능성이 더 높아진 것으로 보입니다. 이제 VUPDATE_NO_LOCK은 vblank 처리를 위한 유일한 IRQ 소스이며, 고주사율 패널에서 단일 Race Condition 발생 시 타임아웃(time out)을 초래할 수 있습니다.
[해결 방법]
GLOBAL_SYNC_STATUS 레지스터는 하나의 예시에 불과하며, 다른 IRQ 제어 레지스터들도 동일한 방식을 공유합니다. GLOBAL_SYNC_STATUS 외에도 이를 정리하겠습니다.
단순하게 유지하기 위해, 드라이버 전체에 걸린 단일 spinlock을 통해 IRQ rmw 연산을 원자성으로 처리합니다. 이 잠금의 범위가 작기 때문에 기존 IRQ set/handle 경로 내 모든 기존 잠금 위에 눈에 띄는 오버헤드를 발생시킬 가능성은 낮습니다.
DM이 로킹(locking)을 담당하므로, 새로운 amdgpu_dm_irq_set/ack 함수에서 dc_interrupt_set/ack를 spinlock으로 감쌉니다. DM의 모든 참조를 dc_interrupt_set/ack 대신 amdgpu_dm_irq_set/ack를 사용하도록 마이그레이션하거나 제거합니다.
(커밋 70de0a0216583a53c946155f8c8adedfdca6b4e7에서 cherry picked됨)
Once again VulDB remains the best source for vulnerability data.