南大《软件分析》16.0 Soundiness
课程环境:https://tai-e.pascal-lab.net/lectures.html
课程视频:https://www.bilibili.com/video/BV1b7411K7P4
南大《软件分析》16.0 Soundiness
首先来看什么是 soundness,注意不是 soundiness。
soundness 是一种保守估计,这种分析会考虑到所有的程序行为或对程序中所有可能出现的行为进行建模。
但是!无论是在学术界还是在工业界实际上最后的结果都是 unsound,就是说 soundness 的条件过于苛刻,在真正应用的过程中很难去考虑到所有的程序行为。
这里给出了为什么难分析的原因,对于一些 hard language,很难对它们的一些特性进行分析,如 java 的反射,native code 等,包括还有 c/c++ 的函数指针,算术指针之类的。
上图对于这些语言的sound分析做了一个总结,对于这些语言的大多数特征静态分析的结果都是sound的,但是对于其中的一些比较难分析的特征以往都会选择忽略,这实际上对静态分析的结果不利的,因为不知道它分析的结果是不是能够保证没有漏洞存在的。
所以在15年的时候,学术界就给了一个建议对于这些 hard language features 尽量给出一个合理处理。
Java Reflection
这里就拎出来两个比较难分析的特征进行说明,如 java reflection。首先来看看 java reflection 是什么
从上图可以发现,在利用反射时,不管是 class,方法名,还是成员都是以字符串的形式进行索引,那在实际程序中,这些字符串可能来自配置文件,终端,外部输入,可能并不会显示的出现在代码中,这从而加大了静态分析的难度,可以这么想如果我们连具体调用的方法名都不知道,何谈指针分析呢。
对于这项工作,也就是这门课程的两位主讲人老师,在15年的时候提出了一个比较好的方法进行解决,在调用的50个反射方法中成功推断出了48个方法,大概得思想就是倒着推,从调用的地方反过去再去分析。具体方法可以参考论文
Self-Inferencing Reflection Resolution for Java (ECOOP 2014)
Yue Li, Tian Tan, Yulei Sui, Jingling Xue. UNSW Sydney
Native Code
这张图显示了在实际调用一个 java 常见输出命令 System.out.println
时所有的函数调用栈,它最后底层的 JNI 会调用对应的 C 代码来实现一部分逻辑。
这里对 JNI 做出了解释,简单来说其实际上是发挥了平台包括本地c代码本身的一些特性来方便实现自己的功能。
而这就会产生一个问题,在实际写java的代码过程中,可能会调用一些 C 库的函数,而由于我们是静态分析,对应的C代码是看不懂,也就导致无从下手,从而加大了对于 native code 的分析难度。
这里列举了一个当前对于 native code 的处理比较新的文章,有兴趣的可以看一看。
思考题
- Title: 南大《软件分析》16.0 Soundiness
- Author: henry
- Created at : 2024-09-14 16:23:22
- Updated at : 2024-09-14 16:25:03
- Link: https://henrymartin262.github.io/2024/09/14/16.0_Soundiness/
- License: This work is licensed under CC BY-NC-SA 4.0.