Group of Software Security In Progress

GoSSIP @ LoCCS.Shanghai Jiao Tong University

A Machine-learning Approach for Classifying and Categorizing Android Sources and Sinks

本文主要是通过机器学习的方法来找Android那么多API里,哪些API可以算是污点分析里的source和sink,并且还分了类。作者开源了个工具叫susi,可以用来做这个事情。

首先作者定义了一些名词,比如source就是指通过调用resource method返回非常量数据到程序代码里。sink是指resource method从程序代码里接受至少一个非常量数据作为参数,当且仅当一个新的值写了或者覆盖了资源。用机器学习的方法,SVM分类器,SMO在Weka线性内核的实现。

12个source类别:account,bluetooth,browser,calendar,contact,database,file,network,nfc,settings,sync,unique-identifier。15个sink类别:account,audio,browser,calendar,contact,contact,file,log,network,nfc,phone-connection,phone-state,sms/mms,sync,system,voip。使用了144个语义和语法特征,在区分source和sink的时候的特征是:

  1. 方法名。以特定字符串开头的API可能是source,如“get”。
  2. 参数。如果方法有至少一个参数,可能为sink,不太可能为source。
  3. 返回值类型。返回值如果为特定类型,比如返回指针,则可能为source,返回空,则不太可能为source。
  4. 参数类型。参数如果为特定的类型,例如java.io.* 则可能为source或者sink。
  5. 参数是接口。则表明是个回调,既非source,也非sink。
  6. 方法如果是static或者native的等等,则不太可能是source和sink。source和sink比较可能是public的。
  7. 如果方法在一个protected或者abstract等等类里的话,这个API不太可能是source和sink。
  8. 如果方法在一个类名里有特定字符串如Manager这种,则可能是。
  9. 如果方法调用了另一个以特定字符串如read开头的方法,并且这个控制流最终到了返回值,则可能是source。
  10. 如果方法的参数之一的数据流到调用一个以特定字符串开头的方法里如update,则可能是sink。
  11. 如果方法的参数之一的数据流到调用一个abstract方法,则可能是sink。
  12. 如果方法调用了需要权限的方法,则可以根据PScout的结果来定。

分各种categories的时候可以用以下特征:

  1. 类名里有特殊字符串的,比如contact,就能确定了。
  2. 方法直接调用了另一个以特殊字符串开头的方法。比如telephony之类。
  3. 方法中包含一个特殊类型的对象引用,比如SMS。
  4. 参数类型。
  5. 返回值类型。

实验选取了779个方法,从PScout的12600个API列表里,做了人工的标记。13% source,22% sink。然后用机器学习的多项式表达式计算,然后分类。使用机器学习评估准确性,用779个里的十分之九再做训练,评估剩余十分之一和手工的比较。

另外和其他工具相比,把人家的source和sink都分出来了,还多了一些忽略的,事实证明被现实中的malware使用到。