CloudFlare 七月初服务中断的锅找到了。。。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
wikinee
V2EX    程序员

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

  •  
  •   wikinee 2019-07-13 11:53:15 +08:00 6701 次点击
    这是一个创建于 2286 天前的主题,其中的信息可能已经有所发展或是发生改变。

    转自阮一峰推特

    七月初,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

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

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

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

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

    另外,waf minor release 看的出来,他们用的是 jira。。。。
    UnluckyNinja
        19
    UnluckyNinja  
       2019-07-13 16:53:12 +08:00
    楼主把简化后的正则打错了
    jinliming2
        20
    jinliming2  
       2019-07-13 18:58:05 +08:00
    div class="reply_content">嗯,测试了一下,CPU i7-9700K,字符串 `'a=xxx...xxx'`(后跟 2 万个 x ),正则 `/.*.*=.*/` 需要大约 0.3 秒跑出结果。。。
    for 循环 100 次,就可以感受到速度真的很慢了。。。
    operawang
        21
    operawang  
       2019-07-13 19:05:56 +08:00
    @jinliming2 把 a=去掉再试试,文章说不匹配更耗资源。
    snw
        22
    snw  
       2019-07-13 19:41:56 +08:00
    @gam2046
    DNS 反射放大攻击了解一下。旁观者攻击了解一下。DDoS 并不需要你自己有足够大的带宽。
    现实案例见 2015 年 3 月份 GitHub 遭到的攻击。
    U2FsdGVkX1
        23
    U2FsdGVkX1  
       2019-07-13 21:54:00 +08:00
    @miaomiao888 有一部分留言像是带节奏,说白了就是没石锤的预测当真了,早就脱离怀疑范围了
    figo
        24
    figo  
       2019-07-13 21:58:27 +08:00
    @caomu z 正解
    skyeycirno
        25
    skyeycirno  
       2019-07-13 21:59:41 +08:00
    又扩大了一点黑名单,真好
    hoyixi
        26
    hoyixi  
       2019-07-13 22:01:51 +08:00
    这么长&复杂的正则,就算是我自己写的,上个厕所撒泡尿,恐怕我就忘了是神马玩意了
    wikinee
        27
    wikinee  
    OP
       2019-07-14 10:12:26 +08:00 via Android
    @UnluckyNinja 雨我无瓜,我复制过来的,被吞掉了
    wikinee
        28
    wikinee  
    OP
       2019-07-15 10:50:01 +08:00
    @keith1126 你看这个锅,它又黑有重
    @skyeycirno 有时间一定要分享一下
    @hoyixi 《那些一行代码就能解决的事儿》
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5866 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 01:56 PVG 09:56 LAX 18:56 JFK 21:56
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86