V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
wikinee
V2EX  ›  程序员

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

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

    转自阮一峰推特

    七月初,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
    当你有一个问题,想用正则解决时,你就有两个问题了。
    keith1126
        5
    keith1126  
       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
    反正我绝不在一个正则里写多个 .*
    因为我自己都会看不懂了。
    xiadong1994
        8
    xiadong1994  
       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,你为什么不怀疑呢
    keith1126
        14
    keith1126  
       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
    嗯,测试了一下,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   ·   实用小工具   ·   5766 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 06:38 · PVG 14:38 · LAX 22:38 · JFK 01:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.