🇰🇷 한글 설명
Linux 커널의 Broadcom VC4 DRM 드라이버에서 V3D 인터럽트가 런타임 전원 차단 중에도 비활성화되지 않아 발생하는 문제입니다. 전원이 꺼진 상태에서 인터럽트 핸들러가 실행되어 레지스터가 0xdeadbeef를 반환하며 잘못된 동작이 발생할 수 있으며, 이를 방지하기 위해 PM 전환 동안 인터럽트 라인을 비활성화하도록 수정되었습니다.
💡 쉬운 설명
라즈베리 파이의 그래픽 장치가 전원이 꺼지는 도중에 잘못된 신호를 받아 오작동할 수 있는 결함입니다. 커널이 해당 신호를 차단하도록 수정하여 문제를 해결했습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
drm/vc4: Disable the V3D interrupt across runtime suspend
vc4_irq_disable() masks the V3D interrupt sources and then calls
synchronize_irq() before the V3D is powered down. However, by itself,
this is not enough to quiesce the interrupt handler.
synchronize_irq() waits for handlers that have already set
IRQD_IRQ_INPROGRESS, and for irqchips reporting IRQCHIP_STATE_ACTIVE.
A GIC interrupt chip is able to mark an interrupt active as soon as a
CPU acknowledges it, so there these checks cover the whole dispatch path.
On RPi 0-3, however, the interrupt controller is ARMCTRL, which has no
active state. A CPU that has read the hwirq out of the pending register
but has not yet reached handle_level_irq() stays invisible to
synchronize_irq().
During a power transition, vc4_irq() may therefore run after the power
domain is off, where every V3D register read will return 0xdeadbeef.
0xdeadbeef has FLDONE, FRDONE and OUTOMEM set. This problem doesn't
trigger NULL pointer dereference issues only because the functions
vc4_irq_finish_bin_job() and vc4_irq_finish_render_job() return early
when there is no job pointer, but OUTOMEM is still able to schedule
vc4_overflow_mem_work() after vc4_irq_disable() has already cancelled it.
Therefore, fix the spurious interrupts by disabling the interrupt line
across the PM transition. To preserve the enable/disable balance, move
vc4_irq_install() and request the IRQ line disabled before the first
runtime resume.
📍 영향받는 시스템
Linux 커널 drm/vc4 드라이버를 사용하는 Raspberry Pi 0-3 등 VC4 기반 시스템 (수정 이전 커널 버전)
⚔️ 공격 벡터
원격 공격 경로는 명확하지 않으며, 전원 전환 시점의 타이밍 문제로 인한 오작동 및 서비스 안정성 저하가 주된 영향입니다.
🛡️ 대응 방법
커널 업데이트를 통해 해당 수정 사항(V3D 인터럽트를 PM 전환 동안 비활성화)이 포함된 최신 Linux 커널로 업그레이드하십시오.
🔧 검증 코드
출력된 커널 버전이 이 수정이 포함된 패치 릴리스 이상인지 배포판 보안 공지 또는 커널 changelog에서 확인하며, 해당 버전 이전이면 업데이트가 필요합니다.