代码安全扫描扫描应该怎么操作呢?

源代码安全扫描安全检测是安全開发流程(SDL)中举足轻重的一部分一般通过人工审计或者自动化工具来进行检测。在大型企业中业务线情况较为复杂,项目开发往往使用不同的编程语言、开发框架编码风格也大不相同。此外存量的代码安全扫描有上亿行、每天又会有大量的新增代码安全扫描与项目,这些因素导致在大型企业安全实践中是无法通过人工审计代码安全扫描的方式来进行检测的因此,在人力紧张以及工作量庞大的情況下最优的选择是依赖自动化检测工具了

本篇文章中主要介绍我们自主研发的静态代码安全扫描安全检测平台的整体技术原理、研發部署方案与架构、总体检出效果,以及一些具体生产环境的检出场景

),作为PHP语言的语法分析工具其本身就是使用PHP语言进行实现的,且支持节点遍历等功能使用composer可以很方便地***PHP-Parser

具体使用可以参考官方文档。

      仅仅在抽象语法树的基础上进行分析是不够的因为抽潒语法树无法很好的获取程序中流程控制语句的信息。比如分析以下示例代码安全扫描时如果不考虑程序中的分支判断,则很容易发生誤判:

  当分析到程序调用了eval函数则向上回溯$data变量,结果发现在else分支中调用了intval如果不考虑控制流程,即不考虑其他的代码安全扫描分支这时审计程序就会认为该代码安全扫描片段不存在问题直接返回,显然这是错误因为在if分支中,出现了另外的赋值如果只进入这个if汾支,那么就会触发代码安全扫描注入漏洞

       因此我们需要在抽象语法树的基础上构建控制流程图,将PHP中的分支跳转进行整理以基本块嘚形式编排抽象语法树的节点。比如针对上文的代码安全扫描片段生成控制流图:

在程序分析的时候必须要对每个分支进行独立的分析。

生成控制流图的方法是当遇到条件分支和循环结构时需要生成一个新的基本块,将这些代码安全扫描块中的语法树节点插入进去;当遇到终止结构时停止当前基本块的生成;当遇到返回语句时,停止图的构建

      在任何代码安全扫描中,都会有PHP内置函数的调用如果不對这些内置函数进行处理,或者说自动化分析不“理解”这些函数的含义和效果可能会造成大量的误报,比如分析下面的代码安全扫描爿段:

由于PHP内置函数众多每个函数都人工进行处理是不现实的,最好的方式是对这些内置函数进行分类按照功能和对程序分析的影响,大致可分为:

比如strlen()或者md5()一旦参数进入这些内置函数将会返回常量类型的结

果,比如返回纯数字、布尔值、纯字符串这种处理需要考慮为针对参数的一种净化方法。

(2)返回参数的一部分

某些内置函数如trim() 或者 array_keys() 会将参数的一部分或者全部进行返回针对返回值,该分类可鉯分为返回array、返回array的单个元素、返回string类型

针对某种漏洞类型进行参数净化操作的内置函数,比较典型的有addslashes

比如内置函数substr()或者chunk_split(),这些内置函数会返回传入参数的一个子串由于这种操作会破坏参数原有的结构,如果不追求绝对精确分析的话实际上完全可以将这类函数的調用视为某种程度的净化处理。

urldecode()或者base64_decode()等执行某种解码操作的内置函数注意,如果在分析中遇到了解码函数通常认为该函数调用前参數所受到的一切净化都是无效的,如果直接进入危险函数就会触发漏洞

一些内置函数会执行参数指定的其他函数,比如array_walk(),array_map(), set_error_handler()如果标识其他函数名的参数可以直接获取到,那么将该调用信息进行进一步分析比如以下代码安全扫描片段:

第五行代码安全扫描调用了array_map函数,并且数組中每个元素都进行了intval从操作因此需要收集这里的一个净化信息,为后续污点分析提供依据

(7) 获取文件句柄

一些文件操作类型的危險函数的文件参数是以resource传递进来的,因此如果仅仅去判断是否受污染是不可行的所以需要对获取文件句柄的函数进行分类。

一种基于白洺单的净化处理

比如preg_matchereg函数,这里不可能去分析具体的正则表达式因此

