已关闭
CVE-2026-31415 #14148
openeuler-ci-bot创建于  4月13日关闭于  6月1日
openeuler-ci-bot
openeuler-ci-bot成员
4月13日 创建

一、漏洞信息
漏洞编号:CVE-2026-31415
漏洞归属组件:kernel
漏洞归属的版本:4.19.140,4.19.194,4.19.90,5.10.0,6.1.19,6.12.33,6.18.18,6.4.0,6.6.0
CVSS评分:
BaseScore:5.5 Medium
Vector:CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
漏洞简述:
In the Linux kernel, the following vulnerability has been resolved:ipv6: avoid overflows in ip6_datagram_send_ctl()Yiming Qian reported : 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_flen is __u16 (wrap possible). (lines 291-307, especially 298) - net/ipv6/datagram.c:ip6_datagram_send_ctl(): - Accepts repeated IPV6_DSTOPTS and accumulates into opt_flen without rejecting duplicates. (lines 909-933) - net/ipv6/ip6_output.c:__ip6_append_data(): - Uses opt->opt_flen + opt->opt_nflen to compute header sizes/headroom decisions. (lines 1448-1466, especially 1463-1465) - net/ipv6/ip6_output.c:__ip6_make_skb(): - Calls ipv6_push_frag_opts() if opt->opt_flen is non-zero. (lines 1930-1934) - 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) 1. opt_flen is a 16-bit accumulator: - include/net/ipv6.h:298 defines __u16 opt_flen; /* after fragment hdr */. 2. ip6_datagram_send_ctl() accepts repeated IPV6_DSTOPTS cmsgs and increments opt_flen each time: - In net/ipv6/datagram.c:909-933, for IPV6_DSTOPTS: - It computes len = ((hdr->hdrlen + 1) << 3); - It checks CAP_NET_RAW using ns_capable(net->user_ns, CAP_NET_RAW). (line 922) - Then it does: - opt->opt_flen += len; (line 927) - opt->dst1opt = hdr; (line 928) 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 dst1opt points to a 2048-byte header. 3. 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. 4. When building the final skb, the actual push length comes from dst1opt and is not limited by wrapped opt_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 dst1opt via ipv6_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() calls skb_under_panic()) - net/core/skbuff.c:207-214 (skb_panic() ends in BUG()) - The IPV6_DSTOPTS cmsg path requires CAP_NET_RAW in 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=1000 user can trigger this if unprivileged user namespaces are enabled and it can create a userns+netns to obtain namespaced CAP_NET_RAW (the attached PoC does this). - Local denial of service: kernel BUG/panic (system crash). ----truncated---
漏洞公开时间:2026-04-13 22:16:10
漏洞创建时间:2026-04-13 22:03:51
漏洞详情参考链接:
https://nvd.nist.gov/vuln/detail/CVE-2026-31415

更多参考(点击展开)
参考来源 参考链接 来源链接
https://git.kernel.org/stable/c/0bdaf54d3aaddfe8df29371260fa8d4939b4fd6f
https://git.kernel.org/stable/c/63fda74885555e6bd1623b5d811feec998740ba4
https://nvd.nist.gov/vuln/detail/CVE-2026-31415
https://bugzilla.redhat.com/show_bug.cgi?id=2457840
https://git.kernel.org/stable/c/872b74900d5daa37067ac676d9001bb929fc6a2a
https://git.kernel.org/stable/c/9ed81d692758dfb9471d7799b24bfa7a08224c31
https://lore.kernel.org/linux-cve-announce/2026041310-CVE-2026-31415-f7e1@gregkh/T/#u
https://git.kernel.org/stable/c/5e4ee5dbea134e9257f205e31a96040bed71e83f
https://git.kernel.org/stable/c/2dbfb003bbf3fc0e94f07efefab0ebcf83029a2a
https://www.cve.org/CVERecord?id=CVE-2026-31415
https://lore.kernel.org/linux-cve-announce/2026041310-CVE-2026-31415-f7e1@gregkh/T
https://git.kernel.org/stable/c/4082f9984a694829153115d28c956a3534f52f29
https://git.kernel.org/stable/c/4e453375561fc60820e6b9d8ebeb6b3ee177d42e

