• BiaoDoo首页
  • 自主产品
       自主产品
       测试工具
       源码安全/质量测试云平台
       测试用例开发工具
       软件测试态势分析平台
       开源软件安全审计系统
       软件造价
       软件造价概算平台
       运维产品
       应用源码监测系统
       教学实训平台
       软件测试实验室平台
  • Micro Focus产品代理
       Micro Focus产品代理
       Fortify SCA
       Webinspect
       LoadRunner
       ALM/QualityCenter
       MF UFT
       MF Mobile Center
       Diagnostics
  • 其它产品
       其它产品
       AppScan(IBM)
       Klockwork Insight
       Coverity静态分析
       Black Duck--黑鸭软件成分分析
  • 安全产品
       安全产品
       U盾
  • 工程咨询
       工程咨询
       IT规划咨询
       软件造价概算
       软件架构评估
       信息工程监理
       测试体系咨询
  • 软件测试
       软件测试
       工程验收测试
       压力测试与优化
       产品认证测试
       专题测试
       医疗设备软件测试
       摇号软件测试
       科研项目验收
       软件故障诊断
       委托客制测试
       软件登记测试
       科技成果鉴定
       国产软件适配测试
  • 安全测试
       安全测试
       软件安全测试
       源码安全测试
       等级保护测评
       渗透测试
       风险评估
  • 企业服务
       企业服务
       系统保障与救援
       大数据服务
       ICP证书办理
       软件著作权
       首版次申报
  • 教育培训
       教育培训
       ISTQB认证
       软件产品检验员
       软件就业培训
       校企合作
       信息安全培训
  • 认证中心
       认证中心
       软件企业认证
       质量安全体系认证
       高新技术企业认证
       企业能力认证
       节能与绿色评价服务
       其它系统认证
  • 资讯中心
       资讯中心
       最新资讯
       政策法规
       技术方案
  • 开源测试 · 青云渡
       开源测试 · 青云渡
       技术文摘
       BiaoDoo开源
       常用工具
  • 全国网络
       全国网络
  • BiaoDoo
       BiaoDoo
       软件管控领导者
       合作伙伴
       FAQ
       加入我们
       招聘信息
       合作加盟
       联系我们
  • 测试外包
       测试外包
       离岸测试外包
       测试人才外协
  • 代码审计工具 Cobra 源码分析

    0x00 前言

    @0r3ak 师傅向我推荐了一款代码审计工具Cobra(wufeifei/cobra),该工具基于Python开发,可以针对多种语言的源代码安全性评估。

    在测试的过程中,总是不得要领,有一些问题不知道怎么解决,都是又很想了解下这款项目的实现原理。

    在这一系列的笔记中,将会记录下对 Cobra 的使用体验,以及源码级的分析。

    0x01 基础环境

    Ubuntu 16.04.3 LTS

    Python 2.7.12

    Cobra 2.0.0-alpha.5

    pdb

    0x02 执行流程&关键代码分析

    关于 Cobra 的安装,与基本的使用方法在 Cobra 的文档中说的很详细了。我这里就不在赘述。不了解的同学可以在本文的参考链接中获取 Cobra 的文档。

    这篇笔记主要记录下,CLI模式下,对某一个文件中代码做安全审计的过程中,相关的函数调用栈,及关键函数的原理分析。其间会通过pdb动态调试结合静态代码分析以及项目的文档,辅助对整个项目的理解。(关于pdb的使用方法可以参考:Flask debug 模式 PIN 码生成机制安全性研究笔记

    第1步:在cobra.py文件中sys.exit(main())语句前下断点

    第2步:执行如下代码(具体的功能为:审计XXX目录下的代码)

    Default

    1

    python cobra.py -t /home/tonghua/XXX

    步入到main()函数中

    main()中的代码主要功能是,获取当前命令行敲的命令,并做相应的处理。

    通过第18行可知,main()函数在\cobra\__init__.py文件中定义,我们步入到main()函数的定义位置。

    第55行args = parser.parse_args(),args变量包含着需要用到的各个变量的值。

    由代码可知,debug模式将会执行57行的if逻辑,通过logger记录debug日志,61行的if判断是打印帮助信息,65行的if逻辑是启动RESTful服务。

    当然由于我们只执行了-t参数,所以以上if判断均不会进入,直接logger.debug(‘[INIT] start scanning…’)后,继续向下执行。

    第68-84行,即为该程序进行代码审计的关键代码。

    get_sid()函数(\cobra-master\cobra\cli.py 第28-38行),拼接字符串’a+项目文件夹md5的前5位+一个随机字符串’,其功能想必应该是区分不同的扫描项目。

    第78行,Running(a_sid).status(data),实例化Running类(调用其__init__()构造方法),然后调用该对象的status()方法。其会向指定的临时文件中写入当前的审计状态。

    第82行,调用cli.start()函数,开始扫描,步入到该函数的具体实现代码(\cobra-master\cobra\cli.py 第41-122行)。

    来到cli.start()函数中,第52-67行,实现了对变量初始化赋值、logger记录扫描报告的URL、确认目标模式(文件夹、还是Git文件等),输出方式。

    第70-75行,明确文件夹路径,确认每一个需要扫描的文件位置,统计文件数量

    其中对文件夹下的内容进行遍历和统计的功能,主要由\cobra-master\cobra\pickup.py中的Directory()类实现。为了先大体了解下整体的执行流程,这块具体实现细节先不分析。

    第78-88行,通过Detection()类中的功能实现对开发语言、开发框架的检测(检测规则后续还可以自行增加)。这里用到了Python的@property语法糖,可以将类中的方法已变量的形式进行调用。

    步入scan()函数,顾名思义这里实现了扫描功能。

    第153行创建了Rule()实例,接下来几行,对漏洞类型、开发语言、扫描规则等进行定义

    第160行,通过scan_cve()函数进行CVE漏洞扫描,步入到该函数(cobra-master\cobra\cve.py 第332-361行)中,查看其实现方式。

    第348-350行的for循环中,会对【漏洞规则】目录下的,漏洞文件进行遍历,其中【CVI-999】开头的文件为CVE漏洞检测文件,遍历出所有的CVE漏洞文件。

    第354行,pool = multiprocessing.Pool(),搞了一个进程池,之后循环遍历所有的CVE漏洞文件,在第358行进行漏洞扫描,pool.apply_async(scan_single, args=(target_directory, cve_path), callback=store),调用scan_single()漏扫函数,扫描完成后回调到store()函数中。

    第372行,漏扫函数scan_single()的调用链:scan_single()->cve.scan_cve(),cve.get_scan_result()

    这里有一个坑点就是,文件中的scan_cve()函数和CveParse类中的scan_cve()方法同名,导致刚刚跟丢了,2333

    分析下cve.scan_cve()方法(第214-225行)

    今天就先到这里,剩下的内容明天再更新。

    0x03 程序执行链

    今天的分析先到这里,脑阔疼。

    梳理下截至目前的函数调用链:

    \cobra.py line 22 main()

    –>\cobra\__init__.py line 82 cli.start() and line 78 Running()

    —->\cobra\cli.py line 91 scan()

    ——>\cobra\engine.py line 160 scan_cve()

    ——–>\cobra\cve.py line 358 pool.apply_async(scan_single, args=(target_directory, cve_path), callback=store)

    ———> \cobra\cve.py line 371 cve.scan_cve()

    pause!!!

    另外,Cobra好多文件、类中都采用相同的方法名,翻起来好费劲啊!!!

    0x04 后记

    希望我可以尽快熟悉这套项目的代码,做一些二次开发、增加漏洞规则的事。同时也期待有一天我可以参与到这个开源项目中来,贡献力量。

    暂且不论该工具的漏报、误报情况,因为自动化的代码审计,文件与文件之间的关系、函数与函数之间的调用关系、Web框架提供的操作接口、如何确定URL路由以及不同漏洞类型的检测规则,本来就是一件难度很大的事。漏报、误报在所难免,光是这种分享精神就让我很敬佩了,再次要感谢下该开源项目的作者,让像我一样的菜鸟有一个学习的方向。也要感谢那些帮助我的师傅们,是你们不断的指导着我成长。


    上一篇:无

    下一篇:业界代码安全分析软件介绍