为了减少误报,可以认为调用这些函数进行校验都是有效的过濾当然如果选择牺牲误报而减少漏报,也可以认为这些函数的调用是不起作用的可以直接报警。

      其他不属于上述类别但是需要额外分析的内置函数

数据流分析层所做的工作是收集程序中的变量值传递、特殊函数调用等信息。可以理解为数据流分析就是一个综合的程序信息搜集目的是为了给后续的污点分析提供详细的参考信息。

对于数据流向的识别和搜集应该考虑到以下两种情况:

  • PHP内置函数导致的隱藏数据流,比如调用listfunc_get_args等函数

执行分析的流程图如下:

污点分析过程是在程序分析中,一旦发现危险函数的调用则启动分析对传入危险函数的危险参数进行分析,结合数据流分析时该危险参数的一些程序信息如净化信息、内置函数处理信息等进行判断,如果一旦发現该变量可以被用户控制并且没有进行有效过滤则判定为漏洞。

eval等等然后我们会找到这些函数的某些参数,然后判断这些参数是否经過程序处理后还是会存在漏洞因此,污点分析时只需要关注危险函数的名称和危险参数的位置即可,配置示例如下:

该配置的含义是:print函数是一个可能引发XSS漏洞的危险函数并且其参数1是一个危险参数。

       定义一个参数是否受到了有效净化是污点分析中比较重要的环节這关系到后续漏洞判定的准确性。根据人工代码安全扫描审计的经验我们可以抽象总结出一个PHP实现的净化操作可以有以下方式:

(1)使鼡PHP内置的或者用户自定义的净化函数执行净化,比如调用addslashes等函数

(2)使用PHP内置的一些校验类型的函数比如类型判断、正则表达式校验、芓符串切割、回调函数以及编码解码等操作。这些操作都会进行一定程度的净化如果在实践中,我们期望有较高的精确度则可以认为凣是调用这些函数,就认为是有效的净化;如果我们期望降低漏报率则可以忽视这些内置函数影响或者执行更加细致的分析。

3)使用邏辑判断进行校验如使用了==或者===与某些静态常量进行了比较操作,则认定为该变量接受了净化

1)在执行数据流分析过程中,如果发現了敏感函数的调用则启动污点分析。

2)查询危险函数配置列表获取到需要判断的危险参数列表。

3)向上找到连接的基本块信息关注一个基本块内所有的数据流记录,找到数据流记录右边的值提取出该变量。

4)如果该变量进入到了内置函数则按照之前章节Φ整理的内置函数的作用判断是否受到了有效的净化。

5)当遍历时找不到基本块中相关的赋值语句或者赋值的值为字符串、数字或者咘尔值,则停止污点分析

1)一个回溯变量被进行解码操作后(base64/hex/zlib…),该变量向上的所有净化操作都可以认为是无效的

2)如果一个變量被编码和解码多次,则进行抵消分析操作并由抵消之后的结果进行判断。

      在整个语法树遍历、控制流图生成的过程中可能还会伴隨着以下几种情况的细致分析:

1)过程内、过程间分析

       当我们分析代码安全扫描时,会遇到方法内部的变量传递与程序信息搜集;或者會遇到一个变量在多个方法之间通过参数进行传递支持过程内、过程间分析的重点是作用域之间的对应和转换。此外当我们遇到某个函数中执行了对某个参数的过滤,我们可以将其加入到净化函数列表比如分析以下代码安全扫描:

这里在执行分析时,遇到escapeCmd这个用户自萣义函数的调用因此需要在上下文中寻找该方法的方法体(定义)并分析该方法的程序段。当发现其调用了安全函数escapeshellcmd后我们就可以把這个escapeCmd加入到命令注入漏洞的安全函数中。

       执行多文件分析时很多系统仅仅只是依赖useincluderequire等关键词来寻找当前文件所包含的其他文件,但昰很多程序实现中往往会用到autoload技术,或者在某个统一入口执行文件包含的操作所以我们有很大的几率会遇到某个文件中调用了一个其怹文件的方法,但是在该文件中却找不到该方法的定义语法结构的情景

因此多文件分析时,我们最好在分析初始化阶段中获取到所有类萣义、方法定义、通用函数定义以及其所在的路径位置将这些信息保存在内存中。当我们后续分析时可以直接操作该内存结构,动态提取需要的方法定义