漏洞分析指导链接:
https://atomgit.com/openeuler/cve-manager/blob/master/cve-vulner-manager/doc/md/manual.md
漏洞数据来源:
七彩瞬析开源风险感知平台
漏洞补丁信息:

详情(点击展开)
影响的包 修复版本 修复补丁 问题引入补丁 来源
gregkh/linux https://git.kernel.org/stable/c/0bdaf54d3aaddfe8df29371260fa8d4939b4fd6f.patch ljqc
gregkh/linux https://git.kernel.org/stable/c/5e4ee5dbea134e9257f205e31a96040bed71e83f ljqc
gregkh/linux https://git.kernel.org/stable/c/63fda74885555e6bd1623b5d811feec998740ba4 ljqc
gregkh/linux https://git.kernel.org/stable/c/9ed81d692758dfb9471d7799b24bfa7a08224c31 ljqc
gregkh/linux https://git.kernel.org/stable/c/872b74900d5daa37067ac676d9001bb929fc6a2a ljqc
gregkh/linux https://git.kernel.org/stable/c/4e453375561fc60820e6b9d8ebeb6b3ee177d42e ljqc
https://git.kernel.org/stable/c/0bdaf54d3aaddfe8df29371260fa8d4939b4fd6f cvelistv5
https://git.kernel.org/stable/c/63fda74885555e6bd1623b5d811feec998740ba4 cvelistv5
https://git.kernel.org/stable/c/872b74900d5daa37067ac676d9001bb929fc6a2a cvelistv5
https://git.kernel.org/stable/c/9ed81d692758dfb9471d7799b24bfa7a08224c31 cvelistv5
https://git.kernel.org/stable/c/5e4ee5dbea134e9257f205e31a96040bed71e83f cvelistv5
https://git.kernel.org/stable/c/2dbfb003bbf3fc0e94f07efefab0ebcf83029a2a cvelistv5
https://git.kernel.org/stable/c/4082f9984a694829153115d28c956a3534f52f29 cvelistv5
https://git.kernel.org/stable/c/4e453375561fc60820e6b9d8ebeb6b3ee177d42e cvelistv5

