🇰🇷 한글 설명
Linux 커널의 IPv6 NDISC 기능에서 accept_untracked_na() 함수가 NULL 포인터를 참조하여 발생하는 취약점입니다. 네트워크 인터페이스가 다운되는 과정에서 RCU 임계 구역 내의 데이터 불일치로 인해 커널 패닉(Oops)이 발생할 수 있습니다.
💡 쉬운 설명
네트워크 설정이 변경되는 찰나의 순간을 이용해 컴퓨터의 핵심 시스템인 커널을 강제로 멈추게 만들 수 있는 오류입니다. 권한이 낮은 사용자라도 네트워크 설정을 조작하여 시스템을 중단시킬 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
ipv6: ndisc: fix NULL deref in accept_untracked_na()
accept_untracked_na() re-fetches the inet6_dev with __in6_dev_get(dev)
and dereferences idev->cnf.accept_untracked_na without a NULL check,
even though its only caller ndisc_recv_na() already fetched and
NULL-checked idev for the same device.
Both reads of dev->ip6_ptr run in the same RCU read-side critical
section, but a concurrent addrconf_ifdown() can clear dev->ip6_ptr
between them: lowering the MTU below IPV6_MIN_MTU calls addrconf_ifdown()
without the synchronize_net() that orders the unregister path, so the
re-fetch returns NULL and oopses:
BUG: KASAN: null-ptr-deref in ndisc_recv_na (net/ipv6/ndisc.c:974)
Read of size 4 at addr 0000000000000364
Call Trace:
<IRQ>
ndisc_recv_na (net/ipv6/ndisc.c:974)
icmpv6_rcv (net/ipv6/icmp.c:1193)
ip6_protocol_deliver_rcu (net/ipv6/ip6_input.c:479)
ip6_input_finish (net/ipv6/ip6_input.c:534)
ip6_input (net/ipv6/ip6_input.c:545)
ip6_mc_input (net/ipv6/ip6_input.c:635)
ipv6_rcv (net/ipv6/ip6_input.c:351)
</IRQ>
It is reachable by an unprivileged user via a network namespace.
Pass the caller's already validated idev instead of re-fetching it; the
idev stays alive for the whole RCU critical section, so it is safe even
after dev->ip6_ptr has been cleared.
📍 영향받는 시스템
Linux Kernel (IPv6 NDISC 관련 모듈 사용 시스템)
⚔️ 공격 벡터
네트워크 네임스페이스를 사용하는 비특권 사용자가 네트워크 인터페이스 상태를 조작하여 발생
🛡️ 대응 방법
Linux 커널을 최신 보안 패치가 적용된 버전으로 업데이트하십시오.
🔧 검증 코드
출력된 커널 버전을 확인하여 해당 취약점이 해결된 패치 버전인지 확인하십시오.