SDL探索之路
SDL路阻且艰,但是却是一条必走之路。
目前就职于一家甲方公司,平时的主要工作是做安全渗透,偶尔也会做一下代码审计。总的来说流程很固定,每天重复差不多同样的工作。时间长了,也慢慢在思考一些问题。作为安全人员如何才能实现最大的价值呢?黑盒测试或者说白盒测试,总的来说属于事后的安全测试。在这个时间段发现的问题,往往比较滞后,修复起来通常需要消耗较多的时间。举个简单的例子:比如菜单越权。这种问题如果在开发的时候没有考虑周全,则修复起来需要消耗大量的时间。那么面临这些问题,除了将安全向前延伸没有其他方法。安全向前延伸,则必定要谈起SDL建设。SDL是重要且意义重大的,只有将SDL全链打通才能更好的助力公司安全建设同时体现自己的价值。本文会浅谈一下SDL建设,重点会放在SDL建设中的静态扫描阶段和动态扫描阶段。
自2004年起,微软将SDL作为全公司的计划和强制政策,SDL的核心理念就是将安全考虑集成在软件开发的每一个阶段:需求分析、设计、编码、测试和维护。从需求、设计到发布产品的每一个阶段都增加了相应的安全活动,以减少软件中漏洞的数量并将安全缺陷降低到最小程度。图1所示为Microsoft 安全开发生命周期。

通过上图可以看到,微软大致将SDL分为以下几个阶段:培训阶段;需求阶段;设计阶段;实施阶段;验证阶段;发布阶段;相应阶段。可能各个公司根据情况不同会重新定义不同的阶段,但是大体上是一致的。这里认为,SDL大致可以分为以下阶段:

1. 培训阶段

