🇰🇷 한글 설명
Linux 커널의 rtw89 WiFi 드라이버에서 재부팅 시 rfkill 폴링을 중단하는 .shutdown 콜백이 누락되어 발생한 문제입니다. arm64 플랫폼에서 warm reboot 시 PCIe 링크가 해제된 후 MMIO 읽기를 시도하면 비동기 SError와 함께 커널 패닉이 발생할 수 있습니다.
💡 쉬운 설명
컴퓨터를 다시 시작할 때 WiFi 장치가 꺼지는 과정에서 시스템이 장치를 계속 확인하려고 시도하여 오류가 발생합니다. 이로 인해 시스템이 갑자기 멈추거나 재부팅에 실패할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
wifi: rtw89: pci: add .shutdown callback to stop rfkill polling on reboot
Since the hardware rfkill polling was introduced, arm64 platforms can
panic with an asynchronous SError during warm reboot:
SError Interrupt on CPU8, code 0x00000000be000011 -- SError
Workqueue: events_power_efficient rfkill_poll [rfkill]
rtw89_pci_ops_read8+0x94/0x160 [rtw89_pci]
rtw89_core_rfkill_poll+0x50/0x1e0 [rtw89_core]
rtw89_ops_rfkill_poll+0x40/0x68 [rtw89_core]
ieee80211_rfkill_poll+0x3c/0x70 [mac80211]
cfg80211_rfkill_poll+0x40/0x2a0 [cfg80211]
rfkill_poll+0x30/0x88 [rfkill]
Kernel panic - not syncing: Asynchronous SError Interrupt
On the reboot path the kernel only runs device_shutdown(), which calls
each driver's .shutdown callback; .remove is not invoked. The rtw89 PCI
driver had no .shutdown callback, so nothing stopped the rfkill polling
work while the platform was tearing the PCIe link down. Once the link
is gone, the next MMIO read from the poll handler targets a
non-responding device and is reported as a fatal asynchronous SError on
arm64.
Add rtw89_pci_shutdown(), wired to all rtw89 PCI device drivers, which
sets a new RTW89_FLAG_SHUTDOWN flag (mirroring the USB
RTW89_FLAG_UNPLUGGED pattern). When the flag is set,
rtw89_ops_rfkill_poll() returns early, so no MMIO read is issued to the
chip after shutdown begins and the SError no longer occurs.
This does not call the full .remove path from .shutdown, to keep the
shutdown handler minimal and avoid running the non-idempotent teardown
twice.
📍 영향받는 시스템
rtw89 WiFi 드라이버를 사용하는 arm64 기반 Linux 시스템
⚔️ 공격 벡터
물리적/논리적 재부팅을 유도하여 시스템 패닉 유발 (DoS)
🛡️ 대응 방법
rtw89_pci_shutdown 콜백이 포함된 최신 Linux 커널로 업데이트
🔧 검증 코드
커널 버전과 rtw89_pci 모듈 정보를 확인하여 패치가 적용된 최신 버전인지 확인합니다.
uname -r && modinfo rtw89_pci 2>/dev/null | grep -i 'version'