路由器固件漏洞自动化挖掘:基于污点分析的规模化漏洞检测

本文详细介绍了如何利用改进的污点分析工具在PROLiNK、D-Link等路由器固件中发现数十个未授权命令注入漏洞,包括技术实现细节、架构分析和漏洞案例演示,检测效率较传统符号执行提升60倍。

基于污点分析的路由器固件漏洞规模化挖掘

在最近几个月的工作中,我们开发了一套基于污点分析的自动化工具,用于检测路由器中的安全漏洞。该工具针对D-Link DIR-878路由器1.12A1固件中的CVE-2019-8312至CVE-2019-8319等命令注入漏洞进行了优化设计,目标是实现比人工分析更快的漏洞发现速度。

技术方案

现有工具局限性

虽然Triton和bincat等成熟污点分析工具存在,但它们不支持目标设备使用的MIPS架构,因此我们选择基于angr框架开发定制方案。

angr符号执行的瓶颈

初始方案使用angr的符号执行功能进行动态污点跟踪,但面临状态爆炸问题:

  • 单个函数分析超时设置为2分钟
  • 实际分析耗时超过2小时
  • 存在内存泄漏导致内存耗尽

改进方案:到达定义分析

最终采用angr的Reaching Definitions静态分析技术:

  1. 构建函数内的use-def关系图
  2. 将原子操作(寄存器/栈变量/堆变量)建模为图节点
  3. 通过图遍历分析用户输入(source)是否影响危险函数(sink)

示例漏洞代码分析:

1
2
3
4
5
6
void vuln(char* querystring) {
   char* name = get_querystring_value(querystring, "name");
   char command[200];
   sprintf(command, "echo %s >> /tmp/log", name);
   system(command);
}

对应的use-def关系图清晰地展示了从get_querystring_valuesystem的污染传播路径。

漏洞发现成果

  • 发现20个命令注入漏洞(10个可通过WAN接口未授权访问)
  • 典型漏洞模式:
    1
    2
    3
    4
    5
    
    void qos_sta_settings() {
        cli_list = web_get("cli_list", body, 0);
        sprintf(command, "/sbin/sta_qos.sh setup %s", cli_list);
        system(command);
    }
    
  • 额外发现:
    • 硬编码后门密码user
    • 栈溢出漏洞(未检查边界的sprintf)
    • 拒绝服务漏洞(通过超大循环值导致无限循环)
  • DIR-1960:发现4个需认证的HNAP API命令注入
  • DIR-X1560(ARM架构):
    • 逆向分析复杂的分层架构(DAL/RCL/RUT)
    • 通过MDMOID映射表定位漏洞链
    • 最终发现4个深层命令注入漏洞

技术演示

工具将分析时间从2小时缩短至2分钟,效率提升60倍。目前主要支持命令注入检测,未来计划扩展缓冲区溢出、UAF等漏洞类型的检测能力。

完整漏洞细节和厂商修复时间线请参阅原文技术分析部分。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计