文章总结: 本文分析D-LinkDIR-895L路由器CVE-2026-100740漏洞,该漏洞为L2TP协议处理中的越界写入问题,CVSS评分9.9,远程无认证可触发,PoC已公开且无官方补丁。文章详述漏洞成因、攻击路径、检测方法及修复建议,并给出红队利用视角,强调前置条件较苛刻但破坏力强,建议关闭L2TP功能或限制UDP1701端口访问。 综合评分: 90 文章分类: 漏洞分析,应急响应,红队,安全工具
(9.9分) CVE-2026-100740:D-Link路由器越界写入可远程打崩
红队安全圈 红队安全圈
红队安全圈
2026年9月27日 20:00 重庆
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
一行 peer_hostname[len+1]=0,让 CVSS 9.9 的越界写落在 128 字节缓冲区外——远程、无认证,PoC 已公开,补丁未出。
01 漏洞速览
漏洞编号CVE-2026-100740
影响产品D-Link DIR-895L A1_102b07
漏洞类型越界写入 (CWE-787)
危害等级CVSS 9.9 Critical
攻击向量远程 / UDP 1701 / 无需认证
公开 PoC已公开 (GitHub)
官方修复暂无补丁
攻击前提是设备 WAN 配置为 L2TP/L2TPv6,且攻击者能控制或伪造上游 L2TP 对端。条件成立时,一个精心构造的 Host Name AVP 就能在隧道建立阶段触发内存破坏,轻则打崩设备,重则为进一步利用铺路。
02 漏洞成因
问题出在 L2TP 控制信道解析器的 tunnel_set_params() 函数 (tunnel.c),处理 Host Name AVP 的逻辑如下:
case AVP_HOST_NAME:
if (len >= MAX_HOSTNAME)
len = MAX_HOSTNAME-1;
memcpy(tunnel->peer_hostname,
val, len);
// 写错了位置: 应为 [len]
tunnel->peer_hostname[len+1]=0;
break;
目标缓冲区是 128 字节的固定数组:
define MAX_HOSTNAME 128
char peer_hostname[MAX_HOSTNAME];
意图很清楚:Host Name AVP 从 L2TP 控制数据报里解析出来,长度先截断到 127,再拷贝进缓冲区。但写终止符那行落笔 [len+1]——当有效长度恰好为 127,memcpy 填满 0 到 126,终止符正好落在下标 128,越过缓冲区最后一个合法字节。
这就是最经典的一字节越界写:单看只破坏相邻一个字节,但隧道对象里这个 NUL 后面挨着什么,决定了能砸出多大坑——轻则进程崩溃、隧道断连,重则覆盖相邻结构体字段做进一步利用。同一份 GPL 包里,IPv4 和 IPv6 两套 L2TP 解析器都有完全相同的逻辑,等于一份代码两份坑。
// GPL 包关键位置
pppd.alpha/l2tp/l2tp.h:21
// 缓冲区大小定义
pppd.alpha/l2tp/tunnel.c:595
// IPv4 解析入口
pppd.alpha/l2tp/tunnel.c:682-685
// IPv4 溢出点
pppd.alpha/l2tp_ipv6/
tunnel.c:688-691
// IPv6 溢出点
03 攻击路径与前提
第一步,目标 DIR-895L 的 WAN 连接方式配成 L2TP 或 L2TPv6。国内少见,但欧美不少 ISP 用 L2TP 拨号,这类设备正是这个场景。
第二步,攻击者控制上游 L2TP 服务器,或在链路上伪造、中间人合法对端——被攻陷的 ISP 上游、恶意热点、路由劫持都算。
第三步,隧道建立阶段,一个结构合法的控制数据报送达 tunnel_set_params(),报文里带一个有效长度恰为 127 字节的 Host Name AVP。
恶意对端的控制包只需要三个要素:合法的 Assigned Tunnel ID AVP、合法的 Protocol Version AVP、有效长度变为 127 的 Host Name AVP。溢出就发生在 [len+1]=0 这一行。
04 公开 PoC
GitHub 已有现成 PoC (murrez/CVE-2026-100740,源自 PoCbit 目录),Python 3 实现,能力分三档:HTTP 指纹识别设备型号和固件、探测 UDP 1701 可达性、可选发送触发包 (–oob-send,仅限授权实验室,可能直接打崩路由器)。它不带完整 RCE 链,定位是检测加验证。
pip install -r requirements.txt
python poc.py -u 192.168.0.1 \
–mode check
python poc.py -u 192.168.0.1 \
–mode check –l2tp-probe
python poc.py -u 192.168.0.1 \
–mode exploit –oob-send
python poc.py –list t.txt \
–mode check -j 20
05 检测与排查
固件指纹:管理页或 GPL 标识中出现 A1_102b07 字样即命中受影响固件。
端口暴露:对外开放 UDP 1701 且 WAN 走 L2TP 拨号的 DIR-895L 是高危组合,优先处置。
网络侧:监控发往 UDP 1701 的异常 L2TP 控制报文——超长 Host Name AVP、畸形报文、异常会话模式。
主机侧:L2TP 服务崩溃、设备意外重启、隧道反复建立失败,都要当内存破坏迹象排查。
测绘侧:Shodan 可用 “D-Link DIR-895L” 配合 port:1701 快速摸清暴露面。
06 修复与缓解
官方补丁发布前,围绕关闭攻击面做文章:不需要 L2TP 的直接关掉 L2TP/L2TPv6 WAN 功能,风险归零;必须用的,防火墙把 UDP 1701 严格限制到可信对端 IP,杜绝 WAN 侧裸奔。
上联 IPS/IDS 开 L2TP 深度检测拦截畸形控制报文;把易感设备隔离进独立 VLAN,压缩被打后横向移动的空间;盯紧 D-Link 官方通告,补丁放出后尽快升级。
修复本身一行就能改对:把 [len+1]=0 改成 [len]=0,拷贝前初始化缓冲区,IPv4 和 IPv6 两套解析器同步修。
07 红队视角
先泼冷水:这个洞的利用前置条件比 CVSS 9.9 看起来苛刻得多。它不是暴露一个 HTTP 接口就能打的服务,而是要求目标 WAN 走 L2TP 且你能站在它的上游路径上——内网渗透里基本碰不到,价值在中间人位置和供应链、上游场景。
但反过来,在红队评估里它是极佳的路径劫持素材:拿下 ISP 侧设备、架设恶意 L2TP 服务器配合 DHCP 或路由欺骗,下游所有 L2TP 拨号路由器就会主动把控制报文送上门。9.9 分反映的是条件成立后的破坏上限——无认证、远程、内存破坏,这种组合在嵌入式设备上往往离稳定 RCE 只差一步堆布局调试。
打点前先指纹:借鉴 PoC 的 HTTP 指纹模式,几行正则扒 A1_102b07 字样就能批量筛目标,不要盲目发 UDP 包惊动防守方。
探测先于触发:先用 l2tp-probe 确认 1701 可达、隧道角色成立,再决定是否上 –oob-send——一击必崩的包只有一次机会。
横向关联:DIR 系列的 L2TP/udhcpcd 栈今年已连续出多个内存破坏洞——DIR-822A 的 L2TP 越界写、DIR-895L 的 udhcpcd 栈溢出,同一套老旧 pppd.alpha 代码反复出事。遇到 D-Link 设备优先怀疑这套 GPL 代码的质量,顺手审一遍同类解析函数经常有意外收获。
防守方重点不是等补丁,而是排查全网还有多少设备 WAN 走 L2TP——这个数往往比想象的多。同源研究确认凡构建自同款 GPL 代码的固件大概率一并中招,不止 102b07 一个版本号,排查时别只盯着这个串。
08 POC 链接
https://github.com/murrez/CVE-2026-100740
https://pocbit.org/pocs/cve-2026-100740
https://nvd.nist.gov/vuln/detail/CVE-2026-100740
说明:GitHub PoC 含设备指纹/端口探测/触发包三档能力,仅限授权环境使用;–oob-send 可能直接打崩设备。
如果文章对您有收获,欢迎关注、点赞、推荐、转发。
— END —
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:红队安全圈 红队安全圈 红队安全圈《(9.9分) CVE-2026-100740:D-Link路由器越界写入可远程打崩》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论