二、漏洞分析结构反馈
影响性分析说明:
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-&gt;dst1opt) when multiple IPV6_DSTOPTS control messages (cmsgs) are provided. - include/net/ipv6.h: - struct ipv6_txoptions::opt_flen is __u16 (wrap possible). (lines 291-307, especially 298) - net/ipv6/datagram.c:ip6_datagram_send_ctl(): - Accepts repeated IPV6_DSTOPTS and accumulates into opt_flen without rejecting duplicates. (lines 909-933) - net/ipv6/ip6_output.c:__ip6_append_data(): - Uses opt-&gt;opt_flen + opt-&gt;opt_nflen to compute header sizes/headroom decisions. (lines 1448-1466, especially 1463-1465) - net/ipv6/ip6_output.c:__ip6_make_skb(): - Calls ipv6_push_frag_opts() if opt-&gt;opt_flen is non-zero. (lines 1930-1934) - net/ipv6/exthdrs.c:ipv6_push_frag_opts() / ipv6_push_exthdr(): - Push size comes from ipv6_optlen(opt-&gt;dst1opt) (based on the pointed-to header). (lines 1179-1185 and 1206-1211) 1. opt_flen is a 16-bit accumulator: - include/net/ipv6.h:298 defines __u16 opt_flen; /* after fragment hdr */. 2. ip6_datagram_send_ctl() accepts repeated IPV6_DSTOPTS cmsgs and increments opt_flen each time: - In net/ipv6/datagram.c:909-933, for IPV6_DSTOPTS: - It computes len = ((hdr-&gt;hdrlen + 1) &lt;&lt; 3); - It checks CAP_NET_RAW using ns_capable(net-&gt;user_ns, CAP_NET_RAW). (line 922) - Then it does: - opt-&gt;opt_flen += len; (line 927) - opt-&gt;dst1opt = hdr; (line 928) 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 dst1opt points to a 2048-byte header. 3. The transmit path sizes headers using the wrapped opt_flen:- In net/ipv6/ip6_output.c:1463-1465: - headersize = sizeof(struct ipv6hdr) + (opt ? opt-&gt;opt_flen + opt-&gt;opt_nflen : 0) + ...; With wrapped opt_flen, headersize/headroom decisions underestimate what will be pushed later. 4. When building the final skb, the actual push length comes from dst1opt and is not limited by wrapped opt_flen: - In net/ipv6/ip6_output.c:1930-1934: - if (opt-&gt;opt_flen) proto = ipv6_push_frag_opts(skb, opt, proto); - In net/ipv6/exthdrs.c:1206-1211, ipv6_push_frag_opts() pushes dst1opt via ipv6_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() calls skb_under_panic()) - net/core/skbuff.c:207-214 (skb_panic() ends in BUG()) - The IPV6_DSTOPTS cmsg path requires CAP_NET_RAW in the target netns user namespace (ns_capable(net-&gt;user_ns, CAP_NET_RAW)). - Root (or any task with CAP_NET_RAW) can trigger this without user namespaces. - An unprivileged uid=1000 user can trigger this if unprivileged user namespaces are enabled and it can create a userns+netns to obtain namespaced CAP_NET_RAW (the attached PoC does this). - Local denial of service: kernel BUG/panic (system crash). - Reproducible with a small userspace PoC.</quote>This patch does not reject duplicated options, as this might breaksome user applications.Instead, it makes sure to adjust opt_flen and opt_nflen to correctlyreflect the size of the current option headers, preventing the overflowsand the potential for panics.This applies to IPV6_DSTOPTS, IPV6_HOPOPTS, and IPV6_RTHDR.Specifically:When a new IPV6_DSTOPTS is processed, the length of the old opt->dst1optis subtracted from opt->opt_flen before adding the new length.When a new IPV6_HOPOPTS is processed, the length of the old opt->dst0optis subtracted from opt->opt_nflen.When a new Routing Header (IPV6_RTHDR or IPV6_2292RTHDR) is processed,the length of the old opt->srcrt is subtracted from opt->opt_nflen.In the special case within IPV6_2292RTHDR handling where dst1opt is movedto dst0opt, the length of the old opt->dst0opt is subtracted fromopt->opt_nflen before the new one is added.The Linux kernel CVE team has assigned CVE-2026-31415 to this issue.
openEuler评分:
5.5
Vector:CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
受影响版本排查(受影响/不受影响):
1.master(6.18.18):不受影响
2.openEuler-20.03-LTS-SP4(4.19.90):受影响
3.openEuler-22.03-LTS-SP4(5.10.0):受影响
4.openEuler-24.03-LTS(6.6.0):受影响
5.openEuler-24.03-LTS-Next(6.6.0):不受影响
6.openEuler-24.03-LTS-SP1(6.6.0):受影响
7.openEuler-24.03-LTS-SP2(6.6.0):受影响
8.openEuler-24.03-LTS-SP3(6.6.0):受影响
9.openEuler-22.03-LTS-SP3(5.10.0):受影响
10.openEuler-24.03-LTS-SP4(6.6.0):不受影响

修复是否涉及abi变化(是/否):
1.master(6.18.18):否
2.openEuler-20.03-LTS-SP4(4.19.90):否
3.openEuler-22.03-LTS-SP4(5.10.0):否
4.openEuler-24.03-LTS(6.6.0):否
5.openEuler-24.03-LTS-Next(6.6.0):否
6.openEuler-24.03-LTS-SP1(6.6.0):否
7.openEuler-24.03-LTS-SP2(6.6.0):否
8.openEuler-24.03-LTS-SP3(6.6.0):否
9.openEuler-22.03-LTS-SP3(5.10.0):否
10.openEuler-24.03-LTS-SP4(6.6.0):否

