一、背景
汤青松 ,北京趣加科技有限公司 安全工程师,实体书《PHP WEB安全开发实战》作者,擅长企业安全建设,SDL安全建设。PHPCon 2020 第八届 PHP 开发者大会分享《PHP安全编码规范与审查》,NSC 2019第七届中国网络安全大会分享《PHP反序列化漏洞分析实践》看雪2018 安全开发者峰会担任Web安全训练营 讲师
大家好,非常高兴给大家分享《代码安全体系建设》议题,我是汤青松,目前在 SDL 方面做的比较多的。今天讲的这个话题其实和 SDL 有很大关系的。我这次分享这个话题的其实就是 SDL 当中的一部分。很多同学如果在甲方也会去做 SDL 当中的一些工作,所以我希望我这次分享的内容对大家有所帮助。
这次分享的话题是 SDL 当中的一部分,但是它不完全是 SDL 因为我主要还是聚焦于在安全向左移的这样一个概念当中。所以今天分享的话题主要是聚焦于这个代码风险管理。那在这个代码安全当中可能有哪些风险点了?那它可能会包含技术方面的工作和非技术方面的工作,比如说管理工作以及这个学习方面的一些事情都会有讲解到。
二、风险提醒
那接下来我们要讲的就是风险实时提醒。那么我们给他做完培训之后,我们有这个首次培训,也有这个每个季度一次培训,也有这些案例的一些讲解对吧,我们还得有这个监督的一个作用,就是他们写完代码之后,我们得及时去提醒他,以及了我们每一个季度了我们有一次全面扫描等等这些信息。
1、风险提醒的作用
那首先我讲一下这个风险提醒的一个作用,主要就是强化大家的一个提醒的意识。你不要讲了之后就不提醒了,过不了一周两周,他之前的代码习惯了,该怎么写还是怎么写?你会发现你之前的培训白讲了,你给他讲了之后了没有太大的改变。所以你要有提醒。
那实时提醒了我们可以在 git 的仓库当中做一个勾子事件,每一次它 push 代码的时候,我们可以把他的代码了给拿出来,拿出来之后提取他改动的行,提取改动出来的行了。然后我们来判断一下他有没有危险函数等一些问题。那如果有这些问题了,我们就给他反馈一下,就告诉他你哪个地方了可能会存在危险。
提醒这件事了有三点意义。第一个就是加强他的安全意识,让他知道这个安全事情有人在管。第二个就是从源头当中去阻挡安全。但这个钩子你不要说遇到这个危险函数了,就直接给打回去。你可以在这个 git 当中给它返回一下,返回一个提示信息,告诉它这个地方可能存在风险,让他去注意一下。比如说在命令执行这个地方你放了一个变量,那么你需要确保你的变量是可控的,是过滤了的给他这样一个提示作用。
第三个就是提升一下安全的反馈速度。那如果说你没有这样一个实时的提醒了,你每个两周去给他这个仓库全面扫描一次,那可能他代码都上线了对吧?
2、风险函数提醒
风险函数我简单列了几个函数,比如说这里了有这个代码注入的,有这个执行系统的命令的,有使用这个明文 FTP 下传文件的,
还有一些加密库以及一些正则库,那这边还有一些信息泄露的提醒。
你都可以放到你的这个安全风险提醒里面去。我觉得优先级了,你可以把这些高危的了给大家放进去。比如像 FTP 的,你可以看情况,你放不放都行。那像 pprof 了,我觉得你肯定得注意。那 PP info 里面还是有蛮重要的信息的以及 Golang 里面的,它直接使用了裸写了这个语句以及读取文件内容以及执行系统命令的这些危险函数了,你都给它去提醒一下。
3、钩子使用
那刚才说的这个勾子事件了怎么去使用了?那其实这个勾子的原理主要就是在这个 git 服务器当中了,存放一个勾子的这这个脚本,每次他 push 的时候了,服务器他会触发这样一个脚本。
触发脚本的时候,你就可以通过一些命令行了,你去获取到他有哪几个文件有改动,那改动了一些行号了,你都能拿到。完了这些数据之后了,你把这个检测的规则就刚才我提供的一些危险函数,以及你自己去拓展一些,把这个规则文件给它写好。
第二个,这个semgrep现在已经比较流行了,已经有很多这个团队在使用了,所以我觉得也是一个比较成熟的东西,你可以通过 sum group 加上这个规则去检测这个代码,然后把这些风险给返回回来。那么具体的实现地址了,我之前写了一篇文章,还是比较详细的,那大家可以去打开,然后按照操作了去实现就行了。
那这里我给大家展示一下这个钩子了,它会是一样一个什么样效果?比如说我在命令行当中,我输入了一个 git commit 然后提交这个代码,然后在推送的时候它就会触发。那么在推送的时候,我们可以看到他这边告诉我哪个文件。那么它的行号,当中有个 EXEC 执行了这个 git 当中的 A 这个变量,那么它有可能会导致一个命令注入,那一定要确保内容不是用户随意控制的。那么这样一个提示性的话语,那具体了你可以去把这个界面了给它优化一下也可以。