Регулярное выражение обрушило Cloudflare. На 27 минут.
2 июля 2019 года, 13:42 UTC: новое правило для брандмауэра веб-приложений Cloudflare вводится в действие в более чем 180 городах примерно за две секунды.
2 июля 2019 года, 13:42 UTC: новое правило для брандмауэра веб-приложений Cloudflare вводится в действие в более чем 180 городах примерно за две секунды. Это правило XSS в режиме симуляции, поэтому оно ничего не блокирует, но все равно выполняется при каждом запросе и заканчивается на .*(?:.*=.*). PCRE откатывается назад, каждое ядро ЦП, обслуживающее HTTP-запросы, загружается на 100%, и каждый сайт, проксированный через Cloudflare, возвращает 502 ошибку в течение 27 минут; трафик падает на 82%. Аварийный выключатель находится за Cloudflare Access, который находится за Cloudflare. Вскрытие, из собственного отчета Cloudflare: защита ЦП, удаленная неделями ранее при рефакторинге, предназначенном для экономии ЦП, процедура, позволяющая любому правилу пропускать этап тестирования, движок без гарантии сложности, 11 причин и 7 исправлений. Вердикт по исправлению: SHIP IT.
Читать письменное издание (на английском) ↗
Что освещается в этом видео
- 13:31–13:42 UTC: PR объединен, CI зеленый (без теста ЦП), Quicksilver отправляет правило в более чем 180 городов; правила WAF пропускают этапы DOG → PIG → Canary
- 13:45–14:07: первая страница; ЦП 100% по всему миру, трафик −82%, 502 ошибки повсюду; внутренняя панель управления находится за Cloudflare Access, который не работает; срок действия некоторых учетных данных истек; редко используемый обходной путь
- 14:07–14:09: глобальное отключение WAF; трафик и ЦП в норме через 27 минут; 14:52 WAF возвращается без правила
- 2 июля (15:50 UTC) и 12 июля: Cloudflare публикует записку в тот же день и полный отчет о происшествии; защита ЦП снова добавлена, 3 868 правил перечитаны, поэтапное развертывание, переход на движок регулярных выражений с линейным временем выполнения
Переведенная стенограмма
Переведено с оригинального английского повествования. Доступные аудио и субтитры контролируются YouTube.
0:00 Одно регулярное выражение одновременно запускается на каждом сервере Cloudflare, и в течение следующих двадцати семи минут сайты, находящиеся за ним, представляют собой страницу с ошибкой 502, что для брандмауэра является максимально строгой настройкой. 2 июля 2019 года, 13:42 UTC. Cloudflare публикует сообщение в течение двух часов: не атака, а неудачное развертывание, трафик снизился на 82 процента. Десять дней спустя технический директор Джон Грэм-Камминг публикует полный отчет о происшествии, включая регулярное выражение, и Hacker News дает ему 698 баллов,
0:26 что для сбоя является овацией стоя. Как это происходит, почему это возможно, и кто на самом деле виноват. Это The Daily Diff, постмортем. 13:31. Объединен запрос на слияние: одно новое правило брандмауэра против межсайтового скриптинга, в режиме симуляции, поэтому оно ничего не блокирует. 13:37, тесты пройдены; ни один не измеряет ЦП. 13:42, правило отправляется в 180 городов за две секунды, потому что правила WAF пропускают этапы dog, pig и canary, которые проходят другие релизы.
0:54 13:45, первая страница. 13:49, на Hacker News есть ветка о странице состояния, которая до сих пор говорит, что все системы работают. Правило заканчивается на точка-звезда, точка-звезда, равно, точка-звезда: что угодно, затем что угодно, затем знак равенства. PCRE жадно угадывает, терпит неудачу и откатывается назад по каждому другому разделению. x равно x занимает 23 шага. Двадцать x после равенства: 555.
1:15 Двадцать x, без знака равенства: 4 067 шагов, чтобы ничего не найти. Запустите это при каждом запросе, и каждое ядро будет загружено на сто процентов, тщательно ничего не делая. Два охранника должны были это заметить. Лимит ЦП для правил был удален по ошибке неделями ранее, в рефакторинге, предназначенном для уменьшения использования ЦП брандмауэром. И процедура позволяет любому правилу пропускать этап тестирования, потому что правила существуют для остановки активных атак; это не было чрезвычайной ситуацией, и все равно стало глобальным.
1:37 14:00, WAF идентифицирован; атаки нет. 14:02, кто-то предлагает глобальное отключение: один компонент, выключен, по всему миру. Выключатель находится за Cloudflare Access. Cloudflare Access находится за Cloudflare. Срок действия некоторых учетных данных истек из-за неиспользования, поэтому самая быстрая сеть в интернете тратит пять минут на обходной путь, который никто не отрабатывал. 14:07, отключение. 14:09, трафик в норме. git blame: развертывание с одной скоростью, глобальное; защита ЦП случайно удалена при рефакторинге;
2:04 движок регулярных выражений без верхней границы. Не инженер, написавший правило: в отчете о происшествии перечислено одиннадцать причин и никого не называют. Радиус поражения: 27 минут, 82 процента трафика, 100 процентов загрузки ЦП на каждом ядре, в каждом городе. Панель управления и API находятся за тем же граничным узлом, поэтому клиенты не могут даже отключить его. Hacker News, под отчетом о происшествии: у них была одна проблема, использовали регулярное выражение, теперь у них две. Старая шутка. Все еще компилируется.
2:28 Вердикт, постмортем: SHIP IT. Защита ЦП восстановлена, все 3868 правил считываются вручную, правила проходят через этап тестирования, и движок переходит на тот, что с линейным временем гарантиями, опубликованный Кеном Томпсоном в 1968 году. Понедельник: никаких точка-звезда точка-звезда в том, что выполняется при каждом запросе, и держите аварийный выключатель подальше от того, что он отключает. Пришлите мне инцидент, о котором вам до сих пор не разрешено говорить, в комментариях или на daily diff dot dev.
2:53 И это на сегодня всё. Я Нико из Axrisi. Объединяйте ответственно.
Источники
- John Graham-Cumming, "Details of the Cloudflare outage on July 2, 2019" (Jul 12, 2019)blog.cloudflare.com
- Matthew Prince, "Cloudflare outage caused by bad software deploy (updated)" (Jul 2, 2019)blog.cloudflare.com
- Matthew Prince on X, Jul 2, 2019, 14:22 UTCx.com
- Matthew Prince on X, Jul 2, 2019, 14:36 UTC ("No evidence yet attack related")x.com
- Hacker News, Jul 2, 2019, 13:49 UTC — "Cloudflare Network Performance Issues" (631 points)news.ycombinator.com
- Hacker News, Jul 2, 2019 — "Cloudflare outage caused by bad software deploy" (348 points)news.ycombinator.com
- Hacker News, Jul 12, 2019 — "Details of the Cloudflare outage on July 2, 2019" (698 points)news.ycombinator.com
- TechCrunch, Jul 2, 2019techcrunch.com