原因说明:
1.master(6.18.18):不受影响-漏洞代码不能被攻击者触发
2.openEuler-20.03-LTS-SP4(4.19.90):不修复-超出修复范围
3.openEuler-22.03-LTS-SP4(5.10.0):不修复-超出修复范围
4.openEuler-24.03-LTS(6.6.0):正常修复
5.openEuler-24.03-LTS-Next(6.6.0):不受影响-漏洞代码不能被攻击者触发
6.openEuler-24.03-LTS-SP1(6.6.0):正常修复
7.openEuler-24.03-LTS-SP2(6.6.0):不修复-超出修复范围
8.openEuler-24.03-LTS-SP3(6.6.0):正常修复
9.openEuler-22.03-LTS-SP3(5.10.0):不修复-超出修复范围
10.openEuler-24.03-LTS-SP4(6.6.0):不受影响-漏洞代码不能被攻击者触发

likedislike
openeuler-ci-botopeneuler-ci-bot成员
4月13日 添加了label:CVE/UNFIXED
openeuler-ci-bot
openeuler-ci-bot成员
4月13日 评论:

issue处理注意事项:
1. 提交正常修复分支的修复PR时,必须关联当前issue,否则无法关闭当前issue;
2. 模板内容需要填写完整, 无论是受影响或者不受影响都需要填写完整内容;
3. 以下为模板中需要填写完整的内容, 请复制到评论区回复;
注: 内容的关键词(影响性分析说明, openEuler评分, 受影响版本排查(受影响/不受影响), 修复是否涉及abi变化(是/否), 原因说明)不能省略,省略后cve-manager将无法正常解析填写内容.


影响性分析说明:

openEuler评分: (评分和向量)

受影响版本排查(受影响/不受影响):
1.master(6.12.33):
2.openEuler-20.03-LTS-SP4(4.19.90):
3.openEuler-22.03-LTS-SP4(5.10.0):
4.openEuler-24.03-LTS(6.6.0):
5.openEuler-24.03-LTS-Next(6.6.0):
6.openEuler-24.03-LTS-SP1(6.6.0):
7.openEuler-24.03-LTS-SP2(6.6.0):
8.openEuler-24.03-LTS-SP3(6.6.0):

修复是否涉及abi变化(是/否):
1.master(6.12.33):
2.openEuler-20.03-LTS-SP4(4.19.90):
3.openEuler-22.03-LTS-SP4(5.10.0):
4.openEuler-24.03-LTS(6.6.0):
5.openEuler-24.03-LTS-Next(6.6.0):
6.openEuler-24.03-LTS-SP1(6.6.0):
7.openEuler-24.03-LTS-SP2(6.6.0):
8.openEuler-24.03-LTS-SP3(6.6.0):

原因说明:
1.master(6.12.33):
2.openEuler-20.03-LTS-SP4(4.19.90):
3.openEuler-22.03-LTS-SP4(5.10.0):
4.openEuler-24.03-LTS(6.6.0):
5.openEuler-24.03-LTS-Next(6.6.0):
6.openEuler-24.03-LTS-SP1(6.6.0):
7.openEuler-24.03-LTS-SP2(6.6.0):
8.openEuler-24.03-LTS-SP3(6.6.0):


原因说明填写请参考下方表格(注意:版本是否受影响和版本的原因说明必须对应,例如master版本分支受影响,那原因说明只能是受影响对应的原因之一!):