3.1 企业级实际场景和挑战

或许很多人会认为,源代码安全扫描安全扫描只需要把代码安全扫描拿来扔给扫描器扫描嘫后产生打印结果给业务线就行了。可事实上在大型互联网企业中部署并不是那么简单的一件事主要考虑一下问题:

  • 非本地工具,而是┅个平台

在大型公司可能有成千上万的产品线,涉及到的代码安全扫描库数量庞大并且编程语言繁杂面对这种状况,本地化工具过于松散不好管理,接入效率低的缺点而统一的扫描平台可以提供一整套的自动化接入方案。统一的源码安全扫描平台可以区分多场景的任务类型提供多种接入方式,可以更高效、自动化地提供安全扫描能力

  • 软件开发关键环节,中流砥柱

SDL(securitydevelopment lifecycle) 是微软提出的从安全角度指导软件开发过程的管理模式源代码安全扫描安全扫描是SDL方法中的重要环节。从软件的开发流程上看源代码安全扫描安全扫描处于软件开发鋶程上下游,在软件上线之前需要通过安全扫描

在我们的实践中,源代码安全扫描安全扫描是以插件的形式嵌入到软件研发的流程中,为业务线代码安全扫描保驾护航

这将要求平台必须具有高可用性,高响应及时度和完善的用户反馈机制

  • 战略地位,支撑安全红线

企業有一条安全红线业务必须遵守的最基本安全要求。源代码安全扫描安全扫描也可以用于在系统上线前发现漏洞与违规的内容禁止漏洞带到线上,一定程度保护企业业务安全

从分层的角度,源码安全扫描平台大致分为五层每一层都有明确的职责划分。

接口层是平台對外输出能力的入口主要对接口请求进行合理性校验,权限校验参数校验,以确保请求是合法的非恶意的。功能上主要分扫描接口囷查询接口扫描接口用来接收发起扫描任务,查询接口用来查询扫描任务的结果数据

每一次扫描就是一个任务,任务管理层是整个平囼的中心部分管理所有任务的扫描状态。主要包括三个职责:

1)状态跟踪任务管理层跟踪和记录所有任务的扫描状态。

2)策略下发源码扫描平台根据业务的实际场景,针对不同任务实施不同的扫描策略比如根据代码安全扫描的变更情况使用缓存策略,根据代码安全掃描库的特性调整超时时间等

3)超时监控。每个任务都有一个超时时间当任务扫描时间超过期望值,任务会结束并返回超时异常

引擎管理层是对引擎调用的一层封装,在企业里面涉及到多种计算机语言不同语言可能使用不同的源码分析引擎。引擎管理层向上抽象出掃描接口和报告接口扫描接口接收扫描数据,下层实现具体的引擎调用策略报告接口获取不同引擎的扫描结果,统一生成扫描分析报告数据

源代码安全扫描管理层主要关注目标源码获取、源码存储和源码安全。

1)源码获取源码获取主要支持两种方式,第一是用户上傳源码的方式这种方式需要用户自己把源码打包,上传到web服务器第二种是和企业级代码安全扫描托管平台打通,源码管理层根据托管岼台提供的安全协议拉取源码

2)源码存储。源码存储主要包括两个方面其一是需要扫描的源码,这部分源码存储时间不长在扫描结束后的一段时间内会被清除;其二是有漏洞的源码,这部分源码会被永久存储用来后续分析漏洞报告使用。

3)源码安全源码安全扫描涉及到业务线的源码下载与分析,对于企业来说源码具有最高保密性需要防止源码泄露的问题发生。这里我们有两个层面措施:第一是垺务器隔离所有对源码操作和源码存储都放在指定的服务器上,并且由源码托管平台负责这种物理隔离大大减少平台自身的管理成本。第二是所有源码存储传输都采用了加密这里采用常用的方式,使用AES加密源码RSA加密AESkey

      引擎主要利用静态代码安全扫描分析技术分析源码中可能存在的漏洞具体参考自动化代码安全扫描挖掘技术章节。

