CloudFlare 七月初服务中断的锅找到了。。。

2019 年 7 月 13 日
 wikinee

转自阮一峰推特

七月初,cloudflare 曾经全球中断服务,原因是一个正则表达式耗尽了 CPU 资源。

今天,他们公布了这个正则表达式。

(?:(?:\"|'|\]|\}|\\|\d|(?:nan|infinity|true|false|null|undefined|symbol|math)|\`|\-|\+)+[)]*;?((?:\s|-|~|!|{}|\|\||\+)*.*(?:.*=.*)))

看着是很复杂,简化以后,出问题是这个模式 ..=.* ,它会导致急剧放大的计算量。后面链接详细解释,为什么这个模式有问题。

详细解释: https://blog.cloudflare.com/details-of-the-cloudflare-outage-on-july-2-2019/#appendix-about-regular-expression-backtracking

7529 次点击
所在节点    程序员
28 条回复
wikinee
2019 年 7 月 13 日
英文的看不懂了。。。
yukiww233
2019 年 7 月 13 日
正则地狱
Sylv
2019 年 7 月 13 日
粗略浏览了下,其实和飞机失事一样,并不是单一问题导致的,而是一连串原因导致保险措施失效。
caomu
2019 年 7 月 13 日
当你有一个问题,想用正则解决时,你就有两个问题了。
zackwu
2019 年 7 月 13 日
当初 v2 上面还有一大群人说是因为政治原因被我国攻击...

真是有趣啊
doing1
2019 年 7 月 13 日
说实话,看着感觉有点乱,我晕了
rrfeng
2019 年 7 月 13 日
反正我绝不在一个正则里写多个 .*
因为我自己都会看不懂了。
trn4
2019 年 7 月 13 日
简单来说就是 .*.*=.* 这种正则在匹配的时候会造成太多回溯使时间复杂度飙升。解决方案是把正则转换成 NFA (非确定有限自动机)这样时间复杂度就是对于输入数据线性的。难道主流正则实现不是基于 NFA 的?我记得编译原理学正则的时候就是用的 NFA 啊……
miaomiao888
2019 年 7 月 13 日
@keith1126 时间刚好赶上 H.K 那事
对一个惯犯有这种怀疑也太正常了
cest
2019 年 7 月 13 日
所以测试时没注意 benchmark 差了些就上线了?
ntdll
2019 年 7 月 13 日
>> Some of these alerts hit my watch and I jumped out of the meeting I was in and was on my way back to my desk when a leader in our Solutions Engineering group told me we had lost 80% of our traffic. I ran over to SRE where the team was debugging the situation. In the initial moments of the outage there was speculation it was an attack of some type we ’ d never seen before.

这怕是要举国家之力,才有可能让全球节点都挂掉吧,甚至我觉得哪怕除了美国以外,其他国家以国家之力都做不到,毕竟出口带宽就这么点。
anzu
2019 年 7 月 13 日
在 python 中试了一下很快呀
re.match('.*.*=.*', 'x=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx').group()
kelaredbull
2019 年 7 月 13 日
@miaomiao888 程序员每天都在写 bug,你为什么不怀疑呢
zackwu
2019 年 7 月 13 日
@miaomiao888 #9

咱们又不是政客,作为程序员,遇到问题的第一直觉不应该从技术角度出发吗?
miaomiao888
2019 年 7 月 13 日
@keith1126 所以谷歌为什么无法访问,某网站为什么被重置,请从技术角度出发?
我只是解释你说的某些人从政治角度怀疑的合理性

引一条推:@Solitude_Sola
被 G.F.W 折磨多年都有了自我加害的心理问题,上不去一个网站一口咬定是自己翻不出去,折腾老半天代理,甚至重新部署。这才确定了是那个网站服务器宕机了。
KuroNekoFan
2019 年 7 月 13 日
刚出事那会挺多人都觉得是 cn gov 级别的攻击...不过 wall 真的,从任何角度来说都是非常恶心的玩意
cest
2019 年 7 月 13 日
@gam2046 #11
荒郊野外毫无人烟的 pop 也死光了,只能是 0day 或内鬼
uyhyygyug1234
2019 年 7 月 13 日
哈哈哈,日了狗,这是故障报告要写给大众看啊。程序员一定压了很大。

另外,waf minor release 看的出来,他们用的是 jira。。。。
UnluckyNinja
2019 年 7 月 13 日
楼主把简化后的正则打错了
jinliming2
2019 年 7 月 13 日
嗯,测试了一下,CPU i7-9700K,字符串 `'a=xxx...xxx'`(后跟 2 万个 x ),正则 `/.*.*=.*/` 需要大约 0.3 秒跑出结果。。。
for 循环 100 次,就可以感受到速度真的很慢了。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/582606

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX