一、背景
汤青松 ,北京趣加科技有限公司 安全工程师,实体书《PHP WEB安全开发实战》作者,擅长企业安全建设,SDL安全建设。PHPCon 2020 第八届 PHP 开发者大会分享《PHP安全编码规范与审查》,NSC 2019第七届中国网络安全大会分享《PHP反序列化漏洞分析实践》看雪2018 安全开发者峰会担任Web安全训练营 讲师
大家好,非常高兴给大家分享《代码安全体系建设》议题,我是汤青松,目前在 SDL 方面做的比较多的。今天讲的这个话题其实和 SDL 有很大关系的。我这次分享这个话题的其实就是 SDL 当中的一部分。很多同学如果在甲方也会去做 SDL 当中的一些工作,所以我希望我这次分享的内容对大家有所帮助。
这次分享的话题是 SDL 当中的一部分,但是它不完全是 SDL 因为我主要还是聚焦于在安全向左移的这样一个概念当中。所以今天分享的话题主要是聚焦于这个代码风险管理。那在这个代码安全当中可能有哪些风险点了?那它可能会包含技术方面的工作和非技术方面的工作,比如说管理工作以及这个学习方面的一些事情都会有讲解到。
二、代码审计
在代码审计当中我们也有四点可以给大家去分享一下的。
那首先我们代码审计的方向,我们要怎么去审计呢?那这里就有一些偏技术型的话题了。那么有一句话叫文无第一,武无第二,相信做技术了也一样。
1、代码审计方向
那么第一个就是通用编码型这这个审计。那比如说我们可以审计这些这个sql注入、 XSS、 命令执行、文件上传等等这些,那么我们可以通过通用型编码升级出来。那么第二个我们得结合她的业务去审计。那比如说你只有有用户的系统,你才有这样一个用户密码找回以及一些权限方面的一些漏洞。
第三个就是组件型的一个,那你要根据这个仓库所使用的语言,比如说 php 的,那用compose ,那 Java 的了,那用另外一种形式。那么把这些组件了,确定一下它使用的这个组件版本,然后来确定他是不是有几个组件漏洞。那具体了通用型编码审计方法了。前面其实我也简单提了一下,其实主要从这三个方面去看吧。
第一个就是接收参数,如果说我这个地方接收了一个 ID 我明确知道它是一个整形的。当我接收的时候了,我没有用整形去强制接收。那在这种弱类型语言比如说 php 里面比较常见,那么你就可以去追踪一下这个变量,有没有放到sql语句里面去执行,有没有去返回到这个前台,有没有可能放到这个命令执行里面放在这个代码执行里面等等。这些方式就是追踪接收的参数,它没有过滤,我们就一直追到底,一直到这个程序结束。那么这是一种方式。
那么第二种方式就是关联词反常。关联词反常了主要说我们可以去这些函数的地方看一下它里面放的是不是变量,如果放的是变量,我们就追踪这个变量的来源。那如果说这个变量是接收用户的,并且没有做过滤,然后放到这个危险函数里面来,那么一定是有安全问题的对吧?第三个就是我们去解析它的依赖文件。那么目前来说就是 PhP 了, Java Python 以及 go 它都有依赖包管理。所以我们现在去检测它的依赖其实是比较好实现的,我们这里都可以去做一个。当然有一些它可能还是比较传统的方式。比如说 PhP 在老版本了,在 PhP 7.0 以下了很多这个系统了,他并不会使用 composer 他直接把这个源码了直接下载到他的这个目录下。那这个时候你解析可能会比较麻烦。
2、工具选型
那么这个时候呢您得借助一些第三方的一些工具去分析出来。说到这个代码审计的一些工具选型了,目前前这些我大部分都用过,比如说 fortify ,用的是比较熟练的。那么 check max 了这一款工具了,我还没用,因为还没有买他们的第三款这个代码卫士的话是那个奇安信的。那这一款我倒是用过一段时间。
第四个了,我目前用的是比较多的,主要是用在这个钩子检测当中。审计系统当中也用到了它的一些功能,但目前来说就是全量代码审计了,我还是比较喜欢用这个fortify。那么在这个钩子事件的时候喽,因为fortify带它是那个 AST 的这种语法分析,它会比较吃内存,而且反应速度比较慢,所以目前主要还是依赖与这个 Sem group 那么第五款这个 CodeQl 的 CodeQl 了这款工具了我前段时间还在了解,还没有用到这个生产环境当中,所以我也不太好说。
第六款工具了目前来说我用过。的感受就是它是一个完全开源的,包括他的这个规则,包括他的这个引擎系统大家都开源了,但他只能目前来说能检测 PhP 其他的后端语他不能检测。所以目前我用的这个 fortify 和 Sem group 比较多一些。 fortify 就是要商业的和check max ,其实代码卫生也是商业的。 fortify 我目前来说还比较好用,checkmax没用过,没有太多发言权。
这个 fortify 泛了我用过一段时间,去年十二月的时候。用过一个月。主要的感受就是它和福利范检测出来漏洞数量是比较相似的,但它的界面设计了点击起来我感觉很不顺畅。据说这个今年 3 月份会有一个新版本,到时候大家也可以去试用一下他们的 SemGroup ,他的规则是 开源的。然后它的这个引擎了它是加密的。
第五个了 CodeQL 了。那 github 当中就已经大规模使用,当然也可以去体验一下。但是你只能用于学习,不能用于商用。那现在我再来说一下就是批量代码审计的一个实现方式。那目前就是几款产品,其实它对单个单款库的支持都还比较好。我在做甲方的时候会遇到这样一个问题,那因为我是要对整个公司的代码库的安全性了负责的,所以我不能说就检测几个仓库的一些安全问题点。那时候我得批量去审计。那像我们公司可能有 600 多个仓库,一个一个打开,我得疯掉,像 fortify 打开一个仓库大的项目,它可能得一两天。光审计起来可能得花个一年时间就让他分析完。所以如果用这种默认方案其实不是太现实的。
3、批量代码审计工具
所以我写了一个批量代码审计的一个工具,就是QingScan。那么它主要的作用它其实是包含了四部分,一部分就是信息收集,第二部就黑盒检测,第三部分就是代码审计。那还有一个专项利用。那这里我主要提一下它这个白盒审计。那白货审计它其实主要的目的就是把你的这个项目了给拉下来,然后调用这个 fortify 以及这个sem group还有其他的一些代码审计的一些工具了,对它进行逐个扫描。那么扫描完这个,然后接着就扫描下一个。那么也可以分布式部署。那目前来说我已经在我们公司使用起来了,也推荐给大家去试用一下,那么这个地址在这里