Android 如何对原生代码进行安全检查?假设我们在 AndroidManifest.xml 中声明了权限 X,这是否意味着我们在本机代码中继承了相同的权限 X?
2 回答
Android 如何执行安全检查?
基本上有两种强制执行权限的方式。
首先在内核级别:每个已安装的应用程序都分配有一个唯一的(linux)用户 ID,每次启动您的应用程序时,Android 都会生成一个进程并将该进程的用户 ID 设置为您的应用程序用户 ID。现在访问例如文件系统或某些硬件功能(如网络)是通过使用标准的 linux 组权限系统来强制执行的。例如,仅允许网络组访问网络,如果您在清单中请求网络权限,您的应用用户就是该组的一部分。
用户空间中的安全性,例如访问某些
ContentProvider
s 或发送广播消息等,根本无法中继到操作系统。因此,一旦您从 Java 或本机代码调用方法,您就可以(非常)确定最终有一些软件检查,以确保您不能做您没有权限的事情。NDK API 很可能会简单地调用(可能是间接地)一些 Java 方法,因此可能不需要对本机代码和 Java 代码进行单独检查(但我知道这是如何完成的)。
您很可能可以通过使用本机代码来规避一些 Java 检查,例如 UI 线程上的网络应该可以工作(如果您有网络权限)。也有可能存在只能通过使用本机代码来利用的漏洞,但应该很少见。到底你使用什么类型的代码并不重要。
@user827992
NDK 只是为 dalvik 生成一些经过消化的机器代码,在 C/C++ for Android 中没有可用的 API;对于使用需要特定权限的特定 API 集,您没有问题,因为您甚至根本无法编写代码并首先访问 API。
不正确,用 C/C++ 编写的本机代码在应用程序的编译时以 CPU 的本机机器代码编译,并在运行时由 CPU 直接执行,不涉及 dalvik。如果你通过 JNI(通过 NDK API)调用一些 Java 方法,你会回到 dalvik。NDK 还提供了很多 Android API,这就是它存在的原因。
根据“Android逻辑”,至少有两个原因没有必要这样做:
- 你总是需要编写一些java代码来制作你的应用程序,所以你的入口点总是java语言和你的java应用程序;你不能只用 C/C++ 代码做一个 apk。
- NDK 只是为 dalvik 生成一些经过消化的机器代码,在 C/C++ for Android 中没有可用的 API;对于使用需要特定权限的特定 API 集,您没有问题,因为您甚至根本无法编写代码并首先访问 API。
最后,只需将 android 视为一个 java 应用程序,您可以在其中使用 C/C++ 编写您自己的业务逻辑来处理繁重的计算内容,Google 在 API 和策略方面为您提供的所有内容都应该只与 Java 相关语。