Soundness and Soundiness
-
到现在为止:学术界+工业界的静态分析都做不到完全的 sound
-
因为存在难以分析的特征:对这些特征的激进保守处理可能会使分析过于不精确而无法扩展,从而使分析无用
-
难以分析的特征:Java 反射机制,Java 本地代码,Java 动态类加载,C/C++的函数指针等
-
导致一个问题:
-
静态分析工具:作者声称是 sound,但是只是大部分语言特征是 sound,对于 hard feature 是不 sound
-
大部分论文对于 hard language feature 问题提都不提,或者随意的在小角落提一下
- 这些 hard language feature 如果没有正确处理,可能会对分析结果有巨大影响
- 对于非专家来说,他们可能会错误地认为分析是合理的,并自信地依赖分析结果
- 对于专家来说,如果没有一个关于他们如何处理这些 hard language feature 的清晰解释,他们仍然很难解释分析结果(分析有多健全、多快速、多精确)
-
-
所以提出了 soundiness 这个词,用以强调那些 hard language feature 是怎么处理的,不要误导别人
Hard Language Feature: Java Reflection
定义:
为什么需要分析反射:
- Bug detection Security Analysis
- Verification + Optimization
怎么分析 Java 反射:
第一种:String Constant analysis + Pointer Analysis
- 思路是:知道字符串的值,我们就能解析反射目标,从而进行静态分析
- 但是字符串值的来源在静态分析中难以获取
第二种:Type Inference + String analysis + Pointer Analysis
- 在使用字符串的时候推导出来字符串的值
- 在使用这个字符串时,根据 Java 强大的类型信息及其他线索
- 推断出这个字符串必须具有的特性,然后推断出这个字符串的值
第三种:Assisted by Dynamic Analysis
- 曲线救国:先用一些测试用例跑一下程序,得出一些 string 值,然后将这些 string 的值用于静态分析(很直接的,但是不 soundness,因为测试用例无法保证覆盖所有程序执行路径),但是很准
Hard Language Feature: Native Code
JNI
JNI 就是 JVM 提供的一个函数模块,允许 Java 和用 C++/C 写的本地代码交互
JNI 用于帮助使用内存管理,文件系统等和操作系统相关的机制,也可以使用 JNI 提供的一些功能,实现代码重用