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

2019-07-13 11:53:15 +08:00
 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

6337 次点击
所在节点    程序员
28 条回复
wikinee
2019-07-13 11:55:55 +08:00
英文的看不懂了。。。
yukiww233
2019-07-13 12:51:35 +08:00
正则地狱
Sylv
2019-07-13 14:14:34 +08:00
粗略浏览了下,其实和飞机失事一样,并不是单一问题导致的,而是一连串原因导致保险措施失效。
caomu
2019-07-13 14:15:28 +08:00
当你有一个问题,想用正则解决时,你就有两个问题了。
keith1126
2019-07-13 14:16:04 +08:00
当初 v2 上面还有一大群人说是因为政治原因被我国攻击...

真是有趣啊
doing1
2019-07-13 14:23:52 +08:00
说实话,看着感觉有点乱,我晕了
rrfeng
2019-07-13 14:38:30 +08:00
反正我绝不在一个正则里写多个 .*
因为我自己都会看不懂了。
xiadong1994
2019-07-13 14:39:33 +08:00
简单来说就是 .*.*=.* 这种正则在匹配的时候会造成太多回溯使时间复杂度飙升。解决方案是把正则转换成 NFA (非确定有限自动机)这样时间复杂度就是对于输入数据线性的。难道主流正则实现不是基于 NFA 的?我记得编译原理学正则的时候就是用的 NFA 啊……
miaomiao888
2019-07-13 14:45:16 +08:00
@keith1126 时间刚好赶上 H.K 那事
对一个惯犯有这种怀疑也太正常了
cest
2019-07-13 14:50:44 +08:00
所以测试时没注意 benchmark 差了些就上线了?
gam2046
2019-07-13 14:50:45 +08:00
>> 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-07-13 14:54:59 +08:00
在 python 中试了一下很快呀
re.match('.*.*=.*', 'x=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx').group()
kelaredbull
2019-07-13 14:57:29 +08:00
@miaomiao888 程序员每天都在写 bug,你为什么不怀疑呢
keith1126
2019-07-13 14:58:37 +08:00
@miaomiao888 #9

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

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

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

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

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

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

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

© 2021 V2EX