利用Cobra实现自动化代码审计的经验分享

2019 年 7 月 2 日 FreeBuf

前言

本文介绍了笔者通过一个简单的方法利用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原始发送过来的邮件内容比较单一,我根据自己的需求改动了一下它的代码,主要改动了 ./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输出的审计结果内容。

4.2 报告文件名改为上线源码包名

这里比较简单,直接将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)

4.3 邮件内容加入SVN地址及风险数量

审计报告的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行调用执行发送。

5.总结

本文分享了笔者是如(gong)何(si)低(mei)成(you)本(qian)利用一个简单python调度脚本搭建基于Cobra的自动化代码审计平台的经验,感谢Cobra团队。第一次发贴,希望各位大佬轻点喷。

Cobra工具有兴趣的大佬们可以点击底部阅读原文下载

*本文作者:biubiugo,本文属 FreeBuf 原创奖励计划,未经许可禁止转载

精彩推荐


登录查看更多
2

相关内容

Subversion(SVN)是一个开放源代码的版本控制系统。
【2020新书】实战R语言4,323页pdf
专知会员服务
98+阅读 · 2020年7月1日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
160+阅读 · 2020年5月14日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
115+阅读 · 2020年5月10日
【2020新书】如何认真写好的代码和软件,318页pdf
专知会员服务
63+阅读 · 2020年3月26日
《深度学习》圣经花书的数学推导、原理与Python代码实现
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
83+阅读 · 2019年11月25日
一文看懂怎么用 Python 做数据分析
大数据技术
23+阅读 · 2019年5月5日
防代码泄漏的监控系统架构与实践
FreeBuf
5+阅读 · 2019年4月30日
如何用GitLab本地私有化部署代码库?
Python程序员
9+阅读 · 2018年12月29日
实战 | 40行代码实现人脸识别
七月在线实验室
3+阅读 · 2018年3月7日
如何运用Python建一个聊天机器人?
七月在线实验室
17+阅读 · 2018年1月23日
Conditional BERT Contextual Augmentation
Arxiv
8+阅读 · 2018年12月17日
Arxiv
3+阅读 · 2018年11月14日
Arxiv
3+阅读 · 2018年6月1日
Arxiv
4+阅读 · 2018年1月29日
Arxiv
3+阅读 · 2012年11月20日
VIP会员
相关VIP内容
【2020新书】实战R语言4,323页pdf
专知会员服务
98+阅读 · 2020年7月1日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
160+阅读 · 2020年5月14日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
115+阅读 · 2020年5月10日
【2020新书】如何认真写好的代码和软件,318页pdf
专知会员服务
63+阅读 · 2020年3月26日
《深度学习》圣经花书的数学推导、原理与Python代码实现
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
83+阅读 · 2019年11月25日
相关资讯
一文看懂怎么用 Python 做数据分析
大数据技术
23+阅读 · 2019年5月5日
防代码泄漏的监控系统架构与实践
FreeBuf
5+阅读 · 2019年4月30日
如何用GitLab本地私有化部署代码库?
Python程序员
9+阅读 · 2018年12月29日
实战 | 40行代码实现人脸识别
七月在线实验室
3+阅读 · 2018年3月7日
如何运用Python建一个聊天机器人?
七月在线实验室
17+阅读 · 2018年1月23日
Top
微信扫码咨询专知VIP会员