一、背景
汤青松 ,北京趣加科技有限公司 安全工程师,实体书《PHP WEB安全开发实战》作者,擅长企业安全建设,SDL安全建设。PHPCon 2020 第八届 PHP 开发者大会分享《PHP安全编码规范与审查》,NSC 2019第七届中国网络安全大会分享《PHP反序列化漏洞分析实践》看雪2018 安全开发者峰会担任Web安全训练营 讲师
大家好,非常高兴给大家分享《代码安全体系建设》议题,我是汤青松,目前在 SDL 方面做的比较多的。今天讲的这个话题其实和 SDL 有很大关系的。我这次分享这个话题的其实就是 SDL 当中的一部分。很多同学如果在甲方也会去做 SDL 当中的一些工作,所以我希望我这次分享的内容对大家有所帮助。
这次分享的话题是 SDL 当中的一部分,但是它不完全是 SDL 因为我主要还是聚焦于在安全向左移的这样一个概念当中。所以今天分享的话题主要是聚焦于这个代码风险管理。那在这个代码安全当中可能有哪些风险点了?那它可能会包含技术方面的工作和非技术方面的工作,比如说管理工作以及这个学习方面的一些事情都会有讲解到。
二、 安全培训
所以这里我讲几个非技术性的一个话题,就是我们怎么去给这些开发做培训。那首先我觉得做培训有这几个方面,我可以给大家一些参考意见。比如说首次的这个培训我们讲什么话题?怎么避免一次性把这个话讲了,那么我下个季度还讲不讲?是不是我一次性了就把话讲完了我觉得都是有一些技巧的,就是你第一次该讲什么东西。
第二个说我们培训了是,一次培训了,我们就把所有的这个开发组成员了都叫上。那么比如说几十号人,上百人都叫上,然后我们自己在一个舞台上去讲还是这个小组去讲了。那这里头我是推荐大家小组讲,那一会我会讲到为什么去小组讲。
第三个就是案例就地取材案例了,我们一定要在每次培训之前把他那个代码打开去看一下,拿着他的代码给她们做一完培训。然后接着了我们就开展我们这次要培训的一个话题,那这样的一个形式。
2.1 首次基础培训
首次基础培训了我们可以给他讲哪些东西了?我觉得你首先可以给他讲一下你在这个甲方安全当中了,你是怎么去给他们做代码审计的,你是怎么去做安全的?这个其实是她比较关心的,让他了解你的工作。那你平时会关注哪些点,你给他充分交流一下。那么建立一个互信机制。
第二个你可以给他讲一下这个漏洞分类,比如说了通用的一个编码型漏洞,比如说SQL注入, XSS csrf 文件上传,然后命令执行代码注入等等这些问题。那把这些问题了给讲完之后了,我们还可以给他介绍一下这个逻辑性漏洞,比如说这个支付漏洞、越全漏洞、验证码漏洞、短信漏洞等等这些漏洞了,我们可以给他科普一下。
那么讲这些漏洞的时候,你可以去结合他们这个小组了,他们是做哪方面业务的?比如说做中台的了,他可能会脱离业务。他可能没有这样一个支付的问题,或者说没有用户的一些问或等等和他这个主无关的一些问题,可以给大概提一下,但不要讲细了。
第三个你可以给他讲一下代码自查的一些方法,你可以教他一些简单的方法,比如说他写完代码之后了,怎么去审计自己的安全问题?但这个参数有没有做过滤类型,是否强制的,比如说我要介绍一个 ID 那在 PHP 语言当中了,那可能他没有使用这个整型转换,那么接受了有可能这个字符,那么拼接到这个SQL注入当中了对吧?那这个时候你就要跟他讲,你说你在这个接收的时候你得做一次过滤,你如果没有做过滤了,在拼接社会语句的时候你得做 pdo ,然后查 SQL 大致教他一下怎么去查。
那这个SQL漏洞怎么查了?我相信做甲方的技术同学都有一定的见解,在这里我就不展开了,你可以给这些开发的大概提一下。一般来说就是做开发的同学了。自己对这一块也是比较了解的,你给他点个开头,他自己很多事情他能想明白的。
2.2 小组培训
第二个就要在做培训的时候了,我的建议是小组培训,比如说你们一个公司可能会分为很多个小组。那么我目前来说我主要是给后端的同学做培训。所以我一般做培训的时候我会讲后端的一些东西。那么后端他每一个组了他其实涉及的东西都不一样,比如说有些组了他不会用到 HTTP 协议,他就会用这个 socket TCP 这种协议。那么你给他去讲一些 web 业务的一些漏洞了,他可能不爱听。
所以做小组培训的目的了,我觉得主要就是因材施教。那每个组他有自己不同的一些特点,你得给他讲他自己不同的。那么你尽量在每次培训的时候,你尽量控制在 10 个人以内。而且我觉得时间你要控制一下,就要控制在这个 45 分钟以内。们平时上课了对吧,也是 45 分钟以内。
说了你要有这个时间的一个意识,你不要一直讲,讲完之后翻其他人压根就没来听,你要有以这样一个互动机制。那这里有三点了,我需要给大家去说的。就第一个了就是开始讲到了,你一定要贴近这个团队的一个真实代码。你每次给他做培训的时候了,你得先把她代码审计一遍,审计完了多多少少可能会有一些安全问题,或者说有些不规范的问题。你拿着这个代码去跟他说,你不要直接上来,对案例那样不是不好的,很多人可能就不乐意听。那么第二个就是要贴近他的业务场景,刚才也讲到了,那做 TCP 的你给他讲 HTTP 他不乐意听他,我压根就没有这个业务,你给我讲啥呢?第三个就是多分享故事的一个形式去形成一个互动的气氛。比如说你在给他做培训的时候,你给他讲越全的时候,那你就讲以前了,可能你挖过某个网站的一个预存漏洞,你是怎么发现的,以及你可能在网上了看到过别人的一些案例,那这些分析步骤了你可以给他讲一下。
你比如说我发现了这样一个 URL 的 ID 等于100,那么我觉得想试一下,我把这个 100 了改成 101 在 URL 地址栏当中回车一下。发现看到了别人的一个信息,也发现了别人订单信息,发现了别人的一个个人用户信息以及其他的一些权限信息,多以这种故事的形式给他去交流,我觉得是效果非常不错的。
2.3 案例就地取材
第三个就是案例就地取材。那很多时候我们给 A 组的同学去做这个分享的时候了,那他不一定了有他们这个组的一个漏洞案例。这个时候我觉得你一定是就近的,你可以讲他们部门的对吧,可以给他讲这个整个公司的。然后这个案例就是尽量靠近他们这个团队。那么你怎么取这些案例呢?我们知道在 2016 年以前,这些互联网当中有很多这种漏洞案例,包括各个大公司的一些漏洞案例都是有的。但在 2016 年 6 月 1 号之后,我们基本上看不到了,为什么网络安全法出来了,所以很多这种比较直观的漏洞案例了,我们现在没有办法,说很轻松的拿到了。这个时候了,你可以从三个渠道取了。
第一个说你在平时做代码审计的时候,你把这些案例了给存起来,截好图。然后把敏感信息的打个码。但是把意思大概说明白,把这些案例给整理起来。第二个就是从安全测试当中,我们每一次业务要上线了,肯定会有一轮安全测试,把业务测试当中发现了一些问题点,也可以整理起来,我们是有一个案漏案例库的。第三个就是漏洞事件了。那比如说一些通用型的一些漏洞事件,像那个 2021 年年末的时候,是不是有个 logic4 的这样一个组件,我记得在快过年的前几天了,那个时候出了一个命令执行的漏洞,那影响范围还蛮大的,那可以把这些事件了给它整理一下。你可以告诉他说你依赖了一些组件了,要及时升级。如果了你要引用一个组件了,你要最好查一下它的版本有没有漏洞,有漏洞的话你就不要使用了。
一般来说我们 php会用 composer , Java会用另一个包管理器以及 Python 都会用包管理器,那么我们要及时去更新一下,不要说我们打包一次,几年我们都不更新,那样很容易就会产生一个安全漏洞。