分支状态
原因说明 使用场景
受影响 正常修复 受影响且需要修复(包含升级版本修复)的漏洞;
受影响且已经修复的漏洞(历史修复PR也需要关联issue);
若因特殊原因无法修复,应修改原因说明为【不修复-特殊原因】,并在安委会备案相关情况。
受影响 暂不修复-漏洞仍在分析中 已关注到相关漏洞,正在处理,未明确漏洞影响和修复方案。
受影响 暂不修复-暂无解决方案或补丁 当前没有可用的修复或补救措施。【影响性分析】中应包含有关为什么没有修复或补救措施的详细说明、上游相关PR等。
受影响 不修复-超出修复范围 没有漏洞的修复计划。当版本停维、软件包宣布生命周期终止或弃用使用。
受影响 不修复-特殊原因导致不再修复 如存在其他特殊情况不修复相关漏洞,或评估后无法升级修复,应在openEuler社区安全委员会例会进行说明备案。
【影响性分析】中应包含不发布修复的详细说明、特殊情况还应有安委会会议纪要。
不受影响 不受影响-组件不存在 软件不受影响,因为易受攻击的组件不在产品中。
不受影响 不受影响-已有内置的内联控制或缓解措施 内置的内联控制或缓解措施可防止攻击者利用漏洞
不受影响 不受影响-漏洞代码不能被攻击者触发 易受攻击的组件存在,并且该组件包含易受攻击的代码。但是,易受攻击的代码的使用方式使得攻击者无法进行任何预期的攻击。
不受影响 不受影响-漏洞代码不在执行路径 易受影响的代码在执行过程中不可访问,包括产品的非预期状态。产品不使用也不执行的组件。
不受影响 不受影响-漏洞代码不存在 产品不受影响,因为漏洞背后的代码在产品中不存在。与component_not_present不同的是,有问题的组件存在,但由于某种原因(例如安全的编译器选项)使漏洞的特定代码不存在于组件中。

issue处理具体操作请参考:
https://atomgit.com/openeuler/cve-manager/blob/master/cve-vulner-manager/doc/md/manual.md
pr关联issue具体操作请参考:
https://docs.atomgit.com/docs/help/home/org_project/pullrequests/pr-related-issue

likedislike
devstation-robot
devstation-robot
4月13日 评论:

检测到新建 CVE Issue,CVE-ID: CVE-2026-31415

你可以通过以下两种方式使用 CVE 修复服务:

  1. 分支影响分析

    • 在本 Issue 下评论:/analysis_branches
    • 系统将自动分析各个分支是否受影响,并在本 Issue 下给出表格形式的分析结果;
  2. 在指定分支上创建 PR(修复提交)

    • 在本 Issue 下按如下格式评论(字段均为必填,每个字段单独一行):
/create_pr

branch: OLK-6.6 OLK-5.10
name: dev
email: dev@devstation.com
  • 说明:
    • branch: 需要创建 PR 的目标分支列表,例如 OLK-6.6 OLK-5.10
    • name: PR 签名人姓名(如责任人或安全负责人);
    • email: PR 签名人邮箱;

系统会根据上述信息自动在指定分支上创建 PR,并在本 Issue 下反馈结果。

provided by DevStation.

likedislike
openeuler-ci-botopeneuler-ci-bot成员
4月13日 添加了label:sig/Kernel
openeuler-ci-bot
openeuler-ci-bot成员
4月13日 评论:

Welcome To openEuler Community

Hey @openeuler-ci-bot , thanks for your contribution to the community.

Bot Usage Manual

I'm the Bot here serving you. You can find the instructions on how to interact with me at Here . That means you can comment below every pull request or issue to trigger Bot Commands.

Contact Guide

