APP下载
报价宝  ›  科技  › 

利用Cobra实现自动化程式码审计的经验分享_上线

报价宝 来源:baojiabao.com 发布时间:2019-07-02 09:50:00 09月16日更新
报价宝综合消息利用Cobra实现自动化程式码审计的经验分享_上线

前言

本文介绍了笔者通过一个简单的方法利用Cobra工具来实现自动化程式码审计的经验,以及对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团队。第一次发贴,希望各位大佬轻点喷。

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

文章标签: 报价宝 降噪耳机价格 耳机价格 红米手机价格 华为手机价格 小米手机价格 电视机价格 笔记本电脑价格 笔记本价格 汽车价格 报价宝 汽车价格 笔记本价格 小米手机价格 降噪耳机价格