В инфраструктуре Cloudflare обнаружилась уязвимость, при которой новый клиент мог получить фрагменты информации, оставленные предыдущей рабочей нагрузкой на том же физическом сервере. Платные пользователи 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 проверила историю дисковых операций и не обнаружила признаков реальной эксплуатации за пределами тестов и внутренних проверок. Для крупной облачной платформы такие проблемы критичны — вокруг Cloudflare уже шли дебаты о границах защиты между клиентами.
Исследователь Орен Йомтов сообщил об уязвимости 4 сентября. Cloudflare отключила skip_block_zeroing и к 7 сентября выпустила первое исправление, но простой смены настройки оказалось недостаточно. Старые блоки оставались привязаны к работающим дискам и кэшированным образам, поэтому компания пересоздала диски, очистила кэши и перезагрузила виртуальные машины. Полная очистка завершилась 19 сентября. Клиентам не требовались никакие действия.
Несколькими днями раньше похожая проблема с изоляцией обнаружилась в Docker Sandboxes. Там ошибка позволяла коду выходить за границы разрешённого каталога и обращаться к файлам хоста macOS.
Для Cloudflare это была не первая проблема с безопасностью. Ранее украденный API-ключ позволил атакующим развернуть Worker и использовать платформу для заражения примерно 100 тысяч сайтов.
В январе вокруг сервиса разгорелась ещё одна архитектурная проблема. Обнаружилось спорное поведение Universal SSL и CAA, которое ослабляло ограничения на выпуск сертификатов для миллионов доменов.
