软件供应链企业必须买5台WAF,并在招投标过程中提供采购合同及实际使用场景截图作为佐证。

这里说的,并不是给企业官网用的那台WAF。在攻防演练的场景下,随着防守方经验越来越丰富、应对手段不断完善,许多单位已经难以正面突破。于是,攻击者开始迂回从供应链企业下手,供应链企业的防供应链打击确实很重要。

但是今天我要谈的,是买5台WAF给研发部门使用。为什么是5台?瞎凑的,主要是要凑个五行环,再不行,4台也可以,就命名为四象面具。

这4、5台应当是市面上或行业内主流、销量最高的品牌,并且要异构。

最近我们上线了一个系统,掐着时间点、倒排工期,总算赶在节点前推上去了。结果一上线,WAF里就冒出一堆报警,页面直接打不开。

而且有些是XSS漏洞,XSS是一个低层次的问题,跟SQL注入、平行权限一样,如果一个应用有这3个之一,基本上可以判这个开发团队死刑了。网络安全里的苍蝇,蟑螂和白蚁

没有人喜欢WAF

除了卖WAF的那些人。

开发者不喜欢,一上线就各种误报拦住了加班写得创意需求;安全运维人员不喜欢,规则开得强误报太多,不开等于没有,整天跟各种人争吵,谁报个错都要问问是不是WAF的问题;网络部门不喜欢,增加单点故障,增加排错难度;用户也不喜欢,打开页面速度变慢了。

但是,即使WAF有这么多缺点,他却是必备的。必须要有。

从合规角度看,WAF是必须配的;在攻防演练时,没有WAF几乎是“裸奔”,死得会很惨;而在日常运行中,WAF可以缓解或阻断部分0-day攻击,

我思考了下是为什么,从根源来说,就是因为有各种误报,导致大家都用得不开心!!!

但是这个误报的产生又有多种形式,一种来自WAF自身的匹配规则,一种源自应用代码编写不规范,一种是外网大量的无意义的扫描。当然,你都要归根结底给WAF的能力有问题,也行。

每种都有不同的解决方案,从软件供应链企业来说,可以解决的是第二种。

在编程语言里,有一类叫保留字,是语言预定义的特殊词汇,比如 Python 里的 classdef 等。因此我们写代码时,通常会避开这些词,比如“姓名”字段不叫 name,而改成 realName

主要是为了防止引起歧义,误报。

如果非要用,也可以。像在SQL语句中,用反引号或方括号包起来,来规避保留字冲突。

在系统研发过程中,我们也常用静态检查工具,对代码进行检查,处理所有可能的报错,并对某些特定规则进行“忽略”处理。这些忽略配置可以写在独立文件里、代码块里,甚至是行内注释中,用来跳过那些“不是问题的问题”。

WAF的误报,可以类似来处理。

安全左移和treat warnings as errors

WAF的调优,应当由研发而不是安全运维人员来做。

我不止一次唠叨过,安全要左移,实现内生安全,你底层不安全,依赖上层的纵深防御,成本增加是非常大的。

有些开发习惯性甩锅,遇到安全问题就甩锅给安全部门,找找自己的问题吧!从哪里找?WAF里面。在WAF的拦截日志里挖金子。

WAF拦截一定有他的道理。如果一个系统部署上线后,正常的访问会引起WAF的一堆报警,那八成不是WAF太敏感的问题,而是系统本身就有问题!运维阶段为了规避每多加一个白名单特例,其实都是未来攻击者的潜在入口。

举一些简单的例子,WAF可以看到很多威胁。以XSS为例,XSS的防御方法只有一种,原样保存用户输入的任何内容,在输出之前进行HTML编码,不要依赖CSP。

如果在WAF看到引起的XSS报警,可能只是用户一定要输入的大于号小于号,或者是前端的功能就是让用户手写HTML代码提交。

这也是一个线索。这时候必须使用某些模板引擎对用户手写进行替换,或者,如果确认,为了规避WAF,就在前端做个简单的编码或者加密,让WAF眼瞎。这些都是解决方法。

面向WAF友好怎么做

一个系统部署到用户那里,用户的环境很复杂,要考虑各种友好。

在信创体系里,操作系统、中间件、数据库等都有认证要求,理论上应用对于WAF,也要有相应的认证。

用户可能有反向代理,要对反向代理友好,只能用相对路径,不能写死URL地址,要能正确解析反向代理推送过来的客户端IP谈 X-Forwarded-For 的IP伪造问题;要对IPv6友好,记录的IP地址的字段不能太短;用户可能会有安全设备混淆前端JavaScript的能力,要对这个能力友好,不能混淆完你代码会出错。

所有的这些友好,应当在部署到用户环境之前已经完成。

买WAF部署在研发本地,处理所有误报

理想的情况是,上线前的安全检查,只是查查部署的问题,软件的安全问题,应该在开发测试阶段就完成的。

但是很多软件供应链企业,都把这块成本省下来,让甲方从安全经费里面出。

如果用户愿意给你数据的,可以定期从用户侧拿到WAF告警进行处理。

如果能拿到WAF品牌方出的认证——“XXX 系统跑在我们家WAF上,绝对不会误报”——那就再好不过了。

输出Rule Exclusion

有些WAF可以建立规则排除集(Rule Exclusion Set),确定不是问题的,应当生成应用自己的排除集。根据用户的WAF品牌,给一个文件,用户导入,规则就建立好了。

当然这个规则要遵守规则策略最小化原则。

使用WAF进行纵深防御

有些需要请WAF进行纵深防御的,也可以写入规则集,比如防止暴力破解,盗图等等。

结语:DevSecOps

Dev、Sec、Ops应当是相亲相爱一家人,请Dev多做一些家务吧!

WAF买了,那数据库审计产品也一起买下?