问题描述
使用 axplorer 工具评估 APK 的权限使用情况时,发现 android.permission.INTERNET
权限的有效使用数量为 0。这看起来非常奇怪,因为这是一个非常常用的权限(Android 开发文档明确指出,为了执行网络操作,APK 必须声明此权限)。问题在于 axplorer 映射文件中没有映射到常用的“互联网使用”方法(如 java.net.HttpURLConnection
、java.net.HttpsURLConnection
、java.net.Socket
等)与 android.permission.INTERNET
权限的关系。
解决方案
方案1:理解互联网权限的实现机制
- 确认互联网权限主要在本地代码层检查:
根据 axplorer 的 README,映射文件目前缺少在本地代码中进行权限检查的 API(如 Camera 等)。因此,
android.permission.INTERNET
权限主要是本地代码层检查,而不是在 Java API 层面。逻辑推导:
- Android 是基于 Linux 的系统,允许应用程序使用本地 Linux 函数打开套接字连接。因此,如果要强制执行
android.permission.INTERNET
权限,必须在本地代码层面实现权限检查。一旦实现了本地代码层面的检查,就不需要在 Java API 层面对这些方法进行额外的权限检查。
方案2:检查映射文件中的其他类和方法
- 检查映射文件中的其他类和方法:
axplorer 映射文件中确实存在一些
android.permission.INTERNET
权限的映射,但这些映射并不是针对常用的“互联网使用”方法(如java.net.HttpURLConnection
、java.net.Socket
等),而是针对其他 Java 类和方法(如com.android.providers.downloads.DownloadProvider
、com.android.server.NsdService.getMessenger()
等)。解释映射文件中的映射:
- 这些映射的存在是因为这些类和方法涉及到与其他进程的远程过程调用(RPC),例如
com.android.server.ConnectivityService.reportBadNetwork
和com.android.server.ConnectivityService.reportInetCondition
等。在这些情况下,权限检查发生在不同进程之间,因此需要检查调用者的权限。
方案3:调整评估方法
- 改进评估方法:
- 如果需要更准确地评估
android.permission.INTERNET
权限的使用情况,可以考虑以下方法:- 手动检查 APK 中涉及网络操作的代码片段,确保所有网络相关的操作都正确声明了
android.permission.INTERNET
权限。 - 使用静态分析工具来识别所有可能涉及网络操作的方法,并检查这些方法是否正确声明了
android.permission.INTERNET
权限。 - 分析 APK 的 dex 文件,查找所有可能涉及网络操作的方法,并检查这些方法是否正确声明了
android.permission.INTERNET
权限。
- 手动检查 APK 中涉及网络操作的代码片段,确保所有网络相关的操作都正确声明了
总结
android.permission.INTERNET
权限主要在本地代码层进行检查,因此在 axplorer 映射文件中没有针对常用“互联网使用”方法的详细映射。- 通过逻辑推导和实际检查,可以更好地理解为什么在映射文件中没有这些详细的映射。
- 为了更准确地评估
android.permission.INTERNET
权限的使用情况,可以采取手动检查和使用静态分析工具的方法。
正文完