漏洞信息
CVE-2019-10999 是一个典型的栈溢出漏洞。根据公开披露的基础信息,攻击者在已登录的情况下,可以通过向设备的 wireless.htm 页面发送一个超长的 WEPEncryption 参数,导致目标函数发生栈溢出,进而执行任意命令。
本次分析选取存在该漏洞的 D-Link DCS-932L v2.17.01 版本设备作为目标。我们将通过固件解包、静态代码分析和动态调试复现该漏洞,并深入探讨其成因与防御机制。
复现过程
1. 固件解包与环境准备
首先使用 Shambles Desktop 工具打开下载的固件包。利用其在线解包功能将固件解包并抽取文件系统。固件包的内容将以可视化的文件目录树形式展现,方便后续分析。同时,Shambles Cloud 会对解包信息进行初步分析,确定设备型号、厂商、芯片架构及设备类型等信息。
经分析,该设备为 D-Link 的 MIPS 芯片架构嵌入式摄像头设备。在文件管理器中搜索关键字 alphapd,这是 CVE 漏洞信息中提到的 Web 服务器可执行文件。
2. 静态分析
2.1 定位漏洞函数
在反编译窗口中搜索 WEPEncryption 关键字,结果返回多处匹配信息。结合右侧代码风险检测窗口的检测结果,发现两处信息多次提到 sub_43b7c0 附近的地址。代码风险检测直接指出了 strcpy 相关的栈溢出风险。
因此,sub_43b7c0+1b4 处存在问题的可能性较大。双击跳转至 strcpy(&var30, v2) 处查看汇编代码。
汇编代码显示该处确实是一个 strcpy 调用。按 F5 快捷键切换到伪代码视图(pseudo view)查看反编译代码。第 25 行将 v2 的内容拷贝到栈变量 &var30 的地址。第 11~19 行的逻辑表明:当 p0 内存地址中不存在 WEPEncryption 参数时,不进行有效操作并直接返回;而当存在该参数时,websGetVar 返回 WEPEncryption 的参数内容。
结合 CVE 信息及函数名含义,推测 sub_43b7c0 是处理网络请求参数 WEPEncryption 的函数。为了验证这一猜测,需要证明当针对 wireless.htm 发送带有 WEPEncryption 参数的网络请求时,sub_43b7c0 会被执行,这需要动态模拟运行固件。
2.2 strcpy 风险分析
strcpy 函数是 C 语言标准库中用于字符串复制的函数,但它不具备边界检查能力。如果源字符串长度超过目标缓冲区的大小,就会发生缓冲区溢出。在嵌入式系统中,由于资源受限,开发者常因疏忽或性能考虑使用此类函数,从而埋下安全隐患。
在本例中,用户输入的 WEPEncryption 参数被直接传递给 strcpy,且目标缓冲区位于栈上。攻击者通过构造超长参数,可以覆盖栈上的返回地址,从而劫持程序控制流。
3. 动态调试
3.1 固件仿真环境搭建
按照静态分析的结论,进入动态验证流程。利用 Shambles Desktop 的固件仿真模拟功能(Virtual Machine,简称 VM)对该固件进行动态调试。
进入仿真模拟功能后,需要将文件管理模块切换到云端模式下,在右侧工具栏 VM 管理工具中点击新建,选择 alphapd 所在的文件系统建立一个模拟器。在文件管理器中选中 alphapd 所在的文件系统,右键打开终端(文件系统终端),此时固件的文件系统已被挂载。
在新打开的文件系统终端输入 /bin/alphapd 启动服务,初始会报错 cannot open pid file。搜索该错误信息,定位到代码段中的引用,推断缺失的文件应为 /var/run/alphapd.pid。
手动创建该文件后再次运行,又出现等待 nvram_daemon 的错误。继续创建 /var/run/nvramd.pid 文件。此时仍报错 。


