V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
wikinee
V2EX  ›  程序员

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

  •  
  •   wikinee · Jul 13, 2019 · 7104 views
    This topic created in 2486 days ago, the information mentioned may be changed or developed.

    转自阮一峰推特

    七月初,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 replies    2019-07-15 10:50:01 +08:00
    wikinee
        1
    wikinee  
    OP
       Jul 13, 2019
    英文的看不懂了。。。
    yukiww233
        2
    yukiww233  
       Jul 13, 2019
    正则地狱
    Sylv
        3
    Sylv  
       Jul 13, 2019 via iPhone
    粗略浏览了下,其实和飞机失事一样,并不是单一问题导致的,而是一连串原因导致保险措施失效。
    caomu
        4
    caomu  
       Jul 13, 2019 via Android   ❤️ 5
    当你有一个问题,想用正则解决时,你就有两个问题了。
    zackwu
        5
    zackwu  
       Jul 13, 2019   ❤️ 9
    当初 v2 上面还有一大群人说是因为政治原因被我国攻击...

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

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

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

    另外,waf minor release 看的出来,他们用的是 jira。。。。
    UnluckyNinja
        19
    UnluckyNinja  
       Jul 13, 2019
    楼主把简化后的正则打错了
    jinliming2
        20
    jinliming2  
       Jul 13, 2019
    嗯,测试了一下,CPU i7-9700K,字符串 `'a=xxx...xxx'`(后跟 2 万个 x ),正则 `/.*.*=.*/` 需要大约 0.3 秒跑出结果。。。
    for 循环 100 次,就可以感受到速度真的很慢了。。。
    operawang
        21
    operawang  
       Jul 13, 2019
    @jinliming2 把 a=去掉再试试,文章说不匹配更耗资源。
    snw
        22
    snw  
       Jul 13, 2019
    @gam2046
    DNS 反射放大攻击了解一下。旁观者攻击了解一下。DDoS 并不需要你自己有足够大的带宽。
    现实案例见 2015 年 3 月份 GitHub 遭到的攻击。
    U2FsdGVkX1
        23
    U2FsdGVkX1  
       Jul 13, 2019
    @miaomiao888 有一部分留言像是带节奏,说白了就是没石锤的预测当真了,早就脱离怀疑范围了
    figo
        24
    figo  
       Jul 13, 2019
    @caomu z 正解
    skyeycirno
        25
    skyeycirno  
       Jul 13, 2019
    又扩大了一点黑名单,真好
    hoyixi
        26
    hoyixi  
       Jul 13, 2019
    这么长&复杂的正则,就算是我自己写的,上个厕所撒泡尿,恐怕我就忘了是神马玩意了
    wikinee
        27
    wikinee  
    OP
       Jul 14, 2019 via Android
    @UnluckyNinja 雨我无瓜,我复制过来的,被吞掉了
    wikinee
        28
    wikinee  
    OP
       Jul 15, 2019
    @keith1126 你看这个锅,它又黑有重
    @skyeycirno 有时间一定要分享一下
    @hoyixi 《那些一行代码就能解决的事儿》
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2436 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 97ms · UTC 09:04 · PVG 17:04 · LAX 02:04 · JFK 05:04
    ♥ Do have faith in what you're doing.