揭秘 Android 非 SDK API:测量和理解
- 介绍
- 前置知识
- 数据集来源
- 测量方法
- 测量角度
介绍
这是来自2022年ICSE的一篇论文《Demystifying Android Non-SDK APIs: Measurement and Understanding》,作者有:Shishuai Yang, Rui Li, Jiongyi Chen, Wenrui Diao, and Shangqing Guo。
前置知识
non-sdk:一般而言,公共 SDK 接口是在 Android 框架软件包索引中记录的那些接口。非 SDK 接口的处理是 API 抽象出来的实现细节,因此这些接口可能会在不另行通知的情况下随时发生更改。
下图可能更能简单解释什么是非sdk,android.jar是属于一个公共sdk,在framework.jar中既有公共的sdk和非sdk。而开发环境所需的API是由公共的sdk android.jar提供的,但是在运行环境中,所需要的是framework.jar,其中包括的公共sdk和非公共sdk。公共的sdk是绝对安全的,但是部分非sdk可能会引起运行崩溃的情况。
non-SDK API可以分为
- Internal API:这部分的API通常在com.android.internal包中,此包下所有类的源代码都是不可见的,并且只能被系统应用程序使用。该包会提供系统的核心功能,可用于访问一些敏感资源。
- Restricted API:这些API由Private或default标记
- Hidden API:这些API在java文档中标记@hide
non-SDK访问方式:
- SDK替换:使用自定义的android.jar来替换默认的android.jar
- java反射:通过Java反射,开发人员可以运行调用任何对象的方法和属性
- JNI:通过定义JNI函数来调用本机代码,还可以通过NDK访问SDK和Non-SDK API
non-SDK分类:
- 黑名单:只要使用了这个API,就会触发运行崩溃
- 灰名单-max-x:这部分-max-p意味该应用程序目标sdk不超过Android P。可以访问非SDK API,但目标SDK API不大于Android P。若大于Android P,访问非SDK API会发生崩溃。
- 灰名单:这个列表的API不支持使用,但目前仍不受限制,可以使用
- 白名单:该列表的API可以自由使用。
数据集来源
应用商城+Virustotal恶意数据集
测量方法
RQ1:是否可以绕过谷歌的非SDK限制
RQ2:当前应用程序中使用非SDK现状
RQ3:在恶意应用程序和良性应用程序之间使用非SDK API的区别
RQ4:非SDK API在Android框架中是如何发展的
测量角度
1.是否存在方法绕过谷歌的非SDK限制
使用双反射和调用堆栈中断来绕过谷歌对非SDK的限制策略2.应用程序中使用非SDK现状
应用使用非SDK API的总体情况
每个应用平均非SDK API使用情况
由应用程序引用的非SDK API分布情况
Top 10所属包
3.恶意应用和良性应用程序之间使用非SDK API的区别
总体情况:61%的恶意软件使用了至少一个非SDK API4.Android框架中的非SDK API发展变化
恶意应用和良性应用使用的Top10非SDK API
非SDK数量变化
相邻的Android版本之间按列表类型更改的非SDK API数量
在列表更改过程中受影响最大的特性以及相关API的数量