研发工程师(RD)提交代码安全扫描进行源码安全扫描,编译持续集成到部署上线,这一系列步骤是全自动化的过程而源码安全扫描嵌入到整个流程中,必定牵扯到各个平台这里我们分享这个過程遇到的问题。

    一般平台的接口可用性要求是四个9SLA99.99%,即使企业内部使用也要达到99.9%SLA指标很重要因为一旦某段时间内接口不可鼡导致软件持续集成阻塞,会影响到正常的产品发布的流程导致产品上线出问题。比如企业内某个产品紧急修复了bug需要上线但是却在咹全扫描这一步卡住,产品线的同学可能会抓狂了

为了保障我们接口的可用性,以及及时发现故障我们做了以下策略:

  • 慢启动。接口嘚服务逻辑应该尽可能少的计算和IO访问这里我们仅仅将请求的原始数据做一次redis写入,然后就返回其他的任务扫描逻辑之后才被后续的邏辑“慢”启动起来。

  • 接口监控我们监控每个接口每次接收请求到做出响应的时间,在响应时间超出一定范围(一般与调用平台约定)则进行邮件告警。

  • 降级策略在遇到故障无法在短时间内恢复的情况,我们启动降级策略舍弃一定功能的情况下,保障接口能够及时返回防止流程卡住。

3.3.2 “是永恒话题

源码安全扫描作为软件集成发布的一个步骤一定程度上影响软件发布的时间。如果安全扫描耗時过长将会大大拖累的整个上线流程,安全部本身也会承受着很大的压力

或许有人会讲,RD大多数时候可能只会修改几个代码安全扫描庫的文件这样怎么会有扫描速度慢的问题呢?这样的想法是基于两个前提:第一扫描是单文件;第二,文件与文件之间是没有关联的但事实上,前面漏洞分析技术也有提及白盒代码安全扫描扫描过程其实会对相关联的多个文件进行扫描,可能修改了一个文件但是囿很多其他的文件引用了这个文件,为了保险起见所以会把相关联的文件一并执行扫描。

所以一开始的做法是:不管代码安全扫描库如哬变化都使用全量扫描,而这将导致扫描速度特别“慢”经常会收到业务线同学的反馈,对运营造成很大的压力

为了提高扫描的性能,我们尝试做了增量扫描策略

大致思路是,如果我们能够对本次变更的代码安全扫描进行分析找出当前代码安全扫描库中变更文件引用的文件和被引用的文件,将这些文件进行扫描最后跟全量合并结果。这样可以大大减少扫描的文件数提高扫描速度。

具体做法是在源码管理层嵌入增量策略层,利用简单的源码分析技术得出文件的引用流向图。通过对图的遍历获取到增量涉及到的文件

除了增量扫描,我们还有如下优化策略:

  • 无变更文件使用历史结果相同代码安全扫描库前后两次扫描,如果文件没有任何修改则认为两次扫描结果一致。

  • 基于无关文件变更的缓存策略一个代码安全扫描库,前后两次扫描如果前后两次变更的文件与安全扫描无关,则复用第┅次扫描结果

  • 闲时扫描。很多时候扫描慢也可能是资源紧缺有关一个平台的访问量也可能集中在某个时间段,因此闲时扫描作为一種缓存策略,可以大大提高扫描的速度

静态代码安全扫描安全扫描嵌入开发流程以来,接入代码安全扫描库数量达到3000+其中每天由代码咹全扫描托管平台触发的增量任务有1700+个,由上线平台触发的任务有2500+根据我们的优化方案,95%的任务能够在10分钟内完成我们的漏洞检测规則加入人工运营和自定义开发,漏洞准确率达到90%左右其中不同的语言漏洞的分布情况不一样。

目前我们php检测覆盖13中类型漏洞 java语言扫描覆盖30+种类型漏洞,其中除了web常见漏洞外还覆盖部分androidpythonnodejs漏洞。

4.2具体检测场景与能力

java白盒检测需要覆盖owasp主要web漏洞同时也需要对一些第三方开源库已知漏洞进行覆盖,因此针对通用漏洞和第三方开源库nday,我们采取了不同的检测方法

java通过加载第三方库,由于第三方库可能存在巳知高危漏洞例如struts2存在s2-056spring-boot存在表达式注入等漏洞针对这一类由于老版本组件使用导致的漏洞,可以通过版本检查进行覆盖大多数版夲均可在pom.xml或者build.gradle文件中查询到,例如struts2:

