如何在安卓系统中安全地加载本地库?

3

我在想安卓中System.loadLibrary和System.load之间的安全性问题。

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

依赖于调用系统的System.loadLibrary方法来定位文件可能导致系统提供一个不是应用程序所需的文件。如果攻击者能够将文件放置在搜索范围内的位置,则攻击者可以将任意代码注入到应用程序中并执行。
如果指定精确路径,则可以通过文件权限等方式保护加载的文件。
问题是:我们如何以适用于每个Android版本/设备的方式指定NDK库的完整路径。
1个回答

4

System.loadLibrary是一个高级方法,旨在提高使用便捷性:据我所知,它会搜索您应用程序的lib文件夹(在Android文件系统中),该文件夹对应于您Eclipse项目的libs文件夹。

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

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

拥有您的库路径后,您可以使用System.load添加您的库,它接受要加载的完整路径作为参数。
简而言之,有两个选择:
- 如果lib文件夹容易受到攻击,则无法将库放在那里,因此您需要自己存储它们并可以使用System.load来加载它们。 - 或者lib文件夹确实安全,那么就没有攻击风险:您可以使用更标准的System.loadLibrary
希望这可以帮助您!

我们如何指定NDK库的完整路径,以便该路径对每个Android版本/设备都有效? - Costi Muraru
编辑了我的答案以提供更多细节。 - mbrenon
1
不完全是这样 - 我怀疑 System.loadLibrary() 除了应用程序的 lib 文件夹之外,还会搜索一些系统目录。然而,任何能攻击这些目录的人都可以攻击 lib 文件夹(否则该应用程序正在运行在一个有可写系统目录的严重损坏的设备上)。你不太可能找到比你自己应用程序的 lib 文件夹更安全的位置,特别是因为该文件夹甚至不能被你的应用程序写入,而你放置它的任何其他地方都必须是可写的。 - Chris Stratton

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