利用Cobra实现自动化代码审计的经验分享 – 作者:biubiugo

前言

本文介绍了笔者通过一个简单的方法利用Cobra工具来实现自动化代码审计的经验,以及对Cobra工具代码的一些定制改动。

Cobra工具不多作介绍,有兴趣的大佬们自行传送:Git地址

一、背景

笔者在某甲方运维部负责信息安全,代码审计已经加入到上线流程里面,在没有引入Cobra之前用的是绿色版FortifySCA。公司是Java开发环境,每次上线前都需要开发人员单独把未编译的上线源码打包发送给我,手动执行审计任务,输出报告,上传SVN等一系列操作。

原先的上线源码审计流程如下图:

2.png

这样的弊端一是源码传输方式不可控,二是手动执行审计任务太繁琐,所以开始寻找实现自动化审计的方法。因为公司预算吃(mei)紧(qian),只能从开源工具上入手。

二、需求分析

前面有戳进传送地址的大佬们应该已经知道了Cobra的大概情况,它是python写的,支持扫描文件夹、压缩包、Github,支持多种报告格式输出及邮件发送等等。我这里需要实现的是上线源码自动采集、审计任务自动执行及审计报告自动发送邮件及上传SVN。

Cobra的基础执行命令是这样的:

python cobra.py -t code_path -o report_format -o email_addr

上线源码的自动采集已经在Jekins上实现了,配置管理员将上线源码编译打包后,会同时将未编译的上线源码压缩包通过FTP传输到我的Cobra服务器。因此,现在需要考虑的就是如何自动对这些传输过来的源码执行审计任务。

三、实现方法

我通过一个简单的python脚本实现了以上的需求,这里把这个脚本称作调度脚本吧,整个自动化项目的结构和逻辑如下:

4.png

上图各目录作用如下:

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服务器。

通过这个调度脚本,原先的上线审计流程就完全实现自动化了,我只需要在收到审计报告后查看一下结果,自动化后流程图如下:

1.png四、定制Cobra

由于Cobra原始发送过来的邮件内容比较单一,我根据自己的需求改动了一下它的代码,主要改动了./cobra/engine.py、./cobra/send_mail.py和./cobra/cli.py三个文件的内容,改动前后的邮件内容对比如下:

3.png5.png 主要改动的内容如下:

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 原创奖励计划,未经许可禁止转载。

来源:freebuf.com 2019-07-02 10:10:05 by: biubiugo

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论