本内容是对SecureNexusLab 静态程序分析入门 视频的整理与记录. 视频分享人为 monster
monster代表我们二进制小组,来分享目前在静态程序分析(Static Program Analysis, SPA)领域所做的一系列工作。
在正式介绍静态程序分析之前,需要先了解一个基础领域——程序语言。事实上,程序语言可以说是计算机科学最早的研究领域之一。许多计算机科学领域的重要奖项,例如图灵奖,都是颁发给那些在程序语言方面做出重大贡献的研究人员。
程序语言的三大部分
程序语言的研究主要包括以下三个部分:
- 理论部分
- 环境部分
- 应用部分(静态程序分析属于这一部分)
静态程序分析的主要工作包括:
- 程序分析
- 程序验证
- 程序合成
当我们谈到静态分析时,指的是在不执行程序的情况下,通过分析代码来检测潜在问题,而不是通过动态调试程序。
静态程序分析的必要性
随着软件规模的日益庞大,系统的复杂性不断增加,如何保证程序的可靠性和安全性成为亟待解决的问题。静态分析的主要优势在于,它能够在程序运行之前(即编译阶段)完成所有的分析过程,而无需实际执行程序或输入测试用例。
静态程序分析的四大应用方向
1. 可靠性检测
静态分析可以帮助检测和避免空指针引用等问题。例如:
- Java 运行时的
NullPointerException
C 语言 中的 内存泄漏 和 双重释放 问题:
- 申请了一块内存(
malloc
),但未free
- 释放了一块内存后(
free
),再次free
(双重释放) - 释放内存后仍继续使用(悬垂指针)
- 申请了一块内存(
2. 安全性检测
静态分析可以用来检测安全漏洞,例如:
- 私有信息泄露(例如 Android 账号密码泄露)
- 注入攻击(如 SQL 注入)
3. 编译优化
静态分析广泛应用于编译器优化,例如:
- 死亡代码消除(删除永远不会执行的代码)
- 循环优化(将循环内的无关计算移到循环外)
4. 程序理解
现代开发工具(IDE)提供的函数调用追踪、类型提示等功能,都依赖于静态分析技术。
静态程序分析的市场现状
工业界
许多科技公司都在研究静态程序分析技术,例如:
- 国外大厂: 微软、甲骨文、Facebook、Google
- 国内企业: 华为、阿里巴巴、龙志科技、循证科技、比林科技等
学术界
国内外许多高校和研究机构也在研究静态程序分析。例如:
- 国内: 南京大学、北京大学熊文飞团队
- 国外: 美国、澳大利亚的研究机构,悉尼科技大学等
静态程序分析的执行过程
在介绍具体流程之前,我们需要先了解 中间表示(Intermediate Representation, IR)。
IR 是编译器中的关键数据结构,它用于在代码优化阶段表示程序逻辑。例如:
- 抽象语法树(AST): 更贴近高级编程语言
- 控制流图(CFG): 表示程序执行流程
- 数据流图(DFG): 主要用于数据依赖分析
此外,还有 三地址码(3AC),它是 IR 的一种形式,要求每条指令最多包含 3 个操作数。例如:
A = B + C; // 符合 3AC 规范
A = B + C + D; // 违反 3AC 规范(超过 3 个操作数)
为了符合 3AC 规范,我们可以使用中间变量:
T1 = B + C;
A = T1 + D;
这种 IR 形式更接近目标机器代码,使后续的优化和分析更加高效。
静态程序分析的核心技术
1. 指针分析
指针分析的主要目的是计算运行时指针可能指向的内存区域,例如:
int *A;
int *B = A; // B 指向 A
int *C = B; // C 也指向 A
在上述代码中,A、B、C 共享同一块内存,指针分析可以帮助追踪这些关系。
应用场景:
- 变量数据依赖分析
- 变量别名分析
- Bug 检测(如野指针、双重释放)
- 编译优化
2. 污点分析
污点分析用于检测不受信任数据的传播路径,例如:
char *user_input = get_input(); // 用户输入(污点源)
execute_query(user_input); // 使用不受信任数据执行 SQL 查询
如果 user_input
直接用于数据库查询,可能导致 SQL 注入漏洞。静态分析可以检测并警告潜在的漏洞。
3. 特定漏洞分析
静态分析可以转换复杂的漏洞检测问题为路径可达性问题。
例如,检测 内存泄漏(Memory Leak):
- 如果
malloc
分配的内存没有free
,则存在内存泄漏 - 如果
free
被调用了两次,则存在 双重释放(Double Free)
通过构建 稀疏数据流图(SVFG),可以检测这些问题:
- 如果
malloc
到free
之间的路径不可达 → 内存泄漏 - 如果
free
被多次调用 → 双重释放 - 如果
free
之后仍然访问该内存 → 悬垂指针
静态程序分析的开源工具
目前,学术界和工业界有许多静态分析工具:
Java 相关:
- Soot: 用于 Java 代码分析
- Checker Framework: 主要用于数据流分析
C/C++ 相关:
- SVF: 主要用于指针分析
- Infer(Facebook 开发)
国内研究团队:
- 南京大学 Pascal 课题组(开发了 泰阿 分析工具)
- 北京大学熊文飞团队
- 悉尼科技大学
静态程序分析的未来趋势
目前,静态程序分析在工业界的应用仍面临挑战,例如:
- 大规模代码库的分析
- 支持多种编程语言
集成到 CI/CD 流水线
- 例如 GitHub / GitLab 提供的 SAST(静态应用安全测试) 插件
此外,静态分析还可以帮助企业在开发早期发现漏洞,减少后期的调试成本,提高软件质量。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。