🇰🇷 한글 설명
Linux 커널 igb 드라이버에서 AF_XDP 제로카피 애플리케이션이 비정상 종료(kill -9)될 때, igb_down()이 napi_synchronize()에서 무한 대기하여 TX 워치독이 발생하고 TX 큐가 영구적으로 멈추는 문제가 수정되었습니다. 해당 napi_synchronize() 호출을 제거하고 napi_disable() 순서를 조정했습니다.
💡 쉬운 설명
고속 네트워크 기능을 쓰는 프로그램이 강제로 꺼지면 네트워크 카드가 멈춰 송신이 끊길 수 있습니다. 이 수정으로 카드가 정상적으로 꺼지고 멈춤 현상이 해결됩니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
igb: remove napi_synchronize() in igb_down()
When an AF_XDP zero-copy application terminates abruptly (e.g., kill -9),
the XSK buffer pool is destroyed but NAPI polling continues.
igb_clean_rx_irq_zc() repeatedly returns the full budget, preventing
napi_complete_done() from clearing NAPI_STATE_SCHED.
igb_down() calls napi_synchronize() before napi_disable() for each queue
vector. napi_synchronize() spins waiting for NAPI_STATE_SCHED to clear,
which never happens. igb_down() blocks indefinitely, the TX watchdog
fires, and the TX queue remains permanently stalled.
napi_disable() already handles this correctly: it sets NAPI_STATE_DISABLE.
After a full-budget poll, __napi_poll() checks napi_disable_pending(). If
set, it forces completion and clears NAPI_STATE_SCHED, breaking the loop
that napi_synchronize() cannot.
napi_synchronize() was added in commit 41f149a285da ("igb: Fix possible
panic caused by Rx traffic arrival while interface is down").
napi_disable() provides stronger guarantees: it prevents further
scheduling and waits for any active poll to exit.
Other Intel drivers (ixgbe, ice, i40e) use napi_disable() without a
preceding napi_synchronize() in their down paths.
Remove redundant napi_synchronize() call and reorder napi_disable()
before igb_set_queue_napi() so the queue-to-NAPI mapping is only
cleared after polling has fully stopped.
📍 영향받는 시스템
igb 네트워크 드라이버를 사용하고 AF_XDP 제로카피 기능을 쓰는 수정 전 Linux 커널 버전
⚔️ 공격 벡터
로컬 사용자가 AF_XDP 애플리케이션을 강제 종료하여 네트워크 송신 큐를 중단시키는 서비스 거부(DoS) 상황
🛡️ 대응 방법
패치된 Linux 커널 버전으로 업데이트하거나 배포판의 보안 업데이트를 적용하세요.
🔧 검증 코드
커널 버전을 확인해 배포판 보안 공지에 나온 패치 버전 이상인지 비교하고, igb 모듈이 로드되어 있지 않다면 이 취약점의 영향을 받지 않습니다.
uname -r && (lsmod | grep -w igb || echo 'igb 모듈 미로드')