Java 如何在Android中安全加载本机库?

Java 如何在Android中安全加载本机库?,java,android,security,android-ndk,Java,Android,Security,Android Ndk,我想知道Android中System.loadLibrary和System.load之间的安全含义 static { System.loadLibrary("mylib"); } 依靠调用系统帮助定位对象(通过system.loadLibrary方法)可能会导致系统提供应用程序不希望加载的文件。如果攻击者可以将文件放置在搜索范围内的某个位置,则攻击者可以将任意代码注入应用程序并执行它 如果指定确切路径,则可以通过文件权限等方式保护加载的文件 问题是:我们如何指定NDK库的完整路径,以使

我想知道Android中System.loadLibrary和System.load之间的安全含义

static {
    System.loadLibrary("mylib");
}
依靠调用系统帮助定位对象(通过system.loadLibrary方法)可能会导致系统提供应用程序不希望加载的文件。如果攻击者可以将文件放置在搜索范围内的某个位置,则攻击者可以将任意代码注入应用程序并执行它

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


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

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

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

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

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

简言之,有两种选择:

  • 无论是
    lib
    文件夹是可攻击的,您都不能将库放在那里,因此您有自己的逻辑来存储它们,您可以使用
    System.load加载它们
  • 或者
    lib
    文件夹确实是安全的,这样就不会有被攻击的风险:您可以使用更标准的
    System.loadLibrary

希望这有帮助

我们如何才能指定NDK库的完整路径,从而使该路径对每个Android版本/设备都有效?编辑我的答案以了解更多详细信息。不完全是这样-我怀疑System.loadLibrary()除了搜索应用程序的lib文件夹外,还会搜索一些系统目录。但是,任何能够攻击这些文件的人都可能会攻击lib文件夹(或者该应用程序正在一个严重损坏的设备上运行,该设备具有可写的系统目录)。你不太可能找到一个比你自己的应用程序的lib文件夹更安全的位置,尤其是当你的应用程序甚至不能写这个文件夹时,你可以把它放在其他任何地方。