🇰🇷 한글 설명
Marvell MPIC 플랫폼(Armada 370/XP/38x)의 Linux 커널 mvneta 드라이버에서 발생하는 취약점입니다. 시스템이 절전 모드(Suspend)로 진입할 때 NAPI 폴링이 완료되지 않으면 per-CPU 인터럽트가 영구적으로 마스킹되어 네트워크 연결이 완전히 끊어지는 문제가 발생합니다.
💡 쉬운 설명
컴퓨터가 잠시 잠들었다가 깨어날 때, 네트워크 신호를 받아들이는 스위치가 꺼진 상태로 유지되는 버그입니다. 이로 인해 컴퓨터가 깨어난 후에도 인터넷 연결이 되지 않는 현상이 발생합니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
net: mvneta: re-enable percpu interrupt on resume
On Marvell MPIC platforms (Armada 370/XP/38x), mvneta uses a percpu
IRQ disable/enable scheme for NAPI: the ISR (mvneta_percpu_isr) calls
disable_percpu_irq() to mask the MPIC per-CPU interrupt and schedules
NAPI poll, which calls enable_percpu_irq() on completion to unmask.
If suspend occurs while NAPI poll is pending (between
disable_percpu_irq in the ISR and enable_percpu_irq in poll
completion), the interrupt is never re-enabled:
1. mvneta_percpu_isr: disable_percpu_irq() + napi_schedule()
=> MPIC masked, percpu_enabled cpumask bit cleared
2. NAPI poll does not complete before suspend proceeds
(on PREEMPT_RT this is highly likely since softirqs run in
ksoftirqd which gets frozen; on non-RT it can happen when
softirq processing is deferred to ksoftirqd)
3. mvneta_stop_dev => napi_disable(): cancels the pending poll
without executing the completion path
4. suspend_device_irqs => IRQCHIP_MASK_ON_SUSPEND: masks MPIC
(already masked, but records IRQS_SUSPENDED)
5. Resume: mpic_resume checks irq_percpu_is_enabled() => false
(bit was cleared in step 1) => skips unmask
6. mvneta_start_dev only restores device-level INTR_NEW_MASK,
does not touch the MPIC per-CPU mask
Result: MPIC per-CPU interrupt stays masked permanently. The NIC
generates interrupts (INTR_NEW_CAUSE != 0) but the CPU never
receives them, causing complete loss of network connectivity.
Fix by calling on_each_cpu(mvneta_percpu_enable) in the resume path
to unconditionally unmask the MPIC per-CPU interrupt regardless of
pre-suspend state.
📍 영향받는 시스템
Linux kernel (Marvell Armada 370/XP/38x platforms using mvneta driver)
⚔️ 공격 벡터
Local/Physical (System Suspend/Resume cycle manipulation)
🛡️ 대응 방법
Linux 커널을 최신 패치가 적용된 버전으로 업데이트하여 resume 경로에서 per-CPU 인터럽트를 강제로 재활성화해야 합니다.
🔧 검증 코드
현재 실행 중인 커널 버전을 확인하여 해당 취약점이 해결된 패치 버전인지 확인합니다.