java - 如何在 Android 中安全地加载 native 库?

标签 java android security android-ndk

我想知道 Android 中 System.loadLibrary 和 System.load 之间的安全隐患。

static {
    System.loadLibrary("mylib");
}

依赖调用系统来帮助定位事物(通过 System.loadLibrary 方法)可能会导致系统提供一个本不打算由应用程序加载的文件。如果攻击者可以将文件放在搜索范围内的位置,则攻击者可以将任意代码注入(inject)应用程序并执行它。

如果指定了确切的路径,则可以通过文件权限等方式保护加载的文件。

问题是:我们如何指定 NDK 库的完整路径,使该路径对每个 Android 版本/设备都有效。

最佳答案

System.loadLibrary 是一种为便于使用而设计的高级方法:据我所知,它会搜索应用程序的 lib 文件夹(在Android 文件系统),它对应于 Eclipse 项目的 libs 文件夹。

这意味着,为了通过使用 System.loadLibrary 加载错误的库来搞乱您的应用程序,攻击者必须能够在这个 中覆盖您自己的库lib 文件夹,或者通过某种方式在这个lib 文件夹中添加一个同名的库。我完全不知道这是否可能(我希望并且猜测不会!),但假设是这样,这意味着 lib 文件夹不能被认为是安全的。

这意味着为了保护您的应用免受此类攻击,您需要将您的库文件放在其他地方,因此您有自己的逻辑将库文件写入磁盘上的某个地方。在这种情况下,在此逻辑中的某个位置,您可以掌握库的绝对路径。

有了您的库的路径,您可以使用 System.load 添加您的库它采用库的完整路径作为参数加载。

简而言之,有 2 个选项:

  • 要么 lib 文件夹是可攻击的,你不能把你的库放在那里,所以你有自己的存储它们的逻辑,你可以使用 System.load
  • 或者lib文件夹确实是安全的,也就没有被攻击的风险:你可以使用更标准的System.loadLibrary

希望这对您有所帮助!

关于java - 如何在 Android 中安全地加载 native 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20096780/

相关文章:

vue.js - 如何修复 vue-cli-service 漏洞?

java - 仅在行不存在时插入

java - 即使在继续时也保留 Java for 循环中集合的前一个元素

android - 在 Visual Studio 2017 中发布 Android 应用程序

android - opencv中我们可以在没有人脸检测的情况下检测眼睛吗

xml 中的 Android 谷歌地图 fragment 。我得到 "Unexpected namespace prefix"

security - Meteor 允许我从任何地方订阅,存在安全缺陷

xml - 在 IE 中查看 XML 时如何禁用安全警告?

java - 从 xml 消息中隐藏实体变量 - @XmlTransient 不工作

java - 在多个数据库编写器 bolt /数据库查询路由器之间平均分割 Storm 流?