一、预备知识
1.1 污点分析
污点分析是一种跟踪并分析污点信息在程序中流动的技术。在漏洞分析中,使用污点分析技术将所感兴趣的数据(通常来自程序的外部输入)标记为污点数据,然后通过跟踪和污点数据相关的信息的流向,可以知道它们是否会影响某些关键的程序操作,进而挖掘程序漏洞。即将程序是否存在某种漏洞的问题转化为污点信息是否会被 Sink 点上的操作所使用的问题。 使用污点分析检测程序漏洞的工作原理如下图所示:
1.2 符号执行
符号执行起初应用于基于源代码的安全检测中,它通过符号表达式来模拟程序的执行,将程序的输出表示成包含这些符号的逻辑或数学表达式,从而进行语义分析。 程序中变量的取值可以被表示为符号值和常量组成的计算表达式,而一些程序漏洞可以表现为某些相关变量的取值不满足相应的约束,这时通过判断表示变量取值的表达式是否可以满足相应的约束,就可以判断程序是否存在相应的漏洞。 使用符号执行检测程序漏洞的原理如下图所示:
1.3 环境准备
本文选用某厂商路由器的upnpd二进制文作为实例,笔者在很久以前的一篇文章中对upnpd(CVE-2020-9373)挖掘利用作过分析,之后不同型号相继爆出类似问题。
-
固件结构
在上述文章中笔者对结构作过分析,这里不赘述,结构如下图: 解包之分接单,直接通过binwalk提取,CPU架构为ARMv5,文件系统是Squashfs。
DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 58 0x3A TRX firmware header, little endian, image size: 32653312 bytes, CRC32: 0x5CEAB739, flags: 0x0, version: 1, header size: 28 bytes, loader offset: 0x1C, linux kernel offset: 0x21AB50, rootfs offset: 0x0 86 0x56 LZMA compressed data, properties: 0x5D, dictionary size: 65536 bytes, uncompressed size: 5470272 bytes 2206602 0x21AB8A Squashfs filesystem, little endian, version 4.0, compression:xz, size: 30443160 bytes, 1650 inodes, blocksize: 131072 bytes, created: 2018-12-13 04:36:38
-
漏洞简介
漏洞成因是upnpd服务中解析 SSDP 协议数据包的代码存在缺陷,导致未经授权的远程攻击者可以发送特制的数据包使得栈溢出,进一步实现RCE。 漏洞原理很简单,strcpy()拷贝导致的缓冲区溢出,在sub_1D020()中使用recvfrom()从接受最大长度0x1fff的 UDP 报文数据。 在sub_25E04()中调用strcpy()将以上数据拷贝到大小为0x634 – 0x58 = 0x5dc的 buffer。 下文工具测试结果中就要重点关注sub_25E04调用strcpy()是否出现。
1.4 工具简介
BinAbsInspector BinAbsInspector是Keenlab开发的用于自动化逆向工程和扫描二进制文件漏洞的静态分析器,其基于 Ghidra 的 Pcode 而不是汇编,目前支持 x86、x64、armv7 和 aarch64 上的二进制文件。 到目前为止 BinAbsInspector 支持以下漏洞检测:
-
CWE78(OS Command Injection)
CWE119(Buffer Overflow (generic case))
CWE125(Buffer Overflow (Out-of-bounds Read))
CWE134(Use of Externally-Controlled Format string)
CWE190(Integer overflow or wraparound)
CWE367(Time-of-check Time-of-use (TOCTOU))
CWE415(Double free)
CWE416(Use After Free)
CWE426(Untrusted Search Path)
CWE467(Use of sizeof() on a pointer type)
CWE476(NULL Pointer Dereference)
CWE676(Use of Potentially Dangerous Function)
CWE787(Buffer Overflow (Out-of-bounds Write))
SaTC SaTC是上海交大研究人员提出的IoT漏洞自动化挖掘方法,相应的学术论文已在 USENIX Security 2021【2】发表。 与BinAbsInspector通用性不同,SaTC则是专注IOT漏洞挖掘。现有嵌入式系统中的许多漏洞都位于web服务中,寻找这些漏洞的关键是如何定位后端程序中用于处理与用户输入数据相关的代码,而Web前端文件(html、js、xml等)中存在的一些关键字符串通常与后端二进制文件之间共享,也就是说承载用户输入数据的某个参数名称在前端文件与后端文件中都会存在。基于此,SaTC将解压后的固件目录作为输入,然后全程自动完成提取关键字符串、定位后端程序中关键字符串的引用位置、以引用点为起始位置进行污点分析,最终输出了所有可能存在漏洞的指令位置,同时还给出了从输入点到漏洞指令位置的函数调用链条。 Rhabdomancer Rhabdomancer是一个简单的Ghidra脚本,它将对可能不安全的API函数的所有调用定位在二进制文件中。研究人员可以从这些候选点回溯,以找到二进制文件脆弱性。
-
Haruspex + semgrep
Haruspex是另一个 Ghidra 脚本,它能够以适合导入到 IDE(如VS Code)或静态分析工具(如Semgrep)解析的格式提取 Ghidra 反编译器生成的所有伪代码。
Semgrep是经过专门设计的,可帮助审计员识别潜在的错误,并在 C/C++ 代码中找到热点,以便将注意力集中在这些代码上。
Haruspex + semgrep给了二进制漏洞分析另一种“旁门左道”的分析思路,即先利用Haruspex反编译成伪代码,再通过semgrep对伪代码作审计,即转黑为白的测试方法。
二、静态分析
不需要氪金买设备,不需要解决各种头疼的模拟错误,下面开始愉快地静态分析。
2.1 BinAbsInspector
安装 将[ghidra_10.1.2_PUBLIC_20220420_BinAbsInspector.zip](<https://github.com/KeenSecurityLab/BinAbsInspector/releases/download/v0.1/ghidra_10.1.2_PUBLIC_20220420_BinAbsInspector.zip>)拷贝至ghidra_10.1.2_PUBLIC_20220125\\ghidra_10.1.2_PUBLIC\\Extensions\\Ghidra目录下, 点击file->install extension,选择执行插件安装,这里注意版本要对应上: 此外还需安装[z3 lib](<https://github.com/Z3Prover/z3/releases>),如果z3 lib没有装成功,可以先不勾选z3。
-
测试
用Ghidra打开upnpd二进制文件,选择windows→Script Manager→BinAbsInspector,等待分析结束即可: 当然CWE规则可以自行选择,这里默认全选,所以检测出的结果比较多……
-
分析
可以看到把所有认为的危险函数列出并下了断点,在已知upnpd的漏洞处当然也有标识: 但其缺点在于没有作过滤(应该可以通过二次开发解决),所以需要手动回溯的信息过多,实际使用中必然要结合其他方式分析。再比如对strcpy(local_2c[0],s_HTTP/1.1_200_OK_CONTENT-LENGTH:_00081c70)此类固定值也未作判断,也标识为潜在漏洞点:
2.2 SaTC
-
安装
SaTC安装参见Github,当然也可直接下载使用Docker:
# 从docker hun拉去image docker pull smile0304/satc:V1.0 # 进入Dokcer环境, 自行添加目录映射 docker run -it smile0304/satc:V1.0
值得注意的是在使用中可能报错,下述解决方案可供
转载请注明:IT运维空间 » 安全防护 » 浅析IOT二进制静态辅助方法
发表评论