本文介绍了笔者通过一个简单的方法利用Cobra工具来实现自动化代码审计的经验,以及对Cobra工具代码的一些定制改动。
笔者在某甲方运维部负责信息安全,代码审计已经加入到上线流程里面,在没有引入Cobra之前用的是绿色版FortifySCA。公司是Java开发环境,每次上线前都需要开发人员单独把未编译的上线源码打包发送给我,手动执行审计任务,输出报告,上传SVN等一系列操作。
原先的上线源码审计流程如下图:
这样的弊端一是源码传输方式不可控,二是手动执行审计任务太繁琐,所以开始寻找实现自动化审计的方法。因为公司预算吃(mei)紧(qian),只能从开源工具上入手。
前面有戳进传送地址的大佬们应该已经知道了Cobra的大概情况,它是python写的,支持扫描文件夹、压缩包、Github,支持多种报告格式输出及邮件发送等等。我这里需要实现的是上线源码自动采集、审计任务自动执行及审计报告自动发送邮件及上传SVN。
Cobra的基础执行命令是这样的:
python cobra.py -t code_path -o report_format -o email_addr
上线源码的自动采集已经在Jekins上实现了,配置管理员将上线源码编译打包后,会同时将未编译的上线源码压缩包通过FTP传输到我的Cobra服务器。因此,现在需要考虑的就是如何自动对这些传输过来的源码执行审计任务。
我通过一个简单的python脚本实现了以上的需求,这里把这个脚本称作调度脚本吧,整个自动化项目的结构和逻辑如下:
上图各目录作用如下:
FTP目录:用于接收Jekins服务器传输过来的未编译的上线源码压缩包。
Cobra目录:Cobra工具的代码目录。
SVN目录:用于存放及上传Cobra输出的代码审计报告。
调度脚本的主要函数介绍如下:
1.mkdir():在SVN目录中根据当前日期安装年月日分级建立目录并同步到SVN,方便后续上传审计报告。
2.code_detect():通过循环执行listdir函数,检测FTP目录下是否存在上线源码压缩包。
3.code_scan():步骤2中检测到源码包后逐个执行Cobra工具的审计命令:python cobra.py -t code_path -o report_format -o email_addr,任务结束后删除源码包,将报告输出到SVN目录。
4.code2svn():将步骤3中输出的报告上传到SVN服务器。
通过这个调度脚本,原先的上线审计流程就完全实现自动化了,我只需要在收到审计报告后查看一下结果,自动化后流程图如下:
由于Cobra原始发送过来的邮件内容比较单一,我根据自己的需求改动了一下它的代码,主要改动了 ./cobra/engine.py、./cobra/send_mail.py和./cobra/cli.py三个文件的内容,改动前后的邮件内容对比如下:
主要改动的内容如下:
1.Cobra审计结果加入风险数量统计
2.报告文件名改为上线源码包名
3.邮件内容加入SVN地址和风险数量统计
4.1 Cobra审计结果加入风险数量统计
该功能改动的是engine.py,Cobra审计结果的Level字段通过H-xx、M-xx和L-xx(xx为数字)来标记高中低三个等级的风险,因此利用count函数统计这几个字符就可以实现风险数量统计,代码如下:
global h_c
global m_c
global l_c
h_c = str(statis.count('H-'))
m_c = str(statis.count('M-'))
l_c = str(statis.count('L-'))
logger.info('[STATIS] High level count: ' + h_c + ' Middle level count: ' + m_c + ' Low level count: ' + l_c)
这里通过global定义全局变量的原因是方便send_mail功能调用这个变量,从而实现在邮件内容中显示统计数量,而statis是cobra输出的审计结果内容。
这里比较简单,直接将cli.py第122行在生成附件名称(attachment_name)时,将本来的随机数s_sid改为源码包名target即可。
# 匹配邮箱地址
if re.match(r'^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,4}$', output):
# 生成邮件附件
attachment_name = [target] + '.' + formatter
write_to_file(target=target, sid=s_sid, output_format=formatter, filename=attachment_name)
# 发送邮件
send_mail(target=target, filename=attachment_name, receiver=output)
审计报告的SVN地址在调度脚本执行上传SVN操作的时候已经生成,但是为了避免跨目录跨模块传输变量值的麻烦,我直接在send_mail.py文件里面重新生成了SVN地址风险数量则是调用engine.py中的h_c、m_c和l_c三个变量值,下面分享一下生成邮件内容的代码。
改动前内容:
s_sid = filename.split('.')[0]
msg = MIMEMultipart()
msg['From'] = sender
msg['To'] = receiver
msg['Subject'] = '编号 {sid} 项目 Cobra 扫描报告'.format(sid=s_sid)
msg.attach(MIMEText('扫描项目:{t}\n报告见附件'.format(t=target), 'plain', 'utf-8'))
改动后内容:
s_sid = filename.split('.')[0]
msg = MIMEMultipart()
msg['From'] = sender
msg['To'] = receiver
msg['Subject'] = '{t}代码审计报告'.format(t=target[22:])
if exists(filename):
msg.attach(MIMEText('扫描项目:{t}\n\nSvn地址:\n{s}\n\n风险数量统计:\n高危:{h}\n中危:{m}\n低危:{l}\n\n报告见附件'.format(t=target[22:],s=reurl,h=eg.h_c,m=eg.m_c,l=eg.l_c), 'plain', 'utf-8'))
邮件内容在这里生成之后,由cli.py第126行调用执行发送。
本文分享了笔者是如(gong)何(si)低(mei)成(you)本(qian)利用一个简单python调度脚本搭建基于Cobra的自动化代码审计平台的经验,感谢Cobra团队。第一次发贴,希望各位大佬轻点喷。
Cobra工具有兴趣的大佬们可以点击底部阅读原文下载。
*本文作者:biubiugo,本文属 FreeBuf 原创奖励计划,未经许可禁止转载
精彩推荐