【问题标题】:How is Android permission enforced?Android 权限是如何执行的?
【发布时间】:2011-03-01 13:04:14
【问题描述】:

如果我在 JNI C 方法中调用 socket() 函数,应用程序仍然会失败并出现权限错误。如果我在 AndroidManifest.xml 中添加了 uses-permission 行,问题就解决了。

所以似乎在 Dalvik 虚拟机中没有实现 Android 权限检查,因为我正在调用本机 C 函数并且仍然被检查。我想知道如何在 Android 内核中执行检查,或者使用 ptrace 之类的东西跟踪应用程序以拦截每个系统调用或任何其他方式。非常感谢。

【问题讨论】:

  • 从技术上讲,这仅适用于 Internet 域套接字。 Unix 域套接字使用具有不同常量的相同 socket() 调用没有通过 android“偏执网络”内核修改强制执行组 ID。

标签: android java-native-interface dalvik


【解决方案1】:

检查由 Linux 内核执行,使用组成员身份来确定访问权限。

如果您在 VM 中查看 the zygote fork code,您可以使用 setgroups() 来设置补充组 ID。如果您在应用程序框架代码中仔细观察它,您可以看到它在哪里确定权限并将它们传递给 forkAndSpecialize()。

【讨论】:

【解决方案2】:

原生代码在 SDK 应用使用的同一沙箱中运行,因此与 SDK 应用采用相同的安全模型。

Download the Android NDK:

如果您编写本机代码,您的 应用程序仍被打包成 一个 .apk 文件,它们仍然在里面运行 设备上的虚拟机。 基本的 Android 应用程序 模型不变。

【讨论】:

  • 注释指的是应用程序模型,而不是安全模型。本机代码未虚拟化。
  • 虽然本机应用程序不直接在 Dalvik 虚拟机上运行,​​但它们仍然在从启动它们的 Dalvik 虚拟机继承的安全沙箱中运行 - 否则,您将能够泄露任何恶意代码到某人的设备上,只要 SDK 应用程序能够运行,它就可以产生您的恶意本机负载。关键点是安全模型仍然适用 - 正如@ZelluX 所证明的那样,当有必要将相关的使用权限添加到清单时。
  • 严格来说确实如此,但“沙盒”是 Linux 内核,它同样适用于设备上运行的所有用户空间进程。您的回答暗示安全机制是用于 SDK 应用程序的每进程沙箱,但事实并非如此。
猜你喜欢
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-08
  • 2012-07-07
  • 2013-01-27
  • 1970-01-01
相关资源
最近更新 更多