培训基本上很多公司都会做,培训一般包括安全编码培训(包括C#/C++/JAVA,大公司一般很少用到PHP),常见各种安全漏洞的专项培训。
培训可以分为线上和线下,这两种结合起来是最好的。线上可以方便开发及时查看,线下可以针对性的做安全培训,这部分内容就不再做过多的介绍。
想说的是,这个阶段很有必要搭建一个安全知识库平台,放置各种培训手册和漏洞修复手册,从而方便开发人遇到问题及时查看解决。

2. 需求和设计阶段

在微软的SDL模型中是将需求和设计分开的,但是这里选择将两者合并。这个过程是比较复杂的地方。这个阶段限制因素较多。原因无外乎这两点:一是项目建设时间紧迫;二是投入的人力和结果不成正比,且往往需要消耗大量的时间。其实SDL建设往往就卡在这个地方,但是这个阶段往往又是不可忽略的部分。
在这个阶段需要提前考虑减少攻击面,深度防御,最小权限原则,安全默认设置等问题,这些问题同时也是贯穿整个开发周期。
在需求阶段,如果深入进去可能需要常常和开发部门开会了解需求,这样实行起来比较困难。那么这里可以选择构建需求裁剪表,让开发人员自己裁剪。由于这个过程不用深入“一线”,因此这里的裁剪表就需要尽可能的全面完善。同时需求裁剪表不可能尽善尽美,因为需求裁剪表更着重的是常见安全问题的一个说明提示,但是对于一些业务系统的逻辑安全问题是不涉及的,因此针对该问题是需要思考出一个高效可行的方法。有的公司可能会根据业务流程图进行安全标注,这是一种解决方案,但是问题也是很明显的,需要了解业务逻辑真正执行起来效率会比较低。因此这种方式可以作为备选,也可以只针对核心系统进行如此操作。
至于其它好的想法欢迎大佬交流。

3. 代码质量扫描阶段

实施阶段主要是做代码的质量扫描以及第三方组件库扫描。这个阶段目标是及时扫描排除不安全的编码规范问题,及时发现危险的第三方组件库漏洞问题,从而避免问题向下层扩展。这个阶段可以划分为静态扫描,针对这个阶段已经有很成熟的扫描机制。目前可以将jenkins,sonar,pclint,findbug,findsecbug,dependency进行集成,从而构建一个完整统一的平台,方便开发或者配管进行集成扫描。在介绍集成之前,先简要介绍一这些工具,
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
Sonar(SonarQube)是一个开源平台,用于管理源代码的质量,它不仅是一个质量数据报告工具,更是代码质量管理平台。它通过插件的形式来管理代码,它支持的语言包括:Java,PHP,C#,C等。
Pclint是一个C++/C代码质量扫描工具,其不仅能够对程序进行全局分析,识别没有被适当检验的数组下标,报告未被初始化的变量,警告使用空指针以及冗余的代码,还能够有效地帮你提出许多程序在空间利用、运行效率上的改进点。除此之外,CPPcheck工具也可以实现类似的扫描。
Findsecbug是一个java代码安全扫描工具。Dependency-check是一个第三方组件扫描工具。
Sonar可以集成pclint,findbug,dindsecbug,dependency-check工具,而Jenkins可以集成sonar从而实现对其自动化管理。因此,本文将主要从三个方面进行介绍,分别是: denpendency-check扫描;findsecbug扫描;pclint扫描。

3.1 工具集成

3.1.1 Jenkins集成sonar

(1) Jenkins安装
有两种方式可以实现Jenkins环境搭建。一种是直接去官网下载windows版安装包然后运行,输入密码进入。密码通常在以下目录存储:C:\Program Files (x86)\Jenkins\secrets\initialAdminPassword。
下载地址:http://mirrors.jenkins.io/war-stable/

除此之外还有一种方式,直接运行war包。war下载以后直接运行以下命令即可:
Java -jar jenkins.war --httpPort=8080 。
war包下载地址:http://mirrors.jenkins-ci.org/war/
(2) Sonar安装
通过sonar官网下载安装包。https://www.sonarqube.org/
下载完解压,然后进入bin目录可以看到以下内容,里面包含了各种环境下的安装程序。

配置数据库,在Conf目录下,sonar.properties文件,配置数据库信息。

运行判断是否安装成功。进入windows-x86-32.点击startSonar.运行

(3)Jenkins集成sonar
首先,需要在Jenkins中安装Sonar插件。进入Manage Jenkins>Plugin Manager,搜索sonar,然后选择SonarQube Scanner插件。

安装完成以后选择Manage Jenkins>Configure system>SonarQube servers,配置sonar信息。

进入Manage Jenkins>Global Tool Configuration配置sonarscanner信息。

至此,已完整将sonar集成到Jenkins。

3.1.2 Sonar集成pclint

(1)pclint安装
下载完解压以后打开可以看到以下列表,进入Pc-lint9.0目录- pclint9setup.exe,运行程序,选择要安装的地址,然后其他一路默认即可。

安装完以后,自动进入pclint配置目录。具体配置升级请参考以下链接,按照步骤操作即可:http://www.opdown.com/soft/69530.html。

需要说明的是pclint配置其实就是配置std.lnt,里面主要配置系统函数库地址,要忽略的安全点等。提到函数库就必然会想到windows和linux。针对环境下开发的程序需要配置不同的地址。Windwos相对容易配置,linux相对麻烦点。

3.1.3 Sonar集成dependency-check

(1)dependency-check环境搭建
在OWASP官网下载dependency-check程序以及对应的sonar插件。Denpendency-check工具下载地址:https://www.owasp.org/index.php/OWASP_Dependency_Check。
(2) jenkins和sonar集成
集成还需要下载一个插件sonar-dependency-check-plugin。Dependecny负责扫描第三方jar包,而对应的sonar-dependency-check-plugin插件用来进行扫描结果展示。
Sonar插件下载地址:https://github.com/dependency-check/dependency-check-sonar-plugin,将下载完的插件放入sonar的extensions->plugins目录。

至此已经成功的完成了dependency-check的集成搭建工作。

3.1.4 Sonar集成findbugs

Findbugs是一个扫描java质量的工具,在使用之前需要先下载findbugs插件,然后放入sonar的extensions->plugins目录。

3.2 工具扫描

工具集成完毕,接下来就是扫描。扫描将按照以下几步介绍,

3.2.1 pclint扫描

(1).新建item
新建item-配置,并设置工作目录
(2).构建windows批处理命令
点击构建-execute windows batch command,执行批处理命令。这里的目的是为了使用调用pclint工具进行项目源代码扫描。如果代码层次较多请参考PClint扫描指南。
Lint-nt -i"e:\pclint\lint" –u std.lnt env-vc10.lnt -v -width(0,0) +xml(results) -"format=<issue file =\q%%f\q line = \q%%l\q number = \q%%n\q desc = \q%%m\q/>" -"format_specific= " -hFs1 -e900 .cpp>Pclint_report.xml
如果是写批处理文件,需要使用如下方式:
Lint-nt -i"e:\pclint\lint" –u std.lnt env-vc10.lnt -v -width(0,0^) +xml(results^) -"format=<issue file =\q%%f\q line = \q%%l\q number = \q%%n\q desc = \q%%m\q/>" -"format_specific= " -hFs1 -e900
.cpp>Pclint_report.xml
(3).构建sonar扫描
配置analysis properties
sonar.projectKey=sectest //该参数获取参考2.1
sonar.projectName=sectest //该参数获取参考2.1
sonar.projectVersion=2.0
sonar.sources=.
sonar.language=c++
sonar.cxx.pclint.reportPath= Pclint_report.xml
(4).运行(build now)
3.2.2 dependency-check扫描
(1).新建item
创建新的项目。

图2 jenkins新建项目
(2).点击项目-进入配置页面:设置工作目录

(3).构建
在构建中选择dependency-check扫描,参数里面添加以下选项,如果没有设置系统将采用默认参数配置。


需要说明:这里面需要设置导出为xml,因为下一步sonar扫描是基于xml进行的。
(4).添加sonar扫描构建
在analysis properties中填写以下信息
sonar.projectKey=denpendencyy //sonar中创建的项目
sonar.projectName=denpendencyy //sonar中创建的项目
sonar.projectVersion=2.0
sonar.sources=.
sonar.dependencyCheck.reportPath=dependency-check-report.xml
Projectkey和projectname获取参考下图:当创建完项目以后,点击配置-项目找到自己创建的项目信息。

构建中填上属性信息:projectkey和projectName是在sonar中,其他的不变。如图7所示为sonar扫描的配置内容。

(5).build
点击build now运行项目,如图8所示。

运行完以后点击sonarqube,直接进入sonar看到扫描结果,如图9所示。

3.2.3 findbugs扫描

Findbus扫描很简单,这个不需要做过多介绍。下载sonar运行以后,其会给出使用介绍。

4.安全扫描阶段

安全扫描阶段对应就是图1中的验证阶段。安全扫描大致可以分为以下几个过程,源代码扫描,黑盒扫描,渗透测试等环节。源代码和黑盒扫描主要是借助工具进行自动扫描,当然在黑盒扫描的时候可能也会用到半自动扫描,所谓半自动就是被动扫描。被动扫描的好处就是可以抓取尽可能多的数据包,避免了主动扫描触及不到的地方。接下来,会详细介绍各个阶段涉及到的一些工具。

4.1 源代码动态扫描

源代码动态扫描目前国内比较好的是fortify。Fortify SCA是一个静态的、白盒的软件源代码安全测试工具。它通过内置的五大主要分析引擎:数据流、语义、结构、控制流、配置流等对应用软件的源代码进行静态分析,分析的过程中与它特有的软件安全漏洞规则进行全面地匹配、查找,从而将源代码中存在的安全漏洞扫描出来,并给于整理报告。目前位置,fortify支持多种语言扫描,包括主流的java,C/C++等。
还有其它的一些源码安全扫描工具,比如CoBOT等。还有一些开源的PHP和java扫描工具,感兴趣的可以搜索了解一下。

4.2 黑盒扫描

黑盒扫描工具挺多的,这里按照产品类型介绍。通常产品类型可以化分为web,Android,PC。
针对web的有awvs,appscan,绿盟WVSS扫描器,默安的雳鉴等;
针对Android的有梆梆扫描,360app漏洞扫描等其他工具,同时还有一个开源的android安全扫描工具MOBSF,该工具是基于Django开发的web扫描工具,功能还是很强大的。
针对PC,目前貌似没有听说有专门漏洞扫描工具,但是可以做一个PC漏洞检测集成平台,将各种单一扫描工具集成到统一平台从而搭建自动扫描工具。PC端有时候会面临病毒的威胁,比如程序会被杀毒软件直接杀死。针对该问题由于单个公司是不可能分析维护庞大的病毒库的,因此该工作可以依赖第三方安全公司来做。
Web扫描工具大部分是收费的,但是有部分是可以使用破解版的,具体请自行下载使用。除此之外,还有各种扫描敏感文件,端口漏洞,常见系统漏洞的扫描器,这些也是可以结合起来使用。这种扫描器在Github上能找到,因此这里也就不再详细介绍,感兴趣的可以去搜索以下。

4.3 渗透测试

渗透测试阶段,这个应该做的比较多,大家也都比较熟悉。这个阶段主要是渗透人员,对各个功能进行测试,找到安全问题并记录。同时想说的是,这个阶段测试是肯定需要手动完成的,但是问题的记录和后续跟踪需要平台支撑,这样即方便记录同时也方便后续的查看追踪,数据统计等工作。
渗透测试阶段主要检测以下问题,这里就不再一一列举,直接使用其他人分享的图片作为展示。

5.后监控阶段

产品上线以后,还需要不断跟进。因为当前众多产品都是基于开源组件或者是公司通用组件,这些开源组件或者通用组件的安全问题可能是不断更新的,因此有必要及时监控,预警,跟进。这个阶段需要有一个平台能及时追踪最新预警信息,同时要能根据预警信息快速定位相关产品,通知相关产品负责人及时升级修复问题。同时要有负责人反馈机制,以便后续的责任定位。


除此之外,还要及时监控敏感信息泄露的问题。Github是一个开发者广泛使用的平台,众多人员可能不经意间将公司敏感数据上传,因此有必要使用工具及时监控Github。这样的工具也很多,有收费的有不收费的。公司安全团队可以自行评估选择哪种方式,当然有条件的可以自己研发监控工具。

6 总结

安全需要将上述的多个环节打通,同时能自动化运行的要尽量自动化,减少人为的参与。能集成到一个平台尽量集成到一个平台方便管理。整个环节环环相扣,又不断补充,相信这样会对整个公司的安全产生重要影响。
最后,上述提到的内容可能不全,有些可能在实际工作中还需要继续视情况具体修复补充。当然也可能写的有不对的地方,欢迎大神指教。

点击收藏 | 1 关注 | 1
登录 后跟帖