2013-11-20 29 views
2

我想知道Android中System.loadLibrary和System.load之間的安全含義。如何在Android中安全地加載本機庫?

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

依託呼叫系統,以幫助找到的東西(通過的System.loadLibrary方法)可導致系統提供的目的不是由應用程序加載的文件。如果攻擊者可以將文件放置在搜索位置,則攻擊者可以將任意代碼注入應用程序並執行它。

如果指定的確切路徑,你必須保護貫穿東西像文件的權限加載的文件,

的問題是,能力等:我們如何能夠指定一個NDK庫在這樣的完整路徑這條路徑對每個Android版本/設備都有效。

回答

3

System.loadLibrary是專爲易於使用的高級方法:據我所知,它會搜索你的應用程序的lib文件夾(在Android文件系統),這相當於你的Eclipse項目的libs文件夾。

這意味着,以亂用您的應用程序通過裝載使用System.loadLibrary錯誤的庫中,攻擊者必須能夠要麼重寫你自己的庫在這個lib文件夾,或者與同一添加庫以某種方式在此lib文件夾中命名。我完全不知道這是否可能(我希望也不會猜到!),但假設它是,這意味着lib文件夾不能被認爲是安全的。

這意味着爲了保護您的應用程序免受此類攻擊,您需要將庫文件放在其他位置,因此您有自己的邏輯來將磁帶庫文件寫入某處。在這種情況下,在這個邏輯的某個地方,你的手就在你的庫的絕對路徑上。

有了你的庫的路徑,你可以使用System.load來添加你的庫,它將庫的完整路徑加載爲參數。

總之,2種選擇:

  • 要麼lib文件夾是易受攻擊的,你不能把你的圖書館在那裏,所以你有你自己的邏輯來保存它們,您可以使用加載它們System.load
  • lib文件夾確實安全,然後不存在攻擊的危險:您可以使用更標準的System.loadLibrary

希望這有助於!

+0

我們如何以這樣的方式指定NDK庫的完整路徑,使得此路徑對每個Android版本/設備均有效? –

+0

編輯我的答案瞭解更多詳情。 – mbrenon

+1

不完全 - 我懷疑除了應用程序的lib文件夾之外,System.loadLibrary()還會搜索一些系統目錄。但是,任何能夠攻擊這些文件的人都可能會攻擊lib文件夾(否則該應用程序將在具有可寫系統目錄的嚴重破壞的設備上運行)。你不可能找到一個比你自己的應用程序的lib文件夾更安全的位置,尤其是那個文件夾甚至不能被你的應用程序寫入,在你可以放置的任何其他位置。 –