二进制代码安全分析综述
二进制代码安全分析综述
周忠君, 董荣朝, 蒋金虎, & 张为华. (2022). 二进制代码安全分析综述. 计算机系统应用, 32(1), 1-11.
论文单位:复旦大学软件学院
1. 二进制分析的挑战
- 可读性低:二进制代码相较于高级语言编写的程序,可读性较低
- 信息丢失:经过了编译和优化,丢失了上层数据结构和类型
- 架构差异:不同架构的调用约定不尽相同,导致控制流分析更加复杂
- 保护加密:一些商家基于自身软件安全等考虑,采用了例如内存低级随机化或者加密混淆等手段,导致对程序分析更加困难
2. 主要分析方法
2.1 静态分析
将二进制程序反汇编成中间语言(IR或P-Code),然后对其进行控制流、数据流分析。
主要用于安全漏洞检测。
已知漏洞检测
对于已知漏洞检测,主要采用代码相似性、语义相似性技术进行分析。
由于打过补丁的代码与存在漏洞的代码存在很大的相似性,因此增加了假阳性。应对方法时,对是佛存在补丁程序进行识别。 (生成程序签名)
基于深度学习的方法关键还是相似性检查。VESTIGE通过构建带标签的函数调用图,利用图神经网络进行训练,形成embeddings。将具有漏洞的embedding与目标程序进行相似性比较,从而判断是否含有该漏洞。其他人还使用NLP的深度神经网络、LSTM等方法进行训练。
未知漏洞检测
对于未知漏洞分析则采用控制流、数据流分析、符号验证及深度学习等方法进行。
当使用控制流图(CFG)进行分析的方式时:首先控制CFG,标记代码中的敏感数据以及可能泄露数据的代码段,例如输出函数等,然后检查CFG中用户敏感信息可能出现的关键数据流,找出其中直行道泄露区域的数据流,从而查找到新的漏洞。
Firmalice使用符号验证的方法,对固件中可能申请权限的敏感控制流进行分析,得到获得最高权限或者熬过权限的控制流路径,并使用输入决策树分析这些路径是否被实际执行,从而判断该控制路路径是否是一个漏洞。
DRCHECKER, digtool, iDEA使用和多种静态检测方法,对操作系统(Linux、Windows、Apple Kernal)的权限漏洞、信息泄露漏洞进行检查。
评价
优点
- 方便快速
缺点
- 可能分析到死代码
2.2 动态分析
通过插桩实现指令级分析,利用获取运行时信息(例如Call/Return指令、系统调用、库函数等)进行分析。
动态分析的核心是通过构造输入触发执行流。
应用级动态二进制插桩工具:PIN、DynamoRIO、Valgrind、DynInst、Libdetox等。
系统级动态二进制插桩一般是在仿真模拟系统如QEMU上实现,工具有QTrace、Panda、PEMU、QVMII、Qelt等。
动态污点分析(dynamic taint analysis
在程序运行时标记感兴趣的的数据源并记录器传播路径。
流程如下:

一些典型的污点分析工具:
- Dytan
- Minemu
- TaintDroid
污点分析的挑战:
- 大量的寄存器分配操作导致(内存?)开销大
注意:污点分析同样可以用于静态分析,例如Pysa、FlowDriod、Soot;动态污点分析工具还包括:Libdft
机器学习
Bernardi等人将程序中的系统调用执行序列作为动态行为特征指纹,通过训练分类器对恶意软件进行识别
Arora提取手机软件中恶意活动的网络流量特征,通过并训练基于规则额分类器对程序网络流浪特征进行分类,从而识别恶意软件。
不透明谓词
在计算机科学中,一个谓词被称为不透明谓词(opaque predicate),如果在静态分析中很难确定它的行为或者影响。不透明谓词通常用于防止程序被逆向工程或者破解。
在软件安全领域,程序的控制流图(Control Flow Graph,CFG)是静态分析的一个重要工具。通过分析CFG,可以了解程序的结构、函数调用关系和执行路径。然而,如果程序中存在不透明谓词,这些分析可能会受到阻碍。不透明谓词可以通过各种方式实现,例如使用加密、混淆、动态代码生成等技术,使得程序的行为在静态分析时难以预测。
在软件安全领域,开发者常常使用不透明谓词来增加程序的安全性,使得逆向工程者难以理解程序的逻辑,从而防止非法访问或者修改。然而,这也增加了程序的复杂性,因为不透明谓词的存在使得程序的行为更难以理解和维护。
LOOP是一种不透明谓词技术。首先获取程序运行时的指令流信息,分析其中的贡献谓词的指令信息,并使用符号执行来构造一般的逻辑公式,它表示不透明为此的内在特征,最后使用约束求解器来求解这些公式,一次来识别不透明谓词。
K-Hunt使用动态分析来势必二进制可执行文件中的不安全密钥。首先使用加密秘钥操作的属性识别出加密秘钥操作代码块,然后根据加密操作代码块中会访问的数据集加密秘钥特征识别出加密秘钥在内存中存储的位置,最后通过跟踪该部分数来的来源和传播过程来评估秘钥的安全性。
评价
缺点
- 需要大量输入
- 开销大,效率低
- 需要对抗反插桩机制
2.3 混合分析
利用静态分析获取二进制程序关键结构信息,再结合动态分析技术对敏感路径进行分析。可减少单纯动态分析带来的性能开销。
通过静态分析技术的预处理过程,来缩小动态分析时所需要的关键路径(减少开销);或者反之通过动态分析来获得基本块、控制流等信息(提高准确性)。
利用静态分析优化插桩代码
利用静态分析对插桩代码进行优化,并去除不必要的插桩(例如死代码),并在动态执行中进行实时反馈,进一步优化或添加插桩代码,从而获得更好的动态分析数据。
如下图所示:

对动态分析结构进行代码重构,并使用静态分析方法对其进行分析
收集动态执行中的指令信息,将其转换为中间表示(IR),然后利用符号执行或污点分析等静态技术对IR进行分析,从而发现问题。
例如ShadowReplica、BitLaze。
2.4 对比
- 性能:静态分析 > 混合分析 > 动态分析
- 准确性:混合分析 > 动态分析 > 静态分析
- 自动化:静态分析 > 混合分析 动态分析
一些论文方法比较如下:

3. 研究方向及其挑战
高效性
- 利用二进制代码底层抽象信息或其他先验知识,以及启发式空间搜索算法提高分析速度。
- 利用代码去膨胀技术减少无效分析
- 利用并行编程或硬件加速实现高规模、高并发算法
智能化
- 利用深度学习算法进行高结构化输入生成、代码相似检测、恶意软件分类、脆弱路径筛选等。
- 考虑训练数据获得的代价较高,建议采用半监督或无监督方法
类型恢复
- 对于漏洞检测、二进制重写、逆向工程意义重大
- 提高类型恢复的准确度,并兼顾性能
内核代码安全分析
- 内核代码(包括虚拟机、容器、驱动等)数量庞大,分析困难
- 利用动态二进制翻译技术来仿真相同指令架构或跨指令集框架的整个虚拟机ing监控包含用户态和系统态的所有指令和数据。如何提供这种方法的性能和路径覆盖度。
其他
- 漏洞自动补丁
- 二进制重写
