前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用Cobra实现自动化代码审计的经验分享

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

作者头像
FB客服
发布2019-07-09 15:13:22
1.8K0
发布2019-07-09 15:13:22
举报
文章被收录于专栏:FreeBuf

前言

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

一、背景

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

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

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

二、需求分析

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

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

代码语言:javascript
复制
python cobra.py -t code_path -o report_format -o email_addr

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

三、实现方法

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

上图各目录作用如下:

FTP目录:用于接收Jekins服务器传输过来的未编译的上线源码压缩包。

Cobra目录:Cobra工具的代码目录。

SVN目录:用于存放及上传Cobra输出的代码审计报告。

调度脚本的主要函数介绍如下:

代码语言:javascript
复制
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函数统计这几个字符就可以实现风险数量统计,代码如下:

代码语言:javascript
复制
 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即可。

代码语言:javascript
复制
# 匹配邮箱地址    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三个变量值,下面分享一下生成邮件内容的代码。

改动前内容:

代码语言:javascript
复制
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'))

改动后内容:

代码语言:javascript
复制
 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工具有兴趣的大佬们可以点击底部阅读原文下载。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、背景
  • 二、需求分析
  • 三、实现方法
    • 4.2 报告文件名改为上线源码包名
      • 4.3 邮件内容加入SVN地址及风险数量
      • 5.总结
      相关产品与服务
      代码审计
      代码审计(Code Audit,CA)提供通过自动化分析工具和人工审查的组合审计方式,对程序源代码逐条进行检查、分析,发现其中的错误信息、安全隐患和规范性缺陷问题,以及由这些问题引发的安全漏洞,提供代码修订措施和建议。支持脚本类语言源码以及有内存控制类源码。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档