In the Linux kernel, the following vulnerability has been resolved: ipv6: avoid overflows in ip6_datagram_send_ctl() Yiming Qian reported
위협 신호 · CVSS · EPSS · KEV
이론적 심각도 점수
30일 내 악용 확률 예측
실측 악용 기록 없음
별도 긴급 패치 불필요 — 정기 시스템 업그레이드 주기에 맞춰 조치
CVSS 벡터 · 메트릭
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H약점 (CWE)
- CWE-617
도달 가능한 Assertion — 외부 입력으로 assert 가 발동해 충돌(DoS).
상세 설명
In the Linux kernel, the following vulnerability has been resolved:
ipv6: avoid overflows in ip6_datagram_send_ctl()
Yiming Qian reported :
<quote>
I believe I found a locally triggerable kernel bug in the IPv6 sendmsg
ancillary-data path that can panic the kernel via skb_under_panic()
(local DoS).
The core issue is a mismatch between:
- a 16-bit length accumulator (
struct ipv6_txoptions::opt_flen, type
__u16) and - a pointer to the last provided destination-options header (
opt->dst1opt)
when multiple IPV6_DSTOPTS control messages (cmsgs) are provided.
include/net/ipv6.h:struct ipv6_txoptions::opt_flenis__u16(wrap possible).
(lines 291-307, especially 298)
net/ipv6/datagram.c:ip6_datagram_send_ctl():- Accepts repeated
IPV6_DSTOPTSand accumulates intoopt_flen
without rejecting duplicates. (lines 909-933)
- Accepts repeated
net/ipv6/ip6_output.c:__ip6_append_data():- Uses
opt->opt_flen + opt->opt_nflento compute header
sizes/headroom decisions. (lines 1448-1466, especially 1463-1465)
- Uses
net/ipv6/ip6_output.c:__ip6_make_skb():- Calls
ipv6_push_frag_opts()ifopt->opt_flenis non-zero.
(lines 1930-1934)
- Calls
net/ipv6/exthdrs.c:ipv6_push_frag_opts()/ipv6_push_exthdr():- Push size comes from
ipv6_optlen(opt->dst1opt)(based on the
pointed-to header). (lines 1179-1185 and 1206-1211)
- Push size comes from
opt_flenis a 16-bit accumulator:
include/net/ipv6.h:298defines__u16 opt_flen; /* after fragment hdr */.
ip6_datagram_send_ctl()accepts repeatedIPV6_DSTOPTScmsgs
and incrementsopt_fleneach time:
- In
net/ipv6/datagram.c:909-933, forIPV6_DSTOPTS:- It computes
len = ((hdr->hdrlen + 1) << 3); - It checks
CAP_NET_RAWusingns_capable(net->user_ns, CAP_NET_RAW). (line 922) - Then it does:
opt->opt_flen += len;(line 927)opt->dst1opt = hdr;(line 928)
- It computes
There is no duplicate rejection here (unlike the legacy
IPV6_2292DSTOPTS path which rejects duplicates at
net/ipv6/datagram.c:901-904).
If enough large IPV6_DSTOPTS cmsgs are provided, opt_flen wraps
while dst1opt still points to a large (2048-byte)
destination-options header.
In the attached PoC (poc.c):
- 32 cmsgs with
hdrlen=255=>len = (255+1)*8 = 2048 - 1 cmsg with
hdrlen=0=>len = 8 - Total increment:
32*2048 + 8 = 65544, so(__u16)opt_flen == 8 - The last cmsg is 2048 bytes, so
dst1optpoints to a 2048-byte header.
- The transmit path sizes headers using the wrapped
opt_flen:
- In
net/ipv6/ip6_output.c:1463-1465:headersize = sizeof(struct ipv6hdr) + (opt ? opt->opt_flen + opt->opt_nflen : 0) + ...;
With wrapped opt_flen, headersize/headroom decisions underestimate
what will be pushed later.
- When building the final skb, the actual push length comes from
dst1optand is not limited by wrappedopt_flen:
- In
net/ipv6/ip6_output.c:1930-1934:if (opt->opt_flen) proto = ipv6_push_frag_opts(skb, opt, proto);
- In
net/ipv6/exthdrs.c:1206-1211,ipv6_push_frag_opts()pushes
dst1optviaipv6_push_exthdr(). - In
net/ipv6/exthdrs.c:1179-1184,ipv6_push_exthdr()does:skb_push(skb, ipv6_optlen(opt));memcpy(h, opt, ipv6_optlen(opt));
With insufficient headroom, skb_push() underflows and triggers
skb_under_panic() -> BUG():
-
net/core/skbuff.c:2669-2675(skb_push()callsskb_under_panic()) -
net/core/skbuff.c:207-214(skb_panic()ends inBUG()) -
The
IPV6_DSTOPTScmsg path requiresCAP_NET_RAWin the target
netns user namespace (ns_capable(net->user_ns, CAP_NET_RAW)). -
Root (or any task with
CAP_NET_RAW) can trigger this without user
namespaces. -
An unprivileged
uid=1000user can trigger this if unprivileged
user namespaces are enabled and it can create a userns+netns to obtain
namespacedCAP_NET_RAW(the attached PoC does this). -
Local denial of service: kernel BUG/panic (system crash).
---truncated---
AI 심층 분석
공격 시나리오 · 재현 가능한 PoC 페이로드 · 즉시 적용 가능한 차단 패치를 한 번에 받아 보세요. 보안 운영팀이 그대로 점검·티켓팅에 쓸 수 있는 형태로 정리해 드립니다.
영향받는 제품·버전
- linux linux_kernel2.6.14 - 5.10.253linux
- linux linux_kernel5.11 - 5.15.203linux
- linux linux_kernel5.16 - 6.1.168linux
- linux linux_kernel6.2 - 6.6.134linux
- linux linux_kernel6.7 - 6.12.81linux
- linux linux_kernel6.13 - 6.18.22linux
- linux linux_kernel6.19 - 6.19.12linux
- linux linux_kernellinux
- linux linux_kernellinux
- linux linux_kernellinux
- linux linux_kernellinux
- linux linux_kernellinux
- linux linux_kernellinux
- linux linux_kernellinux
영향받는 구성 (CPE) 8
- linux linux_kernel≥ 2.6.14 < 5.10.253cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
- linux linux_kernel 7.0cpe:2.3:o:linux:linux_kernel:7.0:rc1:*:*:*:*:*:*
- linux linux_kernel 7.0cpe:2.3:o:linux:linux_kernel:7.0:rc2:*:*:*:*:*:*
- linux linux_kernel 7.0cpe:2.3:o:linux:linux_kernel:7.0:rc3:*:*:*:*:*:*
- linux linux_kernel 7.0cpe:2.3:o:linux:linux_kernel:7.0:rc4:*:*:*:*:*:*
- linux linux_kernel 7.0cpe:2.3:o:linux:linux_kernel:7.0:rc5:*:*:*:*:*:*
- linux linux_kernel 7.0cpe:2.3:o:linux:linux_kernel:7.0:rc6:*:*:*:*:*:*
- linux linux_kernel 7.0cpe:2.3:o:linux:linux_kernel:7.0:rc7:*:*:*:*:*:*
참고 자료 10
링크 내용 불러오는 중…