安全测试是一场没人想赢的辩论
凌晨三点电话响了。业务核心库被拖走了,丢了几十万条客户资料。我在事故复盘会上打开三个月前那份厚厚的安全测试报告,结论一栏写着:未发现高危漏洞。会议室没人说话。那份报告是我签的字,但我知道,在场的所有人——包括我自己——都在假装相信它。
为什么安全测试会变成一场表演?因为整个机制在奖励我们得出“安全”的结论。开发催着上线、运维等着过年检、管理层希望年底述职的时候多一条“年度零重大安全事件”。我当初跟项目经理拍过桌子,我说这个越权漏洞必须这个迭代修,他说:下个迭代不行吗?我说可以,反正数据被拖走的责任也会一起排到下个迭代。他沉默了。但沉默不会让漏洞消失,只会让漏洞变成别人的优先级。
后来我发现,我们采购了公司引以为傲的某知名扫描器,每年授权费够招三个安全工程师。它能扫出什么?缺补丁、弱口令、过期的SSL证书。全是打地鼠式的僵尸漏洞。真正要命的东西,它永远看不见。我做过一次印象最深的测试,在支付环节,把前端传来的订单金额从正数改成负数,系统竟然往账户里加钱。这种漏洞,你给扫描器一百年它也跑不出来,因为它不理解“一件商品的价格不可能是负数”这个业务规则。工具只知道协议、指纹、CVE编号,它不知道你公司的核心业务是拿漏洞当成一个开关在用的。
对比一下两个世界吧。合规驱动的安全测试:先定测试范围,再定测试方法,最后出一个报表,证明“我们做过这件事了”。红队思维呢:不问边界在哪里,先假设敌人已经进来了,然后想尽办法找到那个能让你一夜回到解放前的入口。等保测评报告每年都漂亮,可攻击者根本不认识你的测评机构。现在的网络攻击平均突破时间不到48小时,而大多数公司修复一个高危漏洞的SLA是30天。30天,足够一个攻击者把数据备份十遍,再把你的数据库当花呗刷一遍。
我后来想明白一件事,安全测试从来不是考验技术,是在考验我们敢不敢承认“可能失败”。一个工程师承认自己的代码有漏洞,比承认自己的代码有 bug 要难得多,因为漏洞意味着“我在设计的时候就没想清楚”。所以安全测试真正要做的,是帮团队完成这种心理建设。可现实是,我们总是急着给出一份没有结论的结论,把“未发现高危漏洞”当成终审判决。但安全没有终审判决,只有永无休止的假设检验。最后一个念头是:这份报告里没写的东西,才是我们最需要担心的东西——而那些东西,往往需要你把自己想象成敌人,而不是测试员。