openssl项目的提交日志含有非常重要的信息,比如漏洞的发现和修复情况,而根据经验,一个漏洞的发现,其相关代码块以及修补代码块有较大可能性出现漏洞。另一方面,信息安全研究,完整而详细的漏洞数据是非常珍贵的,可以研究从漏洞数据中提取模式,或者函数特征,对其它项目代码进行审计。
需求:
1.提取漏洞修复相关的commit id
2.根据commit id获取修改版本前后的相关文件
1.提取漏洞修复相关的commit id
提取方式,这里主要是对git log进行关键字分析,如CVE,fix,leak,overflow等关键字的匹配。获取commit log的方式非常简单,将clone过来的代码包解压后,一行命令即可:git log > m_log.txt
可以看到m_log.txt中日志的组织形式如下:
一般进行关键字匹配时,以一个commit为匹配单元,regex = 'commit [0-9a-f]{40}\nAuthor'就可以唯一标识一个完整的commit日志。然后通过调整index获取数据单元,尽量少用通配符匹配的原因在于通配符往往具有非常低的匹配效率。
为了使得数据更加完备,git log命令获得的日志信息不包含分支的提交日志,可以通过查看github网站上一些对应分支的commit id,将版本恢复到该commit id后,再通过git log来获取所有该分支相关的日志。
2.根据commit id获取修改版本前后的相关文件
这里主要的思路分为五个步骤:
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
核心代码如下:
代码中的一个优化部分,这里没有对整个log进行匹配分析,是因为已经获得了commit id,那么为了获取比对,知道修改的内容,仅仅需要获得当前之前的一个commit id即可。因为不能判断每一个commit有多大,这里通过动态调整LOG_HEAD变量大小,以处理20行日志没有包括之前commit id的情况。
网友评论