Удалённый контейнер должен исчезать вместе со своими временными данными, но в инфраструктуре Cloudflare часть информации могла пережить прежнего владельца дискового блока. Компания устранила уязвимость в Cloudflare Containers, которая позволяла клиенту с платной учётной записью Workers получить фрагменты данных от контейнеров других клиентов, ранее работавших на том же физическом сервере.
Cloudflare Containers запускает каждую рабочую нагрузку внутри отдельной виртуальной машины Firecracker и предоставляет ей виртуальный диск через Linux device mapper с механизмом thin provisioning. Такая архитектура экономит место, выделяя физические блоки только по мере записи. Проблема затронула именно этот слой хранения, а не классический «побег» из контейнера.
Диски делились на блоки размером 64 КиБ. После удаления контейнера занятые блоки возвращались в общий пул и могли достаться другому клиенту. В конфигурации Cloudflare присутствовал параметр skip_block_zeroing, который отключал очистку блока перед повторной выдачей.
Специалисты Accomplish показали простой сценарий. Новый контейнер записывал лишь 4 КиБ в свободную область, получал ранее использованный физический блок и затем считывал все 64 КиБ напрямую с устройства. Новая запись заменяла первые 4 КиБ, а оставшиеся 60 КиБ могли содержать чужие данные. Случай вновь показывает, насколько критичны детали изоляции в средах, где на одной инфраструктуре работают независимые клиенты.
Во время производственных тестов остаточные данные обнаружились в 18 из 24 размещений и на 20 из 22 физических узлов в четырёх регионах мира. Среди восстановленных фрагментов встречались структуры каталогов, страницы баз данных и целые SQLite-базы. Проверка файловой системы также выявила 2700 inode каталогов, относившихся к чужим файловым системам.
Атака не позволяла выбрать конкретного клиента, сервер или набор файлов и не давала доступа к активному диску другого контейнера. Специалисты также не показали возможность менять чужие данные или нарушать работу нагрузки. Cloudflare проверила доступную историю дисковых операций и не нашла признаков эксплуатации за пределами тестов Accomplish и собственных инженеров. Подобные проблемы особенно чувствительны для крупной облачной платформы, вокруг которой уже возникали вопросы о границах защиты между клиентами.
Орен Йомтов из Accomplish сообщил об уязвимости 4 сентября через программу вознаграждений Cloudflare. Компания отключила skip_block_zeroing и к 7 сентября развернула первое исправление, но одной смены настройки оказалось недостаточно. Старые блоки оставались привязаны к работающим дискам и кэшированным слоям образов, поэтому Cloudflare также пересоздала диски, очистила кэши и перезапустила виртуальные машины. Полную очистку компания завершила 19 сентября. Клиентам ничего менять самостоятельно не требуется, следует из технического разбора Cloudflare.
За несколько дней до раскрытия этой уязвимости похожий вопрос о надёжности изоляции возник вокруг Docker Sandboxes. Ошибка позволяла коду внутри песочницы выходить за пределы разрешённого каталога и обращаться к файлам macOS-хоста, что вновь показало цену одной слабой границы в изолированной среде.
Сама инфраструктура Cloudflare недавно оказалась частью другого крупного инцидента. Украденный API-ключ позволил атакующим развернуть Worker и использовать доверенную платформу для заражения примерно 100 тысяч сайтов.
В январе вокруг Cloudflare возникла ещё одна архитектурная история. Специалист обнаружил спорное поведение Universal SSL и CAA, которое могло ослаблять ограничения на выпуск сертификатов для миллионов доменов.
