为什么要学习软件分析?
软件分析或者具体地说,静态分析在当今计算机领域有很基础也很重要的应用,比如ide在运行程序前对一些基础的错误提前检测出来,也就是我们写程序时有时会看到的标黄,标红的片段
而在安全领域,则是SAST(Static Application Security Test)的核心原理,这也是我学习这门课的主要目标,我希望我可以理解现今SAST的实现,它们是怎么构建source点到sink点之间的污点分析流的?
进而我也想自己搓一个丐版的分析器
课程表如下
Lectures
| Lecture | Instructor | Slides (PDF) | Videos (Chinese) |
Assignments |
|---|---|---|---|---|
| 1. Course Introduction | Yue Li | Intro.pdf | ||
| 2. Intermediate Representation | Yue Li | IR.pdf | ||
| 3. Data Flow Analysis - Applications I | Yue Li | DFA-AP (I, II).pdf | ||
| 4. Data Flow Analysis - Applications II | Yue Li | A1 | ||
| 5. Data Flow Analysis - Foundations I | Yue Li | DFA-FD (I, II).pdf | ||
| 6. Data Flow Analysis - Foundations II | Yue Li | A2 A3 | ||
| 7. Interprocedural Analysis | Tian Tan | Inter.pdf | A4 | |
| 8. Pointer Analysis | Tian Tan | PTA.pdf | ||
| 9. Pointer Analysis - Foundations I | Tian Tan | PTA-FD (I, II).pdf | ||
| 10. Pointer Analysis - Foundations II | Tian Tan | A5 | ||
| 11. Pointer Analysis - Context Sensitivity I | Tian Tan | PTA-CS (I, II).pdf | ||
| 12. Pointer Analysis - Context Sensitivity II | Tian Tan | A6 A7 | ||
| 13. Static Analysis for Security | Tian Tan | Security.pdf | A8 | |
| 14. Datalog-Based Program Analysis | Tian Tan | Datalog.pdf | ||
| 15. CFL-Reachability and IFDS | Yue Li | IFDS.pdf | ||
| 16. Soundness and Soundiness | Yue Li | Soundiness.pdf |
这门课程有8个循序渐进的实验A1至A8,推荐在学习完对应的章节后就完成实验,完成实验时会不断回顾自己的笔记或者课程视频,这也是很好的强化记忆的过程
Start

开篇就引出了一切静态分析方法最核心的两个指标,Sound和Complete,当然实践中我们其实说的更多的是 漏报率 和 误报率,其实是一样的,而达到完美的Truth的分析是不可能的,能做的只有减少误报和漏报来逼近Truth
绝大部分在用的静态分析程序都是接受误报放弃绝对准确性,误报好于漏报
其实这在我之前在得物实习的时候运营SAST的时候的心得一致,其实非常好理解,如果我在审核告警的时候发现这是一个误报,那么我记录下来有空的时候加进规则库里即可;可如果要减少漏报,首先你得人工/用其他分析软件先找到一个漏洞代码的传播链条,然后排查是什么原因没检测出来,再去优化规则库,这里第一步的工作量就是非常之大的,与减少误报相比所耗的时间精力也不是一个数量级的
其次,对于后果而言,误报也是好过漏报很多的,误报最多浪费一些安全或开发人员排查确认的时间,但是如果漏报了,那漏洞就存在于上线的应用当中了

这里举了两个例子都是sound的,但是第一个例子更昂贵,需要额外内存存储上下文信息
静态分析需要在sound(或接近)的情况下,在准确度和速度上获得好的取舍
两个词概括静态分析,抽象和过近似
抽象:将具体的值抽象为分析所关注的值
- ‘T’是unknown,倒’T’是undefined

控制流,contrl flow(一种merge动作) 由于无法枚举每个路径,所以需要合并分析每一条路径的结果
这个也是静态分析中很重要的一步,由于静态分析是在程序运行前的分析,所以一些只有运行时才能确定的值和分支路径,在运行前,需要进行一个may analysis,就是尽可能全面的分析