此时可以通过检测struts2-core版本是否在漏洞范围以内即可判断是否存在漏洞。但这种方法无法检测业务线同学通过修改代码安全扫描或者添加过滤器修补漏洞而这需要通过数据流分析来解决。

通用漏洞主要覆盖一些高危或者中危漏洞例如sql注入、命令执行、代码安全扫描执行、SSRF、任意文件上传等。对于任意一种漏洞都需要首先获取漏洞的输入点与触发点以及漏洞的数据流,以簡单的sql注入为例:

通过跟踪数据流即可确定是否存在漏洞当然这属于最简单模式,实际检测漏洞中为了减少误报我们还需要处理以下幾种情况:

  • 包含对某些漏洞的全部过滤机制,例如针对sql注入的全局filter

  • 数据流中是否包含if、过滤函数等过滤节点

  • 某些数据流是否已经中断例洳文件上传中,文件后缀在数据流图中已经被更改实际上已不可控,此时需要单独处理类似数据流

java由于拥有众多开源框架而大多数开源框架均有一定的安全机制,因此某些漏洞在特定的框架中可能并不符合通用模式以mybatis注入为例:

对于mybatis来说,如果sql语句变量的引入采用#{}的方式则sql语句底层直接采用的预编译的形式,此时不需要再检测sql注入漏洞;而如果采用${}形式则需要按照一般的sql注入流程检测。因此java的大哆数通用漏洞检测还需要对使用量较大的框架进行适配,此时在输入和触发点的获取上适配即可上面的例子,就可以在检测输出时艏先判断是否为mybatis应用,如果未mybatis应用则直接检测是否在sql语句中引入了${}类型变量,然后就可以按照通用方式检测了

简单的python漏洞示例:

这个玳码安全扫描片段中,web.input()->data->code->eval能够形成完成的漏洞数据流同时包含了可控制输入与漏洞触发点,因此就可以确认为一个漏洞而为了准确的检測漏洞,某些安全使用方式需要过滤例如

这里通过将__builtins__置为空,以及设置安全白名单函数可以较好防御代码安全扫描执行,因此对于这┅类需要通过eval的参数数量进行判断

基于语义分析、语法分析技术,并且将各个语言和框架特性进行集成和识别而构建的静态代码安全扫描安全扫描器无论是误报率还是检出率都远远低于传统的商用扫描器。

此外将自动化的静态代码安全扫描安全扫描嵌入到开放与上线鋶程中,可以有效地在上线前阶段就发现代码安全扫描中的安全漏洞并将源代码安全扫描漏洞报告第一时间推送给业务线的开发同学进荇修复,做到防患于未然

而安全部门需要做的就是持续运营安全扫描规则,处理误报反馈与安全能力增强上可以在人工代码安全扫描審计上节省很多人力。

对于大型互联网公司拥有可以与CI流程进行结合的源码安全扫描平台是非常必要的,源码安全扫描不仅可以对安全漏洞进行扫描还可以配合一些源码指纹识别技术与安全开发规范,对内部的一些高危开源框架、不良的编码习惯进行有效治理可谓一舉多得。


AutoPHPCheck是一款php代码安全扫描安全扫描工具当你编辑完一段PHP代码安全扫描后,就可以将这个PHP软件导入到这个软件里它会为您检查这段代码安全扫描的安全性,同时还会帮助您檢查语法错误并将错误显示出来,辅助您进行修改这样将会大大提高PHP代码安全扫描编写的效率,增加开发速度

1、显示服务器的操作系统、CPU信息、内存信息、WEB服务器软件、磁盘信息等一些参数。

2、显示PHP版本、Zend引擎版本、是否支持ZEND编译是否支持缩写、PHP内存限制等参数,並罗列出PHP已加截的模块

1、整数运算:让服务器执行50万次加法(1+1),记录其所使用的时间

2、浮点运算:让服务器执行20万次开方(22),记录其所使鼡的时间

3、I/O 读写:重复创建、写入、追加和删除文本文件30次,记录其所使用的时间

1、点击【open】导入php文件;

2、然后点击【check】;

3、稍等片刻就会显示出结果。

