漏洞挖掘新思路:fuzz+符號(hào)執(zhí)行——driller

driller 符號(hào)執(zhí)行+fuzz漏洞挖掘思路

http://cs.ucsb.edu/~chris/research/doc/ndss16_driller.pdf

先看一段程序

int main()
{
    config_t* config=read_config();
    if (config==null){
        puts("config error\n");
        return -1;
    }
    if (config->magic!=MAIGIC_NUMBER){
        puts("magic number error\n");
        return -1;
    }
    initialize(config);
    char* directive=config->directive[0];
    if(!strcmp(directive,"crash_string")){
        program_bug();
    }
    if(!strcmp(directive,"set_config"){
        program_bug();
    }    
    else{
        default();
    }
}

fuzz engine首先fuzz第一部分read_config(),initialize()


driller_fig2.png

遇到比較magic number的程序段,調(diào)用 concolic execution engine來找到能通過檢測(cè)的輸入,來到達(dá)程序的其他部分


driller_fig2.png

fuzz engine找到default()


driller_fg3.png

concolic engine找到滿足約束條件的輸入來達(dá)到program_bug()

僅僅通過fuzz和符號(hào)執(zhí)行本身是無法找到program_bug(),initialize()中有非常多狀態(tài),
這會(huì)導(dǎo)致路徑爆炸,導(dǎo)致符號(hào)執(zhí)行失敗,在遇到比較MAIGIC_NUMBER時(shí),傳統(tǒng)的fuzz會(huì)失敗,
其他一些常見的編程方式,如比較hash值,也會(huì)導(dǎo)致fuzz失敗。

因此fuzz engine和concolic engine的混合使用有較高的潛力。這里選擇afl qemu作為
fuzz engine

driller用到的afl的一些特性

afl特性

  • 通過遺傳啟發(fā)算法對(duì)輸入進(jìn)行變異,用適應(yīng)度函數(shù)對(duì)他們進(jìn)行排名.unique函數(shù)基于獨(dú)特的代碼覆蓋率,即觸發(fā)與其他輸入觸發(fā)的路徑不同的執(zhí)行路徑。
  • AFL跟蹤它從輸入中看到的控制流轉(zhuǎn)換的聯(lián)合,作為源和目標(biāo)基本塊的元組。基于他們發(fā)現(xiàn)的新的控制流轉(zhuǎn)換,遺傳算法中的輸入被初始化為“繁殖”。這意味著導(dǎo)致應(yīng)用程序以不同方式執(zhí)行的輸入會(huì)在未來輸入的生成中獲得優(yōu)先權(quán)。
  • 處理循環(huán)對(duì)于模糊引擎和concolic執(zhí)行引擎來說是一個(gè)復(fù)雜的問題。為了幫助減小循環(huán)的路徑空間的大小,執(zhí)行以下啟發(fā)式。當(dāng)AFL檢測(cè)到路徑包含循環(huán)迭代時(shí),將觸發(fā)次級(jí)計(jì)算以確定該路徑是否有資格進(jìn)行繁殖。AFL確定執(zhí)行的循環(huán)迭代次數(shù),并將其與先前導(dǎo)致路徑經(jīng)歷相同循環(huán)的輸入進(jìn)行比較。這些路徑全部通過其循環(huán)迭代次數(shù)的對(duì)數(shù)(即1,2,4,8等)被置于“桶”中。在遺傳算法中考慮來自每個(gè)桶的一條路徑用于繁殖。這樣,每個(gè)循環(huán)只需要考慮log(N)條路徑,而不是N條。
  • 程序隨機(jī)化干擾遺傳模糊器對(duì)輸入的評(píng)估 - 在給定隨機(jī)種子下產(chǎn)生有用路徑的輸入可能不會(huì)在另一個(gè)下產(chǎn)生。我們預(yù)先將AFL的QEMU后端設(shè)置為特定的隨機(jī)種子,以確保一致的執(zhí)行。
  • 之后,當(dāng)發(fā)現(xiàn)崩潰的輸入時(shí),我們使用concolic執(zhí)行引擎來恢復(fù)任何錯(cuò)誤“挑戰(zhàn) - 回應(yīng)”行為或依賴泄漏隨機(jī)性的漏洞。例如,二進(jìn)制文件中的“質(zhì)詢 - 響應(yīng)”過程會(huì)將隨機(jī)數(shù)據(jù)回傳給用戶,并期望將相同的數(shù)據(jù)回傳。在不去除隨機(jī)化的情況下,模糊組件可能每次都會(huì)通過這個(gè)檢查并探索很少的路徑。如果隨機(jī)性不變,程序每次都接受相同的輸入,讓模糊器(或concolic執(zhí)行組件)可以自由地找到這個(gè)值并隨后進(jìn)一步探索。發(fā)現(xiàn)崩潰后,隨機(jī)性可以像第V-D4節(jié)所述的那樣象征性地建模,并且崩潰輸入可以相應(yīng)地進(jìn)行修補(bǔ)。這些功能允許AFL通過應(yīng)用程序快速發(fā)現(xiàn)唯一路徑,從而在應(yīng)用程序的指定隔間內(nèi)執(zhí)行路徑發(fā)現(xiàn)工作。但是,模糊的局限性是眾所周知的。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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