If you have any questions, please contact the SIG: Kernel ,
and any of the maintainers: @hanjunguo, @oekernel, @sanglipeng, @zeng_zhaorong, @zhengzengkai ,
and any of the committers: @CTC-XiboWang, @Frank_Sae, @GongLei-, @LiuYongQiang0816, @SuperSix173, @Tankll2021, @TrueAI, @allen-shi, @baratta, @caixu-blue, @chenjiesong, @chenjunxin1992, @chenke2026, @chiqijun, @chriszjh, @duanqiangwen, @fangfeng123, @fanghaiqinghw, @gaojuxin09, @gouhao2022, @guzitao, @hanjunguo, @hanliyang, @hellotcc, @hewanhan, @hjx_gitff, @hongwu-wang, @htforge, @hu-chunzhi, @hunan4222, @jackknight, @jerry_lilijun, @junlong-zheng, @juntianlinux, @kailiu42, @kaitiandu, @kazero00, @kevinzhu1, @kile2009, @koishimind, @kongzizaixian, @kylin-mayukun, @leoliu-oc, @li-huisong, @linan888, @linyunsheng, @liulongfang, @lostway1, @luckky7, @lujialin2, @markyuan4ta21, @mingqian218472, @mufengyan, @pigalsofine, @qinirao, @robinorg, @rock_hw, @sanglipeng, @shu-shengming, @shuaijiakun, @sming56_admin, @stavewu, @stkid, @wangboe2022, @wenzhiwei11, @whoisxxx, @wkfxxx, @woqidaideshi, @wsoydl, @xingmz1, @xukuohai, @yeweihua999, @ygn-ndwd-official, @yonghu_4dc5, @young-sun, @yuehaibing_planb, @yuzenghui1, @zhang-changzhong, @zhangyi089, @zhujianwei001, @zichengqu, @zqiao216 .

likedislike
此处折叠了51条消息 查看更多
openeuler-ci-bot
openeuler-ci-bot成员
6月1日 评论:

@wkfxxx 经过 cve-manager 解析, 已分析的内容如下表所示:

