首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  程序员

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

  •  
  •   wikinee · 100 天前 · 4626 次点击
    这是一个创建于 100 天前的主题,其中的信息可能已经有所发展或是发生改变。

    转自阮一峰推特

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

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

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

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

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

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