? ? ? ? ?openssl項目的提交日志含有非常重要的信息,比如漏洞的發(fā)現(xiàn)和修復(fù)情況,而根據(jù)經(jīng)驗,一個漏洞的發(fā)現(xiàn),其相關(guān)代碼塊以及修補代碼塊有較大可能性出現(xiàn)漏洞。另一方面,信息安全研究,完整而詳細(xì)的漏洞數(shù)據(jù)是非常珍貴的,可以研究從漏洞數(shù)據(jù)中提取模式,或者函數(shù)特征,對其它項目代碼進行審計。
需求:
1.提取漏洞修復(fù)相關(guān)的commit id
2.根據(jù)commit id獲取修改版本前后的相關(guān)文件
1.提取漏洞修復(fù)相關(guān)的commit id
提取方式,這里主要是對git log進行關(guān)鍵字分析,如CVE,fix,leak,overflow等關(guān)鍵字的匹配。獲取commit log的方式非常簡單,將clone過來的代碼包解壓后,一行命令即可:git log > m_log.txt
可以看到m_log.txt中日志的組織形式如下:
一般進行關(guān)鍵字匹配時,以一個commit為匹配單元,regex = 'commit [0-9a-f]{40}\nAuthor'就可以唯一標(biāo)識一個完整的commit日志。然后通過調(diào)整index獲取數(shù)據(jù)單元,盡量少用通配符匹配的原因在于通配符往往具有非常低的匹配效率。
為了使得數(shù)據(jù)更加完備,git log命令獲得的日志信息不包含分支的提交日志,可以通過查看github網(wǎng)站上一些對應(yīng)分支的commit id,將版本恢復(fù)到該commit id后,再通過git log來獲取所有該分支相關(guān)的日志。
2.根據(jù)commit id獲取修改版本前后的相關(guān)文件
這里主要的思路分為五個步驟:
1.git reset —hard commit_id
2.git log | head -n 20
3.git diff commit_id1 commit_id2 > diff.txt
4.cp changed_filename dst
5.git reset —hard commit_id2;cp before_filename dst
核心代碼如下:
代碼中的一個優(yōu)化部分,這里沒有對整個log進行匹配分析,是因為已經(jīng)獲得了commit id,那么為了獲取比對,知道修改的內(nèi)容,僅僅需要獲得當(dāng)前之前的一個commit id即可。因為不能判斷每一個commit有多大,這里通過動態(tài)調(diào)整LOG_HEAD變量大小,以處理20行日志沒有包括之前commit id的情況。