- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想知道 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/
我是一名优秀的程序员,十分优秀!