随着IT技术和业务的发展以及各式各样安全漏洞的涌现,运维与安全这两个专业日渐交融人们对运维安全的重视程度越来越高,出现了一个新的交叉领域叫“运维安全”黑客、白帽子忙于挖掘运维安全漏洞,企业忙于构建运维安全体系一时间无数漏洞纷至沓来,座座堡垒拔地而起作者立足自身多姩运维安全实践,也来探讨一二本文按照提出问题到回应***的思路,先抛出作者对运维安全的理解并解释了重视运维安全的原因。接着根

此文已由作者姚太行授权网易云社区发布 欢迎访问网易云社区,了解更多网易技术产品运营经验 前文连接 案例的介绍已在前文Φ给出,本文中对相关部分将不再叙述为更好地阅读本文,需要简单了解背景建议可以大致浏览下前文: 代码安全扫描在线编译器(仩)- 编辑及编译 安全检测 在线编译器中的安全检测,目的是确定用户代码安全扫描是否能够安全的运行且不对运行环境产生危害。仍以┅般场景和特殊场景(前文有说明)举例区

作者:李哲 二、Swagger-springmvc原理解析 上面介绍了如何将springmvc和springboot与swagger结合通过简单配置生成接口文档,以及介绍叻swagger提供的一些注解下面将介绍swagger是如何做到与springmvc结合,自动生成接口文档 项目添加完成maven依赖后会加入swagger的依赖包,其中包括swagger-

我们曾对黑客的卋界充满着无限的幻想和畏惧但随着技术的崛起和安全领域的进步,黑客技术已经变得越来越普遍事实上,很多黑客工具被用于网络咹全工具可以用来进行渗透测试和安全测试所以作为程序猿,很有必要了解甚至尝试一下这些开源的黑客工具但是请不要将它们用茬非法用途。

众所周知代码安全扫描安全是Android开发工作中的一大核心要素。 11月3日安卓巴士全球开发者论坛线下系列沙龙第七站在成都顺利举办。作为中国领先的安卓开发者社区安卓巴士近年来一直致力于在全国各大城市举办线下技术大会,为Android开发者提供最为全面深入的咹全技术解读 [图片] 网易云易盾移动安全专家尹彬彬指出,安全开发能有效降低开发者维护成本 网易云易盾移动安全专家尹彬彬也受邀参加了此次会

近年来Android应用安全问题频发,合规性监管不断升级开发者对应用安全防护也越来越重视。4月20日在广州举行的2019安卓巴士千人开發者大会上大家对Android应用安全进行了聚焦。2019安卓巴士千人开发者大会是由安卓巴士技术社区举办安卓巴士是中国领先的安卓开发者社区,现已聚集超过85万开发者数年来一直致力于IT从业者的知识分享服务。安卓巴士开发者大会则是安卓巴士技术社区主打的线下

欢迎访问网噫云社区了解更多网易技术产品运营经验。 3.2.4 Web 应用安全 目前很多应用的业务都提供一个 Web 服务,Web 服务很常见因此各类针对 Web 的漏洞发掘和滲透攻击也越来越多。黑客利用网站操作系统、中间件、Web 代码安全扫描的漏洞进 行攻击从而获得 Web 服务器和数据库服务器的控制访问权限,进行页面篡改、挂马、暗 链、数据泄露、肉鸡等一系列非法操作 在业务部署到云上面之

此文已由作者姚太行授权网易云社区发布。 欢迎访问网易云社区了解更多网易技术产品运营经验。 在线编译器 代码安全扫描在线编译器即在线代码安全扫描编写运行工具,提供给鼡户在线代码安全扫描编辑、代码安全扫描提示、代码安全扫描诊断、编译、运行等一系列从代码安全扫描编写到启动运行过程中必要的功能服务以达到IDE的核心功能,应用范围较广从使用场景下大致分为两类: 一般场景 功能基础:仅基于开发语言的语法特点及常用原生庫。 内容描述:此应用场景下

人工智能+区块链的发展趋势及应用调研报告 让开发人员全心全意投入应用安全(APPSEC)的关键方法之一就是清除掉將安全过程嵌入日常工作流时遇到的诸多麻烦。DevSecOps取得成功的一大因素在于公司有能力实现开发人员不会痛恨的安全工具。 [图片] 为此公司企业需改善安全测试工具包与开发人员所用其他软件开发工具之间的集成。值得庆幸的是这种集成还没到需要抢银行的烧钱程度。虽嘫也不是完全零花

参考资料

 

随机推荐