这个工具专门用于寻找路由器中的安全漏洞


这个工具专门用于寻找路由器中的安全漏洞

文章插图
 
关于工具现有工具
现在 , 现成的污点分析工具已经有很多了 。其中 , 我最感兴趣的是Triton和bincat , 因为两者已经相当成熟 。然而 , 我们却无法使用这两种工具 , 因为它们不支持目标设备所使用的MIPS架构 。
使用angr进行符号执行测试
【这个工具专门用于寻找路由器中的安全漏洞】因此 , 我们把工作重点放在利用angr打造自己的工具上;angr是一个基于Python的二进制分析框架 。我们之所以选择angr , 是因为它支持大多数架构 , 包括我们所针对的MIPS和ARM架构 。早些时候 , @puzzor曾经对angr进行了一些自定义修改 , 用于静态污点分析:在angr的帮助下 , 通过符号执行模拟程序 , 然后根据生成的VEX IR程序跟踪信息进行静态分析 。通过这种方法 , 我们成功地在测试固件中发现了命令注入漏洞 。
然而 , 我们很快就遇到了一个问题:为了生成程序跟踪信息 , 我们需要angr通过模拟每条指令来模拟每个函数 , 并使用符号执行来决定是否跟随一条分支指令 。
具体来说 , angr会维护一个状态堆栈 。一个状态包含诸如寄存器值和内存内容方面的信息 。因此 , 当模拟一个函数时 , 它只会从一个状态开始 。当遇到一个分支指令时 , 如果angr不确定是否跟随该分支 , angr将重复该状态 , 其中一个将跟随该分支 , 而另一个则不跟随 。
大多时候 , 函数中都会存在循环 。如果循环条件是基于一些用户的输入 , 那么 , 状态的堆栈就会“爆炸” 。由于angr将始终不确定是继续还是从循环中跳出 , 所以 , 它会不断复制状态 。此外 , 还需要注意的一件事是 , 这些状态并不是同时模拟的 。相反 , 每次只有一个状态被模拟 。在这种情况下 , 需要很长的时间才会有一个状态达到易受攻击的代码;或者 , 如果该函数根本没有易受攻击的代码 , 那么 , 模拟过程可能永远不会终止 。
作为一个符号执行框架 , angr提供了多种可定制设置(称为模拟技术)来决定先模拟哪个状态 。并且 , 在尝试了许多不同的技术后 , 我们仍然无法改善执行时间 。
例如 , 在为待分析二进制代码中的每个函数设置了2分钟的超时的情况下 , 有时候即使经过了2小时 , 仍然无法完成对二进制文件的分析(因为如果一个函数没有漏洞 , 它将一直模拟执行下去 , 直到超时位置) 。更糟糕的是 , angr中存在一个未知的内存泄漏问题 , 所以 , 2小时后 , 电脑的内存早就耗尽了……
别忘了 , 我们之前的目标是希望这个工具比手工方式更快一些 。所以 , 通过这种方式是不可能的 , 所以 , 我们继续寻找改进方法或替代方案 。
这个工具专门用于寻找路由器中的安全漏洞

文章插图
 
应用angr的Reaching Definition分析技术
最终 , 我们偶然发现了这个漏洞后 , 燃起了我们对于angr的Reaching Definitions分析技术的热情 , 于是仔细阅读了下面的资料:
?A reaching definition engine for binary analysis built-in in angr
?Handle function calls during static analysis in angr
?CSE545 Guest Lecture: Binary Analysis
Use-def关系
总之 , 这种分析方法将生成函数中原子之间的use-def关系 。在这里 , 所谓原子类似于变量 , 并且 , 原子也具有各种类型 , 如寄存器、栈变量、堆变量 。实际上 , 只要把原子看作变量 , 事情就很简单了 , 下面 , 我们举例说明:
这个工具专门用于寻找路由器中的安全漏洞

文章插图
 
在上面的函数中 , 存在一个明显的命令注入漏洞:含有漏洞的代码为system(command) , 其中注入的命令来自querystring的参数name 。在这个函数中 , querystring和其他原子之间的use-def关系如下所示:
这个工具专门用于寻找路由器中的安全漏洞


推荐阅读