基于污点分析的路由器固件漏洞大规模检测技术

本文详细介绍利用angr框架的Reaching Definitions分析技术构建污点分析工具,成功在PROLiNK和D-Link路由器固件中发现多个未授权命令注入漏洞、缓冲区溢出及后门密码等安全问题的技术实现方案。

基于污点分析的路由器固件漏洞大规模检测技术

工具设计

现有工具局限性

现有污点分析工具如Triton和bincat虽成熟,但不支持目标路由器采用的MIPS架构。

基于angr符号执行的尝试

选择angr框架因其支持MIPS/ARM等多架构。初期使用符号执行生成VEX IR程序轨迹进行静态污点分析,成功发现测试固件中的命令注入漏洞。

但面临状态爆炸问题:当遇到基于用户输入的分支指令时,angr会复制状态,导致分析时间过长(单个函数分析超2分钟,整个二进制分析超2小时)且存在内存泄漏问题。

转向Reaching Definitions分析

采用angr的Reaching Definitions分析生成函数内的use-def关系图。该分析将程序中的原子(寄存器、栈变量、堆变量)构建为使用-定义关系图。

以漏洞代码为例:

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);
}

污点源为get_querystring_value(用户输入),污点汇聚点为system。通过分析use-def图,可确定数据是否从源传播到汇聚点。

工具总结

工具利用angr的Reaching Definitions分析生成路由器固件函数的use-def关系图,通过图分析检测用户输入是否到达危险函数(如system)。分析时间从2小时缩短到约2分钟。

漏洞发现成果

发现近20个命令注入漏洞,其中10个无需认证且可通过WAN接口访问。获得CVE-2021-35400至CVE-2021-35409。

漏洞代码模式:

1
2
3
4
5
void sys_login1(undefined4 request) {
    ipaddr = (char *)web_get("ipaddr",request,0);
    sprintf(command,"echo %s,%s, > /tmp/language &",ipaddr,lang);
    do_system(command);
}

污点源:web_get,污点汇聚点:system/do_system/popen

后门密码发现

发现硬编码后门密码"user",通过特殊验证逻辑可登录管理界面:

1
2
3
strcpy(salted_password, key);
strcat(salted_password, "user");
md5_sum(salted_password, salted_hash);

后续修复版本中发现备用密码字段Password_backup=nE7n$8q%5m

栈缓冲区溢出

由于缺乏边界检查,多处使用sprintf导致缓冲区溢出,可覆盖返回地址控制程序执行。

拒绝服务漏洞

通过注入超大数值参数使脚本陷入无限循环,导致路由器停止响应:

1
2
3
for i in `seq 1 $sta_num`  # sta_num为用户可控值
do
...

时间线

  • 6月9日:报告10个命令注入漏洞
  • 6月11日:厂商提供修复
  • 7月9日:报告后门、缓冲区溢出、DoS漏洞
  • 7月23日:厂商完成修复

D-Link路由器分析

DIR-1960

发现约200个结果,经排查确认4个需认证的HNAP API命令注入漏洞。

DIR-X1560(ARM架构)

工具成功适配ARM架构,但固件抽象层较多。发现基于CMS/TR-069框架的复杂架构:

1
HNAP API → DAL → MDM/ODL → RCL → RUT

关键漏洞示例:

1
2
3
4
5
6
7
8
9
void SetTimeSettings(void **request) {
    ntp_server = websGetVar(request, "/SetTimeSettings/NTPServer");
    cmsDal_setNtpCfgDLink_dev2(ntp, ntp_server, tzlocation);
}

int rut_TZ_Nvram_update(Dev2TimeDlinkObject time_object) {
    snprintf(command,0x80,"nvram set ntp_server=%s", time_object->ntp_server);
    system(command);
}

DAL与RCL/RUT连接分析

通过分析OID表建立MDMOID与RCL处理函数的映射关系:

1
0x416 → rcl_dev2TimeDlinkObject

使用工具辅助查找调用特定MDMOID的DAL函数,最终发现4个命令注入漏洞。

工具现状与展望

目前工具主要针对命令注入漏洞,对复杂固件(如DIR-X1560)仍需人工分析HNAP函数的调用关系。未来计划扩展支持缓冲区溢出、use-after-free等其他漏洞类型的检测。

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