状态 分析项目 内容
已分析 1.影响性分析说明 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-&gt;dst1opt) when multiple IPV6_DSTOPTS control messages (cmsgs) are provided. - include/net/ipv6.h: - struct ipv6_txoptions::opt_flen is __u16 (wrap possible). (lines 291-307, especially 298) - net/ipv6/datagram.c:ip6_datagram_send_ctl(): - Accepts repeated IPV6_DSTOPTS and accumulates into opt_flen without rejecting duplicates. (lines 909-933) - net/ipv6/ip6_output.c:__ip6_append_data(): - Uses opt-&gt;opt_flen + opt-&gt;opt_nflen to compute header sizes/headroom decisions. (lines 1448-1466, especially 1463-1465) - net/ipv6/ip6_output.c:__ip6_make_skb(): - Calls ipv6_push_frag_opts() if opt-&gt;opt_flen is non-zero. (lines 1930-1934) - net/ipv6/exthdrs.c:ipv6_push_frag_opts() / ipv6_push_exthdr(): - Push size comes from ipv6_optlen(opt-&gt;dst1opt) (based on the pointed-to header). (lines 1179-1185 and 1206-1211) 1. opt_flen is a 16-bit accumulator: - include/net/ipv6.h:298 defines __u16 opt_flen; /* after fragment hdr */. 2. ip6_datagram_send_ctl() accepts repeated IPV6_DSTOPTS cmsgs and increments opt_flen each time: - In net/ipv6/datagram.c:909-933, for IPV6_DSTOPTS: - It computes len = ((hdr-&gt;hdrlen + 1) &lt;&lt; 3); - It checks CAP_NET_RAW using ns_capable(net-&gt;user_ns, CAP_NET_RAW). (line 922) - Then it does: - opt-&gt;opt_flen += len; (line 927) - opt-&gt;dst1opt = hdr; (line 928) 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 dst1opt points to a 2048-byte header. 3. The transmit path sizes headers using the wrapped opt_flen:- In net/ipv6/ip6_output.c:1463-1465: - headersize = sizeof(struct ipv6hdr) + (opt ? opt-&gt;opt_flen + opt-&gt;opt_nflen : 0) + ...; With wrapped opt_flen, headersize/headroom decisions underestimate what will be pushed later. 4. When building the final skb, the actual push length comes from dst1opt and is not limited by wrapped opt_flen: - In net/ipv6/ip6_output.c:1930-1934: - if (opt-&gt;opt_flen) proto = ipv6_push_frag_opts(skb, opt, proto); - In net/ipv6/exthdrs.c:1206-1211, ipv6_push_frag_opts() pushes dst1opt via ipv6_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() calls skb_under_panic()) - net/core/skbuff.c:207-214 (skb_panic() ends in BUG()) - The IPV6_DSTOPTS cmsg path requires CAP_NET_RAW in the target netns user namespace (ns_capable(net-&gt;user_ns, CAP_NET_RAW)). - Root (or any task with CAP_NET_RAW) can trigger this without user namespaces. - An unprivileged uid=1000 user can trigger this if unprivileged user namespaces are enabled and it can create a userns+netns to obtain namespaced CAP_NET_RAW (the attached PoC does this). - Local denial of service: kernel BUG/panic (system crash). - Reproducible with a small userspace PoC.</quote>This patch does not reject duplicated options, as this might breaksome user applications.Instead, it makes sure to adjust opt_flen and opt_nflen to correctlyreflect the size of the current option headers, preventing the overflowsand the potential for panics.This applies to IPV6_DSTOPTS, IPV6_HOPOPTS, and IPV6_RTHDR.Specifically:When a new IPV6_DSTOPTS is processed, the length of the old opt->dst1optis subtracted from opt->opt_flen before adding the new length.When a new IPV6_HOPOPTS is processed, the length of the old opt->dst0optis subtracted from opt->opt_nflen.When a new Routing Header (IPV6_RTHDR or IPV6_2292RTHDR) is processed,the length of the old opt->srcrt is subtracted from opt->opt_nflen.In the special case within IPV6_2292RTHDR handling where dst1opt is movedto dst0opt, the length of the old opt->dst0opt is subtracted fromopt->opt_nflen before the new one is added.The Linux kernel CVE team has assigned CVE-2026-31415 to this issue.
已分析 2.openEulerScore 5.5
已分析 3.openEulerVector AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
已分析 4.受影响版本排查 master:不受影响,openEuler-20.03-LTS-SP4:受影响,openEuler-22.03-LTS-SP4:受影响,openEuler-24.03-LTS:受影响,openEuler-24.03-LTS-Next:不受影响,openEuler-24.03-LTS-SP1:受影响,openEuler-24.03-LTS-SP2:受影响,openEuler-24.03-LTS-SP3:受影响,openEuler-22.03-LTS-SP3:受影响,openEuler-24.03-LTS-SP4:不受影响
已分析 5.是否涉及abi变化 master:否,openEuler-20.03-LTS-SP4:否,openEuler-22.03-LTS-SP4:否,openEuler-24.03-LTS:否,openEuler-24.03-LTS-Next:否,openEuler-24.03-LTS-SP1:否,openEuler-24.03-LTS-SP2:否,openEuler-24.03-LTS-SP3:否,openEuler-22.03-LTS-SP3:否,openEuler-24.03-LTS-SP4:否
已分析 6.原因说明 master:不受影响-漏洞代码不能被攻击者触发,openEuler-20.03-LTS-SP4:不修复-超出修复范围,openEuler-22.03-LTS-SP4:不修复-超出修复范围,openEuler-24.03-LTS:正常修复,openEuler-24.03-LTS-Next:不受影响-漏洞代码不能被攻击者触发,openEuler-24.03-LTS-SP1:正常修复,openEuler-24.03-LTS-SP2:不修复-超出修复范围,openEuler-24.03-LTS-SP3:正常修复,openEuler-22.03-LTS-SP3:不修复-超出修复范围,openEuler-24.03-LTS-SP4:不受影响-漏洞代码不能被攻击者触发

请确认分析内容的准确性, 确认无误后, 您可以进行后续步骤, 否则您可以继续分析.

likedislike
openeuler-ci-botopeneuler-ci-bot成员
6月1日 issue状态由 待办的 改变为 已完成
openeuler-ci-botopeneuler-ci-bot成员
6月1日 关闭了 issue
openeuler-ci-botopeneuler-ci-bot成员
6月1日 删除了label:CVE/UNFIXED
openeuler-ci-botopeneuler-ci-bot成员
6月1日 添加了label:CVE/FIXED