企業級App在交付給客戶時(尤爲是國企)一般會進行一項步驟:等保測評。
那麼除了一些第三方的付費加固方案,咱們開發者本身還能作哪些操做呢 ?
接下來,我將摘取咱們iOS應用安全風險評估報告中的幾個高風險進行操做。git
攻擊者能夠利用GDB、IDA、Ptrace等調試器跟蹤運行的目標程序,查看、修改內存中的代碼和數據,甚至分析/篡改程序的業務邏輯,對客戶關鍵數據或者服務器進行惡意攻擊,例如修改客戶端業務操做的數據,好比轉帳帳號、金額等,致使用戶的損失。github
【開發者修復】集成Native層的反調試保護功能,避免應用被Xcode、IDA等工具調試,進而保護業務安全。sql
反調試數據庫
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import <dlfcn.h>
#import <sys/types.h>
typedef int (*ptrace_ptr_t)(int _request, pid_t _pid, caddr_t _addr ,int _data);
#if !defined(PT_DENT_ATTACH)
#define PT_DENT_ATTACH 31
#endif
void disable_gdb() {
void * handle = dlopen(0, RTLD_GLOBAL|RTLD_NOW);
ptrace_ptr_t ptrace_ptr = dlsym(handle, "ptrace");
ptrace_ptr(PT_DENT_ATTACH, 0, 0, 0);
dlclose(handle);
}
int main(int argc, char * argv[]) {
disable_gdb();
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
複製代碼
應用程序運行時會在內存中產生一些敏感數據,好比密鑰Key、本地解密數據、通訊解密數據,攻擊者能夠利用frida等工具,對程序關鍵函數注入代碼,經過破壞業務邏輯能夠獲取明文數據或直接對服務器發起攻擊。安全
【開發者修復】集成防注入/防Hook保護功能,避免應用被注入/HOOK。bash
fishhook服務器
#import "AppDelegate.h"
#import "fishhook.h"
#import <objc/runtime.h>
@implementation AppDelegate
#pragma mark ---- 防禦代碼------
//函數指針變量
void(*exchangeP)(Method _Nonnull m1, Method _Nonnull m2);
//static NSMutableArray *methods;
void myExchange(Method _Nonnull m1, Method _Nonnull m2)
{
// if (!methods) {
// methods = [NSMutableArray array];
// }
// SEL oriMethodName = method_getName(m1);
SEL oriMethodName2 = method_getName(m2);
// IMP myMethodImp = method_getImplementation(m1);
// IMP myMethodImp2 =method_getImplementation(m2);
// 先從項目中找到目前所有的 method_exchangeImplementations 方法
// 項目中沒有的就是不安全的,直接exit。
NSString *newMethod = NSStringFromSelector(oriMethodName2);
// [methods addObject:newMethod];
// HTLog(@"%@",methods);
NSArray *wzArr = @[
@"af_resume", @"af_suspend",@"sd_setText:",@"sd_layoutSubviews",
@"sd_button_layoutSubviews",@"sd_reloadData",@"sd_reloadRowsAtIndexPaths:withRowAnimation:",
@"sd_deleteRowsAtIndexPaths:withRowAnimation:",
@"mj_reloadData",
@"mj_reloadData",
@"fd_reloadData",
@"fd_insertSections:withRowAnimation:",
@"fd_deleteSections:withRowAnimation:",
@"fd_reloadSections:withRowAnimation:",
@"fd_moveSection:toSection:",
@"fd_insertRowsAtIndexPaths:withRowAnimation:",
@"fd_deleteRowsAtIndexPaths:withRowAnimation:",
@"fd_reloadRowsAtIndexPaths:withRowAnimation:",
@"fd_moveRowAtIndexPath:toIndexPath:"];
if (![wzArr containsObject:newMethod]) {
HTLog(@"惡意代碼HOOK:%@",newMethod);
exit(0);
}
}
+(void)load{
/**
防禦代碼:
這裏使用fishHOOK 對method_exchangeImplementations進行HOOK替換便可
*/
struct rebinding bd;
bd.name = "method_exchangeImplementations";
bd.replacement = myExchange;
bd.replaced = (void *)&exchangeP;
struct rebinding rebs[1] = {bd};
rebind_symbols(rebs, 1);
}
複製代碼
iOS應用的核心代碼編譯以後會生成Mach-O文件,「黑客」利用IDA Pro等逆向工具,能夠輕鬆反編譯未採起任何保護措施的Mach-O文件,生成近似源代碼的C代碼,業務邏輯、核心技術將直接暴露在攻擊者的眼前。進一步形成核心技術泄漏、隱私數據泄漏、業務邏輯惡意篡改等危害。markdown
【開發者修復】建議對重要的C/C++/Objective-C/Swift等代碼採用虛擬化或者混淆保護技術,對關鍵的函數進行高強度的安全加密。dom
#!/usr/bin/env bash
TABLENAME=symbols
SYMBOL_DB_FILE="symbols"
STRING_SYMBOL_FILE="func.list"
HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/codeObfuscation.h"
export LC_CTYPE=C
#維護數據庫方便往後做排重
createTable()
{
echo "create table $TABLENAME(src text, des text);" | sqlite3 $SYMBOL_DB_FILE
}
insertValue()
{
echo "insert into $TABLENAME values('$1' ,'$2');" | sqlite3 $SYMBOL_DB_FILE
}
query()
{
echo "select * from $TABLENAME where src='$1';" | sqlite3 $SYMBOL_DB_FILE
}
ramdomString()
{
openssl rand -base64 64 | tr -cd 'a-zA-Z' |head -c 16
}
rm -f $SYMBOL_DB_FILE
rm -f $HEAD_FILE
createTable
touch $HEAD_FILE
echo '#ifndef Demo_codeObfuscation_h
#define Demo_codeObfuscation_h' >> $HEAD_FILE
echo "//confuse string at `date`" >> $HEAD_FILE
cat "$STRING_SYMBOL_FILE" | while read -ra line; do
if [[ ! -z "$line" ]]; then
ramdom=`ramdomString`
echo $line $ramdom
insertValue $line $ramdom
echo "#define $line $ramdom" >> $HEAD_FILE
fi
done
echo "#endif" >> $HEAD_FILE
sqlite3 $SYMBOL_DB_FILE .dump
複製代碼
1.導入codeObfuscation.h前先設置權限
2.確保func.list文件與confuse.sh文件在同一個文件夾裏面
3.目錄中不要含有空格