🇰🇷 한글 설명
리눅스 커널의 inet 분할 재조립 모듈에서 네트워크 네임스페이스 종료 시 대기 중인 스킷 버퍼를 정리하지 않아 커널 데드락이 발생하는 취약점입니다. 이는 conntrack 참조가 해제되지 않아 네임스페이스 정리 과정에서 무한 루프를 돌게 만듭니다.
💡 쉬운 설명
시스템 종료 또는 모듈 제거 시 필요한 메모리 정리 작업이 누락되어 시스템이 멈추는 현상이 발생합니다. 이는 공격자가 의도적으로 유발하기보다는 시스템 부하나 특정 드라이로딩 시 우연히 발생할 수 있는 안정성 문제입니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
inet: frags: flush pending skbs in fqdir_pre_exit()
We have been seeing occasional deadlocks on pernet_ops_rwsem since
September in NIPA. The stuck task was usually modprobe (often loading
a driver like ipvlan), trying to take the lock as a Writer.
lockdep does not track readers for rwsems so the read wasn't obvious
from the reports.
On closer inspection the Reader holding the lock was conntrack looping
forever in nf_conntrack_cleanup_net_list(). Based on past experience
with occasional NIPA crashes I looked thru the tests which run before
the crash and noticed that the crash follows ip_defrag.sh. An immediate
red flag. Scouring thru (de)fragmentation queues reveals skbs sitting
around, holding conntrack references.
The problem is that since conntrack depends on nf_defrag_ipv6,
nf_defrag_ipv6 will load first. Since nf_defrag_ipv6 loads first its
netns exit hooks run _after_ conntrack's netns exit hook.
Flush all fragment queue SKBs during fqdir_pre_exit() to release
conntrack references before conntrack cleanup runs. Also flush
the queues in timer expiry handlers when they discover fqdir->dead
is set, in case packet sneaks in while we're running the pre_exit
flush.
The commit under Fixes is not exactly the culprit, but I think
previously the timer firing would eventually unblock the spinning
conntrack.
📍 영향받는 시스템
Linux Kernel (inet fragments 관련 모듈)
⚔️ 공격 벡터
로컬 시스템의 네트워크 네임스페이스 조작 또는 ipvlan 드라이로딩 시 발생하는 데드락
🛡️ 대응 방법
리눅스 커널 최신 버전으로 업그레이드하여 fqdir_pre_exit() 함수의 패치 적용
🔧 검증 코드
출력된 커널 버전이 패치가 적용된 최신 안정화 버전인지 확인
💻 영향받는 소프트웨어
NVIDIA GPU Display Driver for Linux