Кратко

  • Открытый в Интернет memcached по UDP мог принять короткий запрос с поддельным адресом жертвы и отправить этой жертве ответ, превосходивший запрос в тысячи раз.
  • Защита не свелась к одному центру: memcached 1.5.6 выключил UDP по умолчанию, сети доступа могли отбрасывать ложные источники, а GitHub сам управлял обнаружением, BGP-переключением и выбранным каналом очистки.

Что произошло за девять минут

28 февраля 2018 года GitHub.com был недоступен с 17:21 до 17:26 UTC, а до 17:30 работал с перебоями. GitHub сообщил, что конфиденциальность и целостность данных не подвергались риску.

Атака пришла из десятков тысяч точек более чем в тысяче автономных систем. Пик составил 1,35 Тбит/с и 126,9 млн пакетов в секунду. Это измерения GitHub для конкретного инцидента, а не пересчёт лабораторного коэффициента усиления.

В 17:21 система мониторинга обнаружила необычное отношение входящего трафика к исходящему. Когда входящий транзит на одной площадке превысил 100 Гбит/с, GitHub решил перевести поток к Akamai. В 17:26 команда через ChatOps отозвала BGP-анонсы у транзитных провайдеров и стала анонсировать AS36459 только через соединения с Akamai. После сходимости маршрутов ACL на границе Akamai смягчили атаку; в 17:30 GitHub зафиксировал полное восстановление.

В 17:34 компания отозвала и маршруты на точках обмена, уведя ещё 40 Гбит/с. Вскоре после 18:00 произошёл второй всплеск примерно до 400 Гбит/с. GitHub заявил, что изучит автоматическое подключение поставщиков DDoS-защиты для сокращения времени восстановления. Это зафиксированное намерение, а не доказательство последующего внедрения.

Хронология показывает реальную власть жертвы. GitHub не мог во время атаки закрыть десятки тысяч удалённых кэшей. Он мог наблюдать собственную границу, менять собственные анонсы, выбирать партнёра и проверять возвращение сервиса.

Как короткий запрос расходовал чужой канал

Memcached предназначался для быстрого кэширования внутри доверенной прикладной сети. UDP не устанавливает соединение до ответа. Если такой сервис доступен из Интернета, адрес в поле источника принимается как адрес возврата без доказательства, что отправитель им владеет.

Cloudflare описал практическую схему. Сначала атакующий помещал большой объект в открытый кэш, затем посылал короткий get, подставив адрес жертвы. В одном тесте 15 байт вызвали 134 КБ ответа. В отдельном наблюдении 15 байт дали 750 КБ, то есть коэффициент 51 200.

Это не универсальная величина для каждого ключа и не характеристика всего потока GitHub. Механизм, однако, очевиден: атакующий оплачивает малый исходящий запрос, оператор кэша — большой ответ, а жертва принимает незапрошенный трафик.

Для цепочки нужны два разрешения. Кэш должен отвечать недоверенному UDP, а сеть происхождения — выпускать пакет с адресом, не принадлежащим её клиенту.

Исполняемый профиль по умолчанию

Memcached 1.5.6 вышел 27 февраля. В примечаниях сказано, что основным изменением стало отключение UDP по умолчанию. Коммит заменил settings.udpport = 11211 на settings.udpport = 0 и убрал неявное включение UDP при указании только TCP-порта. Одновременно изменились тесты.

UDP не удалили. Оператор мог явно вернуть его через -U 11211. Проект сохранил локальный выбор, но перестал превращать отсутствие выбора в опасное публичное разрешение.

Номер версии всё равно не является доказательством. Параметр запуска или unit-файл способен снова открыть UDP. Старый бинарник может быть привязан к частной сети и закрыт межсетевым экраном. Проверяемый факт — отвечает ли работающий процесс на внешний UDP 11211 и сколько он отправляет.

Так выглядит Running-Code Primacy. Документ заявляет намерение, diff меняет стартовое состояние, тест защищает от регрессии, а сокет, внешний пробник и пакетная трасса подтверждают принятие изменения на конкретном узле.

Поддельный источник нужно остановить у выхода

Закрытие UDP уменьшает число усилителей. Проверка адреса источника устраняет ложь, направляющую ответы к жертве.

RFC 2827, BCP 38, рекомендует провайдеру принимать от нижестоящего клиента только трафик с префиксами, которыми тот законно пользуется. У клиентского доступа пакет, вышедший из одной сети, но назвавшийся GitHub, должен быть отброшен.

В multihoming и при асимметричной маршрутизации механизм приходится выбирать аккуратно. RFC 3704 рассматривает входные ACL, строгий RPF, feasible-path RPF и более свободные варианты. Неверный строгий фильтр может удалить законный трафик. Слабый фильтр может найти какой-то маршрут к адресу, не доказав право именно этого клиента использовать его.

Минимальная общая спецификация должна закрепить свойство: клиентская граница не экспортирует чужую исходную идентичность. Конкретная техника, обновление маршрутов, исключения и сроки остаются местным решением. Свобода выбора механизма требует измеримого результата.

Три владельца контроля

Оператор кэша показывает эффективную привязку, firewall, внешний тест и объём ответа. Сеть доступа показывает испытания против spoofing и потоковые данные. Потенциальная жертва тренирует обнаружение, BGP-переход, фильтрующую ёмкость и безопасный возврат.

Очистка спасает жертву после того, как удалённые кэши уже отправили байты. Отключение UDP убирает один отражатель, но не исправляет сеть атакующего. BCP 38 останавливает многие ложные запросы, но не создаёт для GitHub резервный маршрут. Эти доказательства дополняют, а не заменяют друг друга.

Центральный правитель не нужен. Akamai фильтровал на пути, который выбрал GitHub, но не получил постоянного права решать его маршрутизацию. Проект memcached улучшил начальную конфигурацию, не управляя пользовательскими сетями. RFC координировали практику, не настраивая ни одного маршрутизатора.

Границы доказательств

Источники подтверждают механизм, пик GitHub и изменение настройки. Они не доказывают, что каждый memcached был открыт, каждый пакет усилился в 51 200 раз или BCP 38 отсутствовал во всех исходных сетях. План автоматизации GitHub не следует выдавать за готовое внедрение.

Устойчивый вывод уже: небезопасный профиль молча разрешал машине тратить полосу ради постороннего; неотфильтрованная граница давала клиенту чужую идентичность; жертва восстановилась благодаря заранее контролируемым маршрутам. Публикация предлагает защиту. Работающий трафик показывает её принятие.

Источники