2012-09-05 108 views
4

是否有人試圖檢測注入來強化他們的代碼?例如,如果有人試圖通過NSUrlConnection攔截用戶名/密碼,他們可以使用LD_PRELOAD/DYLD_LIBRARY_PATH,爲我的呼叫提供導出到NSUrlConnection,然後將呼叫轉發到真正的NSUrlConnection。如何打破框架注入?

阿里在下面提供了很好的信息,但我正在試圖確定應該採取什麼措施來應對惡劣環境,手機可能會被監禁。大多數應用程序不需要關心,但是一類應用程序也可以 - 高完整性軟件。

如果您正在強化,您使用的是什麼方法?有沒有一種標準的方法來檢測Mac和iPhone上的注入?你如何擊敗框架注入?

回答

1

對於iOS/CocoaTouch,不允許加載動態庫*(系統框架除外)。要通過AppStore構建和分發應用程序,您只能鏈接靜態庫和系統框架,不能使用動態庫。

因此,在iOS中,您不能將其用於代碼注入,當然也不能使用LD_PRELOAD(因爲您無法在iOS上訪問此類環境變量)。

除了越獄iPhone可能,但越獄他們的iPhone的人應該承擔越獄,根據定義取消iOS提供的所有證券,以避免注入等事情(所以你不能指望取消你的鎖門,以避免必須使用你的鑰匙......並仍然期望你仍然不受盜賊搶劫的危害;-))

這就是Sandboxing + CodeSigning + iOS上沒有dylib限制的優點。無法執行代碼注入。

(在OSX它仍然是可能的,無論如何,使用inparticular LD_PRELOAD)


[編輯]由於iOS8上,監督辦公室還允許動態的框架。但由於這仍然是沙盒(您只能加載應用程序包內的代碼簽名框架,並且無法加載來自應用程序包外部的框架)注入仍然不可能*

*除非用戶越獄它的手機,但這意味着他/她選擇擺脫所有的保護和目的,從而使其手機處於危險之中 - 我們無法破解手機的安全性,並且仍然期望它提供所有證券提供的所有保護

+0

謝謝阿里。我應該更具體。我正在看Jailbroken設備(我已經看到了注入庫 - 我有源代碼)。所以這個想法是在惡劣的環境中強化可執行文件。 – jww

+0

噢!不要那麼做! – AliSoftware

+0

但ios 8允許框架... – uchuugaka

0

這是一個專門針對UNIX操作系統的答案,如果對您的問題沒有意義,我很抱歉,但我不太瞭解您的平臺。不要創建一個動態鏈接的可執行文件。

我可以通過兩種方式來做到這一點。方法#2可能對你最好。他們都是相似的。

重要兩者,可執行必須在生成時使用-static被靜態編譯

  1. 方法1 - 靜態EXE,手動負載共享庫可以通過受信任的完整路徑

通過完整路徑手動輸入每個庫,然後在運行時通過dlsym獲取函數地址,並將它們分配給函數指針以使用它們。你需要爲你想要使用的每個外部功能做到這一點。我相信折返不安全的功能將不喜歡這個所以對於那些使用靜態變量 - 你需要使用重入安全的版本,這些最終以「_r」,即使用strtok_r代替strtok

這將是困難的或取決於你的應用程序的功能以及使用的功能。

  • 方法2 - 靜態鏈接可執行文件,週期
  • 您可以通過鏈接只是一個靜態的可執行文件,以避免使用動態庫在所有解決您的顛覆問題。這將產生比dlopen()/dlsym()方法大得多的exe文件。編譯使用-static編譯標誌,而不是使用例如gcc bah.c -o bah lssl使用gcc -static bah.c -o bah /usr/lib/libssl.a來使用靜態編譯版本的庫,而不是動態共享庫。換句話說,使用-static和不使用-l同時建立

    對於這兩種方法:

    1. 一旦建成,使用file bah確認可執行靜態鏈接。或者通過在其上運行ldd來確認
    2. 請注意,您需要靜態編譯所有鏈接到您的系統中的庫的版本。這些文件以.a結束,而不是.so
    3. 另請注意,升級系統庫不會更新您的可執行文件。如果OpenSSL中存在新的安全錯誤,則需要獲取最新的libssl.a並重新編譯它。如果您使用dlopen()/dlsym()方法,你不會有這個問題,但你將有便攜性的問題,如果符號在不同版本

    每種方法都有其優點和缺點根據您的需求而改變。

    採取方法1 dlopendlsym的方法會使您的代碼更「混淆」且更小,但在大多數情況下犧牲了可移植性,因此可能不是您想要的。好處是當安全漏洞在系統範圍內固定時它可能會受益。