- 前兩天公司給了一份應用安全的測評報告,報告顯示iOS這邊安全測評得分是60(滿分100),報告出的蠻詳細,列出了危險等級,危害及 建議解決的方法。經評估我暫做了程式碼混淆和動態調式攻擊風險。
程式碼混淆
一、危害
- 針對 iOS 應用開發使用的 Object-c 及 C,C++程式碼目前較缺乏有效的防護手段, 蘋果的 app 自身並沒有比 android 更安全的防範措施,也無法通過常規的二 次加固保護應用不被反編譯和篡改,應用程式碼編寫過程中出現的安全漏洞、 編碼隱患、甚至業務邏輯上的缺陷很容易被分析暴露,造成程式業務邏輯洩 露、加解密演算法失效、通訊加密失效,攻擊者可以利用這些資訊竊取客戶端 的敏感資料,包括賬號、密碼;繞過業務安全認證流程,直接篡改使用者賬號 資訊;對伺服器介面發起攻擊等。iOS 的程式碼混淆,是通過將 Object- C、C/C++程式碼中的方法名、變數名、類名、包名等這些元素名稱改成毫無關 聯且無意義的名字,對原始碼實現邏輯分支混淆和控制流平坦化,隱藏關鍵邏 輯,提高黑客破解難度,增加破解時間成本。
二、建議解決方案
- 開發者使用標頭檔案對映的方式定義 pch 檔案,並在定義的 pch 檔案中引入頭 檔案,在標頭檔案中定義方法混淆的隱射,防止程式碼語義化的定義暴露程式意 圖,同時編譯生成新的釋出包
三、實際解決方案
1、cd 專案路徑
2.touch confuse.sh
(此檔案中新增混淆指令碼,指令碼在這裡)
3、touch func.list
(此檔案中手動新增想要混淆的方法,也可參考這篇文章裡的指令碼進行全域性混淆)
4、分別 mv confuse.sh 和 func.list 到自己的專案目錄下
如:mv confuse.sh 專案路徑
5、設定run script
如下圖
6、在PCH檔案中新增 #import "codeObfuscation.h"
7、編譯
8、如果需要demo的話,這裡有一個不是我寫的
demo
四、以上操作流程各位開發者總結了很多,我在這裡主要說一下自己遇到的坑:
-
最深的坑就是路徑問題,在念茜的部落格裡看到的是用
mv
命令來移動,在其他部落格中大都記錄的是Add Files...
來移動到專案目錄下,我用Add Files...
之後就出現了報錯,提示找不到路徑,嘗試了各種相對路徑和絕對路徑後無果,而後用終端mv
命令後就一路暢通了,如果你有同樣的問題,建議用mv
命令試試。 -
如果沒有自動生成
codeObfuscation.h
檔案可手動建立,但是注意#ifndef Demo_codeObfuscation_h
#define Demo_codeObfuscation_h
和指令碼中的echo '#ifndef Demo_codeObfuscation_h
相對應。 -
編譯後報錯
Shell Script Invocation Error
錯誤,可在終端執行chmod -R 777 XXX 命令
, XXX是路徑,表示給XXX路徑下的所有資料夾和檔案都授予讀寫和可執行許可權。 -
在
func.list
檔案中新增方法後如果在codeObfuscation.h
沒有生成相對應的混淆後的程式碼,建議關注一下confuse.sh中HEAD_FILE="$PROJECT_DIR/codeObfuscation.h"
此處的路徑。
五、逆向檢視程式碼是否混淆成功
1、下載class-dump
下載地址
2、將dmg檔案裡的class-dump複製到“/usr/local/bin/”下,其他的目錄好像都沒有寫入許可權了。
3、在終端輸入 class-dump檢視是否可正確顯示版本,如下圖
4、將ipa字尾改成zip並解壓
5、執行命令 class-dump -H Payload路徑/appName.app -o 寫入檔案路徑
6、到這裡程式碼混淆基本上就完成了,可在剛寫入的檔案中找到混淆方法檢視是否是一串亂七八糟的字元。
動態調式攻擊風險
一、危害
- 在未加入反除錯術的 iOS App 中,攻擊者使可用
GDB、IDA、Ptrace
等除錯 器跟蹤執行的目標程式,檢視記憶體中執行的程式狀態,獲取記憶體程式中的運 行程式碼和實時資料,甚至分析篡改程式的業務邏輯,對客戶關鍵資料或者服 務器進行惡意攻擊,例如檢視客戶端業務操作的資料,比如登入賬號、密碼 等,竊取使用者資訊;或者通過分析程式執行邏輯,挖掘應用漏洞。
二、建議解決方案
-
在程式碼中的
main.m
類中增加如下程式碼,gdb
方式或其他除錯工具注入到當前 程式程式,程式碼如下:void anti_gdb_debug() { void* handle = dlopen(0, RTLD_GLOBAL | RTLD_NOW); ptrace_ptr_t ptrace_ptr = dlsym(handle, "ptrace"); ptrace_ptr(PT_DENY_ATTACH, 0, 0, 0); dlclose(handle); }
三、實際解決方案
- 剛好在念茜大佬的部落格看到這篇阻止GDB依附的文章,基本上我也就這樣了,不得不說大佬就是大佬,一系列安全防攻擊總結的全面到位,膜拜。
以上是我在專案中遇到的一些問題,如果能幫到你我很開心,如果沒能幫到你,建議多查一點相關的文件,畢竟實際出現的問題也是千奇百怪。
OVER