CSRF防护方案(二)
写在前面
不得不吐槽一下,接了这个CSRF的坑真的是苦不堪言,一个是需要开发配合接入这个后端的网关中间件,一个是这个玩意动不动就容易出事故.
先说这个开发,这个要人接入,文档写得挺清楚的,但就是有卧龙和凤雏。确实,这个运营的玩意不是谁都能干,关键是这个玩意你咋算绩效呢。再就是这个侵入的防护方案,我们东西是不会出问题的,但难保不齐这个开发不看流量直接开启拦截。还好我加了个审批,都给拒绝了,但是最近又被这个破网关摆了一道。
说起这个破网关,我就得另起一段骂一骂。CSRF防护作为网关的插件,使用先得介入网关,我们让开发按照网关的操作文档去接入,结果接入之后业务就直接挂了。靠,还得背个事故。事故就算了,最让人无语最后分锅时候,网关的QA什么的破玩意觉得他们无责。什么厚颜无耻之徒,前面网关的开发都承认错误了,来了个什么不沾点脑子不讲理的牛鬼蛇神,叽里呱啦说了一大堆。他们RD还是有脑子的自己都知道理亏,但是这个QA什么玩意就是理直气壮。实属大开眼界。从业务方角度看,这个责任我这边背是没问题的,但是我这边找网关他们却一点不认,要不是看在SDLC同学的份上,我就直接火力全开。
有时候我真的怀疑这些大厂招人的水准,这些水货有个统一的特点,就是道理讲不通,但是又贼能瞎扯。例如最近合作的另外一个安全团队实在是太搞笑了,聊技术没有一点底蕴,讲其他的又是废话空话一大堆实在是浪费时间。
我不排斥反对某些人的职业生涯规划观点,就是发展后面,越来越偏向流程什么上非技术建设。
但是,这个前提是你的技术能力水准已经有一定的积累和底蕴。不然我实在不知道和这种人怎么交流,理直气壮的无知让人丧失沟通的欲望,保持我的职业素养前提下我可以耐心解释一遍,然后会议开到一半又回头来问一句为什么——无效沟通。
CSRF防护方案改造
谷歌已经宣布,将逐步用一项更加关注用户隐私的“隐私沙盒”(Privacy Sandbox)计划取代第三方 Cookie。从 2024 年初开始,该公司计划将 1% 的 Chrome 用户转移到 Privacy Sandbox,并为他们禁用第三方 Cookie。
简单说,就是chrome的这个玩意的改动,已经影响了现有的防护方案,因为方案里用到了一个cookie里的字段去校验token。
现在新的方案要做改造。
上一篇已经讲过了,CORS的能力已经足够支持CSRF防护,前提是只要保证content-type是application/json格式的。这里有个什么flash 307的什么绕过,Chrome和firefox上触发不了的,都不算。
用application/json限制其实就没Chrome这个改动什么事情了,但是比较烦的是,有相当一部分的业务,用的form表单的格式,很无语,2024年了,还有人用这个。看那个参数绑定封装的,让人瞠目结舌。好好地Go的结构体绑定不用,就要一个一个获取请求参数。
那这种情况,改不了application/json的怎么办?
新方案
我想出了一个新的方案,这个方案就是中和初版的token方案和content-type check方案。
初版方案已经在上一篇介绍过了,就是patch前端的请求发送,然后带上csrf token。这个方案我已经做过一轮优化,在原有的patch基础上,避免了对CORS的配置。但是这个优化因为Chrome这个改动要失效了。导致如果为了满足Chrome这个改动,原有的优化全部失效,又会碰上原来的那些问题,CORS冲突,首屏加载缓慢,介入成本高,排查复杂等等。
对此,我想到,可以在原有的patch上,我们再给原有的请求的content-type加一个属于我们自己的特殊字段,网关中间件根据这个字段来决定是否要放行还是拦截。CSRF攻击在CORS安全的前提下无法伪造content-type。
有几个问题需要确认和解决。
- 是否会影响后端参数绑定? 不会,中间件可以把这个字段抹除掉,到达业务后端流量是正常的。
- 是否会有其他问题,是否满足RFC标准?
content-type = type "/" subtype *( ";" parameter ) parameter = attribute "=" value
这个是我搜到content-type的语法,也就是说我们通过加个分号;
,再加个形如a=b
的字段,如csrf=1
,最后变成application/x-www-form-urlencoded;csrf=1
,这个格式是满足RFC标准的,没有问题。
至此,摆脱了Chrome这个玩意的改动,又摆脱了原来token方案的包袱。
最近在实现中,期待后续效果。
写在后面
“我不太清楚xxx前端架构是否能够较大程度便秘XSS出现,但是按照经验这个漏洞应该是远远大于CSRF漏洞数量的,只要同源子站出现XSS问题这个防护方案就Bypass了”
一时之间不知如何回答,在有XSS的问题下,什么CSRF防护方案能够防住?
如果你有和这位同学一样的困惑,那说明你tmd根本就没搞懂CORS,XSS,CSRF这些玩意。再看看资料,找个实际场景看看吧。