【问题标题】:How to load native library securely in Android?如何在 Android 中安全地加载本机库?
【发布时间】:2013-11-20 13:04:38
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java android security android-ndk


    【解决方案1】:

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

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

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

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

    简而言之,2个选项:

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

    希望这会有所帮助!

    【讨论】:

    • 我们如何指定 NDK 库的完整路径,以使该路径对每个 Android 版本/设备都有效?
    • 编辑了我的答案以获取更多详细信息。
    • 不完全是——我怀疑 System.loadLibrary() 除了搜索应用程序的 lib 文件夹外,还会搜索一些系统目录。但是,任何可以攻击这些的人都可能会攻击 lib 文件夹(或者该应用程序正在严重损坏的设备上运行,该设备具有可写的系统目录)。您不太可能找到比您自己的应用程序的 lib 文件夹更安全的位置,特别是因为您的应用程序甚至无法写入该文件夹,而您可以放置​​它的其他任何地方都必须是。
    猜你喜欢
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多