35

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

 5 years ago
source link: https://www.tuicool.com/articles/bYfEruy
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

前言

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

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

一、背景

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

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

eAvqqqv.jpg!web

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

二、需求分析

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

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

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

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

三、实现方法

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

yUfYzuV.jpg!web

上图各目录作用如下:

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

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

rQfeIbq.jpg!web 四、定制Cobra

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

qYriiqF.jpg!webzaYbIbn.jpg!web 主要改动的内容如下:

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK