EngineConfig.json5 是对引擎更深入的配置,如果不理解其准确含义,建议不要修改这个文件.
被这里命中的函数在分析时,将会被忽略. 指定函数的规则有三种形式:
- PackageName 整个包下面的函数都会被忽略
- MethodName 以函数名字进行匹配
- MethodSignature 以函数签名进行匹配.
当创建碰到指定的类被创建时,自动调用相关函数. 比如
"java.lang.Runnable": [
"void run()"
]
Runnable r=new Runnable(){
@Override
public void run() {
//do something
}
};
//相当于自动在这条语句下面添加了一条
//r.run();
指定的package,将会被认为是library,主要用于降低Appshark分析的工作量,因为通常认为framework,jdk等代码中不会存在漏洞. 如果一个package被标记为Library,主要有一下几点需要注意:
- 构建call graph的时候会自动忽略library的代码
- source,sink中会有对library的限制
- library的代码在分析的时候,会通过PointerFlowRule和VariableFlowRule计算指针以及数据流传播规则,而不是根据其具体实现代码.
如果不确定要不要修改该配置,那么就不要修改,除非有明确的证据
该配置主要是解决library代码以及超出规则中指定的traceDepth
时,如何处理相关的函数调用的指针指向关系.
PointerFlowRule 一个基本原则是: 如果没有匹配的规则,那么就不处理相关的指向关系.
该规则中的关键字:
- p* 所有参数
- @this 函数调用时的this指针
- ret 函数的返回值
- p0,p1,p2 函数的参数0,1,2,...
- @this.data 一个虚拟字段,代表this对象的所有字段.
- I 表示输入
- O 表示输出
MethodName 是按照函数名来匹配函数,MethodSig是按照函数签名来匹配函数.
以keySet规则为例来说明:
"<java.util.Map: java.lang.Object keySet()>": {
"@this.data->ret": {
"I": [
"@this.data"
],
"O": [
"ret"
]
}
}
碰到如下代码:
HashMap m=new HashMap();
m.put("s1","s2");
m.put("i",new Intent());
Set s= m.keySet();
变量s(也就是keySet的返回值)将指向m中的所有字段. 如果此时@this.data
指向了["s1","s2","i",new Intent()]
这些object,那么s也会指向这些object.
但是s并不会指向new HashMap()
这个对象,因为没有从this到ret的关系.
该配置主要是解决library代码以及超出规则中指定的traceDepth
时,如何处理相关的函数调用的数据流向关系.
它与PointerFlowRule在处理时的一个重要区别是,它有缺省的数据流向关系,也就是:
- InstantDefault
- InstantSelfDefault
InstantSelfDefault和InstantDefault的区别是,前者明确要求caller和callee的this指针是相同的. 比如:
class C{
void f(){
g();
}
void g(){
}
}
那么在分析f中对g的调用时,数据流向关系按照InstantSelfDefault而不是InstantDefault.
VariableFlowRule的关键字和PointerFlowRule是一样的
- p* 所有参数
- @this 函数调用时的this指针
- ret 函数的返回值
- p0,p1,p2 函数的参数0,1,2,...
- @this.data 一个虚拟字段,代表this对象的所有字段.
- I 表示输入
- O 表示输出
以下面规则为例来解释:
"<java.util.Map: java.lang.Object remove(java.lang.Object)>": {
"@this.data->ret": {
"I": [
"@this.data"
],
"O": [
"ret"
]
},
"@this->ret": {
"I": [
"@this"
],
"O": [
"ret"
]
}
}
HashMap m=new HashMap();
m.put("s1","s2");
m.put("i",new Intent());
Object obj= m.remove("i3");
如果此时@this.data
指向了["s1","s2","i",new Intent()]
这些object,那么HashMap数据将会从["s1","s2","i",new Intent()]
流向m,进而会从m流向obj.
也就是,如果new HashMap()
是污点,那么obj将会被污染. 如果"s1"是污点,那么obj也会被污染.