安卓本地代码安全

3
Android如何对本地代码执行安全检查?假设我们在AndroidManifest.xml中声明权限X,这是否意味着我们在本地代码中继承相同的权限X?

1
应该是这样的。一些权限,如文件系统权限,是在内核级别实现的,因此您无法通过使用本机代码避免检查 - 其他在更高级别上实现的权限也应该从您的代码中触发,因为本机代码调用大多数情况下会最终到达与Java调用相同的点。虽然可能会找到漏洞。 - zapl
2个回答

2
Android如何执行安全检查?
基本上有两种方式来实施权限。
首先在内核层面:每个安装的应用程序都被分配一个唯一的(linux)用户ID,每次启动您的应用程序时,Android会生成一个进程,并将该进程的用户ID设置为您的应用程序用户ID。现在,使用标准的linux组权限系统来强制访问例如文件系统或某些硬件功能(例如网络)等。例如,如果您在清单中请求网络权限,则只允许访问网络组,您的应用程序用户是该组的一部分。
第二,在用户空间进行安全性的控制,例如访问某些ContentProviders或发送广播消息等,这些无法传递到操作系统。因此,一旦您从Java或本地代码调用方法,您可以(相当)肯定最终会进行某种软件检查,以确保您不能执行没有权限的操作。NDK API可能只会调用(也许是间接地)一些Java方法,因此可能不需要针对本机和Java代码进行单独的检查(但我不确定具体是如何完成的)。
使用本地代码可能会绕过某些Java检查,例如在UI线程上进行网络操作应该可以工作(如果您拥有网络权限)。还有可能存在仅通过使用本地代码才能利用的漏洞,但这应该很少见。最终使用哪种类型的代码应该没有关系。

我不认为你的说法是正确的,也不认为Linux内核在运行时直接参与其中,在Android下的每个应用程序都有自己的Bionic C库副本、自己的Dalvik副本,并且通常都是沙盒隔离的。据我所知和从各种关于Android的讲座中听到的,你是错误的,而且在谈论NDK时涉及内核没有任何意义。 - user827992
@user827992,你看了你链接的内容吗?“很少有东西是独特的安卓。[...]大多数安卓的补充是驱动程序(Binder等)和新颖的使用模式(例如用户ID),而不是实际的系统调用。”而http://en.wikipedia.org/wiki/Bionic_%28software%29是一个经典的C库,只是不是你所熟悉的那个。 - zapl
@user827992 是的,普通的主线kernel.org内核不适用于Android,因为它缺少一些附加功能,例如更多对ARM架构的支持和一些特定于Android的添加。但这并不意味着内核完全不同。您需要构建的内核需要支持您设备的硬件,由于这是定制的,因此无法使用通用内核。ELF格式是32位ARM,因此无法在32位Intel x86 Linux PC上运行。 - zapl
@user827992 - 与安全相关的主要Android内核更改是针对Internet域套接字的“偏执网络”组IP检查(仅有几行代码),以及删除被认为存在拒绝服务风险的System V IPC支持。几乎所有其他功能都建立在现有的Linux内核功能之上,其中许多是通用的Unix遗产。 - Chris Stratton
@zapl 抱歉,我不明白 :) (但是在这个领域我只有新手级别的知识)。这是否意味着一个应用程序可以改变运行所有其他应用程序的Dalvik虚拟机,就像Facebook所做的那样?还是每个应用程序都有自己的虚拟机?https://www.facebook.com/notes/facebook-engineering/under-the-hood-dalvik-patch-for-facebook-for-android/10151345597798920 - Karussell
显示剩余6条评论

-1

根据“Android逻辑”,至少有两个原因没有必要这样做:

  • 您总是需要编写一些Java代码来制作您的应用程序,因此您的入口点将始终是Java语言和Java应用程序;您无法仅使用C / C ++代码创建apk。
  • NDK只为dalvik生成一些摘要的机器代码,Android中没有可用的C / C ++ API;您不必担心使用需要特定权限的特定API集,因为您甚至不能编写并首先访问API。

最后,只需将Android视为Java应用程序,在其中可以使用C / C ++编写自己的业务逻辑以进行重型计算,Google提供的所有API和策略都应该与Java语言相关。


1
从NDK 5开始,不需要具有Java启动对象:开发人员还可以借助新的NativeActivity类在本地代码中实现Android应用程序生命周期。此外,更新的NDK为C++代码提供了丰富的API集。您两年前的知识是正确的,但事情已经发生了变化。 - Eugene Mayevski 'Callback
1
即使在编写时,这个答案也是错误的,因为从ndk的第一个版本(实际上是从平台工具链的第一个版本)开始就有用于访问传统功能(如文件和套接字)的本机API。此外,阻止本机接口访问任意Java API的原因是它们缺乏稳定性和链接头文件,而不是任何真正的保护机制,该机制将防止某人创建和发出针对特定Android构建的私有细节的调用。 - Chris Stratton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接