iOS應(yīng)用代碼注入防護(hù)

在應(yīng)用開發(fā)過程中,我們不僅僅需要完成正常的業(yè)務(wù)邏輯,考慮應(yīng)用性能、代碼健壯相關(guān)的問題,我們有時還需要考慮到應(yīng)用安全的問題。

那么應(yīng)用安全的問題涉及到很多方面。比如防止靜態(tài)分析的,代碼混淆、邏輯混淆;防止重簽名的,應(yīng)用ID檢測、甚至是代碼的HASH檢測等等。那么這篇文章我想聊聊關(guān)于代碼的注入檢測,因為發(fā)現(xiàn)隨著iOS系統(tǒng)的更新,我們防護(hù)的手段發(fā)生了一些變化。

代碼注入的方式

代碼注入的方式大致分為兩種

越獄注入:通過修改DYLD_INSERT_LIBRARIES 環(huán)境變量的值,來插入動態(tài)庫并執(zhí)行

非越獄注入:

直接將自定義的Framwork或者dylib庫打包進(jìn)入APP并重簽名。

利用yololib修改MachO文件,添加庫路徑.在應(yīng)用啟動時,dyld會加載并執(zhí)行.

早期防護(hù)方式

在工程的Build Settings中找到Other Linker Flages 并添加字段

-Wl,-sectcreate,__RESTRICT,__raestrict,/dev/null

此操作的作用是在可執(zhí)行文件中添加一個Section.我們使用MachOView分析如下:

MachOView

當(dāng)MachO文件中擁有這個字段,那么我們通過越獄環(huán)境插入動態(tài)庫的方式就會失效.起到防護(hù)的作用.其原理在DYLD源碼中可以分析到.

dyld源碼分析

首先這里分析的DYLD源碼版本是519.2.2版本.

我們可以通過檢索DYLD_INSERT_LIBRARIES定位到_main函數(shù)加載插入動態(tài)庫的代碼如下.

//?load?any?inserted?libraries

if(?sEnv.DYLD_INSERT_LIBRARIES?!=NULL)?{

for(constchar*const*?lib?=?sEnv.DYLD_INSERT_LIBRARIES;?*lib?!=NULL;?++lib)

loadInsertedDylib(*lib);

}

但是早在這個環(huán)境變量判斷之前,dyld已經(jīng)做了一個判斷

if(?gLinkContext.processIsRestricted?)?{

pruneEnvironmentVariables(envp,?&apple);

//set?again?because?envpandapple?may?have?changedormoved

setContext(mainExecutableMH,?argc,?argv,?envp,?apple);

}

如果判斷出進(jìn)程是restricted!也就是當(dāng)前進(jìn)程是限制插入動態(tài)庫的!就會調(diào)用pruneEnvironmentVariables函數(shù)移除相關(guān)的環(huán)境變量.

那么我們的processIsRestricted值什么時候為true呢?

繼續(xù)分析源碼可以發(fā)現(xiàn)兩個關(guān)鍵函數(shù)影響其值.其中 hasRestrictedSegment 函數(shù)專

門檢測RESTRICT段

//?any?processeswithsetuidorsetgid?bit?setorwith__RESTRICT?segmentisrestricted

if(?issetugid()?||?hasRestrictedSegment(mainExecutableMH)?)?{

gLinkContext.processIsRestricted?=?true;

}

通過注釋也能發(fā)現(xiàn).任意進(jìn)程的__RESTRICT段設(shè)置為restricted動態(tài)庫插入將被限制.

我們進(jìn)入到processIsRestricted函數(shù)內(nèi),實現(xiàn)如下.

#if__MAC_OS_X_VERSION_MIN_REQUIRED

staticboolhasRestrictedSegment(constmacho_header*?mh)

{

constuint32_t?cmd_count?=?mh->ncmds;

conststructload_command*constcmds?=?(structload_command*)(((char*)mh)+sizeof(macho_header));

conststructload_command*?cmd?=?cmds;

for(uint32_t?i?=0;?i?<?cmd_count;?++i)?{

switch(cmd->cmd)?{

caseLC_SEGMENT_COMMAND:

{

conststructmacho_segment_command*?seg?=?(structmacho_segment_command*)cmd;

//dyld::log("seg?name:?%s\n",?seg->segname);

if(strcmp(seg->segname,"__RESTRICT")?==0)?{

conststructmacho_section*constsectionsStart?=?(structmacho_section*)((char*)seg?+sizeof(structmacho_segment_command));

conststructmacho_section*constsectionsEnd?=?§ionsStart[seg->nsects];

for(conststructmacho_section*?sect=sectionsStart;?sect?<?sectionsEnd;?++sect)?{

if(strcmp(sect->sectname,"__restrict")?==0)

returntrue;

}

}

}

break;

}

cmd?=?(conststructload_command*)(((char*)cmd)+cmd->cmdsize);

}

returnfalse;

}

所以通過添加Other Linker Flags 在MachO中設(shè)置RESTRICT段賦值為restricted可以用來防護(hù)越獄的代碼注入.

但是新版的dyld源碼中去掉了__RESTRICT檢測.從iOS10開始,這種防護(hù)手段已失效

DYLD_INSERT_LIBRARIES 檢測

那么既然dyld加載過程不再檢測__RESTRICT段了我們就手動的檢測DYLD_INSERT_LIBRARIES環(huán)境變量.通過函數(shù)可查看當(dāng)前進(jìn)程環(huán)境變量的值.

char*env?=?getenv("DYLD_INSERT_LIBRARIES");

NSLog(@"%s",env);

在沒有插入動態(tài)庫時,env為null.

那么一旦為自己的應(yīng)用寫入插件時,我們就可以看到控制臺的輸出

2019-01-0319:20:37.285antiInject[7482:630392]?/Library/MobileSubstrate/MobileSubstrate.dylib

白名單檢測

那么上面的檢測只可以檢測越獄環(huán)境中的代碼注入,在非越獄環(huán)境中,逆向工程師可以利用yololib工具注入動態(tài)庫.所以我們可以檢索一下自己的應(yīng)用程序所加載的動態(tài)庫是否是我們源程序所有

boolHKCheckWhitelist(){

intcount?=?_dyld_image_count();

for(inti?=0;?i?<?count;?i++)?{

//遍歷拿到庫名稱!

constchar*?imageName?=?_dyld_get_image_name(i);

//判斷是否在白名單內(nèi),應(yīng)用本身的路徑是不確定的,所以要除外.

if(!strstr(libraries,?imageName)&&!strstr(imageName,"/var/mobile/Containers/Bundle/Application"))?{

printf("該庫非白名單之內(nèi)??!\n%s",imageName);

returnNO;

}

}

returnYES;

}

其中l(wèi)ibraries變量是白名單.


作者:_小迷糊

鏈接:http://m.itdecent.cn/p/4b345acf6f08

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容