Как подключить Cloudflare

Обращение Cloudflare с уязвимостью RCE в cdnjs

cdnjs предоставляет ресурсы JavaScript, CSS, изображений и шрифтов для ссылок на веб-сайтах с более чем 4000 доступных библиотек. Используя cdnjs, веб-сайты могут загружаться быстрее с меньшей нагрузкой на собственный исходный сервер, поскольку файлы обслуживаются непосредственно с периферии Cloudflare. Недавно в блоге подробно описана уязвимость в том, как бэкэнд cdnjs автоматически поддерживает библиотеки в актуальном состоянии.

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

Эта уязвимость не связана с Cloudflare CDN. В cdnjs проект — это платформа, которая использует сервисы Cloudflare, но уязвимость, описанная ниже, относится к cdnjsтолько платформа. Чтобы было ясно, никакие существующие библиотеки не были изменены с помощью этого эксплойта. Исследователь опубликовал новый пакет, который продемонстрировал уязвимость, и наше расследование пришло к выводу, что целостность всех активов, размещенных на cdnjs, осталась неизменной.

График раскрытия информации

Как указано в сообщении блога RyotaK, инцидент начался 6 апреля 2021 года. Примерно в 11:00 по Гринвичу RyotaK опубликовал пакет для npm, использующий уязвимость. В 11.29 по Гринвичу cdnjs обработал этот пакет, что привело к утечке учетных данных. Это вызвало оповещение GitHub, которое уведомило Cloudflare о раскрытых секретах.

Cloudflare отключил службу автообновления и отозвал все учетные данные в течение часа. Тем временем наша группа безопасности получила отчет об удаленном выполнении кода RyotaK через HackerOne. Новая версия инструмента автоматического обновления, которая предотвращает использование уязвимости, о которой сообщает RyotaK, была выпущена в течение 24 часов.

Немедленно приняв меры для предотвращения эксплуатации, мы приступили к переработке конвейера автоматического обновления. Работы по его полной реконструкции были завершены 03.06.2021.

Блокировка эксплуатации

До того, как RyotaK сообщил об уязвимости через HackerOne, Cloudflare уже принял меры. Когда GitHub уведомил нас об утечке учетных данных, один из наших инженеров немедленно принял меры и отозвал их все. Кроме того, токен GitHub, связанный с этой службой, был автоматически отозван GitHub.

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

Расследование

Любое расследование требует доступа к журналам, и все компоненты нашего конвейера создают обширные журналы, которые оказываются ценными для криминалистических исследований. Журналы, созданные в процессе автоматического обновления, собираются в репозитории GitHub и отправляются в наш конвейер журналов. Мы также собираем и храним журналы из учетной записи Cloudflare cdnjs. Наша группа безопасности начала изучать эту информацию, как только мы получили первоначальный отчет RyotaK. Основываясь на журналах доступа, использовании токенов API и метаданных модификации файлов, мы уверены, что только RyotaK использовал эту уязвимость во время своего исследования и только в тестовых файлах. Чтобы исключить злоупотребления, мы просмотрели список исходных IP-адресов, которые обращались к токену Workers KV до его отзыва, и нашли только один, принадлежащий боту автоматического обновления cdnjs.

Команда cdnjs также проверила файлы, которые были помещены в репозиторий cdnjs / cdnjs на GitHub примерно в то время, и не обнаружила никаких доказательств каких-либо других злоупотреблений в cdnjs.

Устранение уязвимости

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

Мы решили проблему обхода пути, проверив, что место назначения каждого файла в архиве будет содержаться в целевом каталоге, который процесс обновления назначил для этого пакета. Если полный канонический путь к файлу не начинается с полного пути к каталогу назначения, мы регистрируем это как предупреждение и пропускаем извлечение этого файла. Это работает довольно хорошо, но, как отмечено в комментарии выше этой проверки, если сжатый файл использует кодировку UTF-8 для имен файлов, эта проверка может некорректно канонизировать путь. Если эта канонизация не происходит, путь может содержать обход пути, даже если он начинается с правильного пути назначения.

Чтобы гарантировать, что другие уязвимости в конвейере публикации cdnjs не могут быть использованы, мы настроили для него профиль AppArmor. Это ограничивает возможности службы, поэтому, даже если злоумышленник успешно проинструктировал процесс выполнить действие, операционная система (ядро / функция безопасности) не разрешит никаких действий, выходящих за рамки разрешенных.

Для иллюстрации вот пример:

/path/to/bin {
  network,
  signal,
  /path/to/child ix,
  /tmp/ r,
  /tmp/cache** rw,
  ...
}

В этом примере мы разрешаем только двоичному файлу (/ path / to / bin):

Любая попытка получить доступ к чему-либо еще будет отклонена. Вы можете найти полный список возможностей и дополнительную информацию на странице руководства AppArmor.

В случае инструмента автообновления cdnjs мы ограничиваем выполнение приложений очень конкретным набором, и мы ограничиваем, где файлы могут быть записаны.

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

Редизайн системы

Основная идея редизайна конвейера заключалась в отказе от монолитного процесса автоматического обновления. Вместо этого различные операции выполняются с использованием микросервисов или демонов с четко определенными областями действия. Вот обзор шагов:

Обращение Cloudflare с уязвимостью RCE в cdnjs

Во-первых, для обнаружения новых версий библиотеки регулярно запускаются два демона (для обновлений на основе как npm, так и git). После обнаружения новой версии файлы будут загружены в виде архива и помещены во входящую корзину хранилища.

Запись новой версии во входящую корзину запускает функцию, которая добавляет всю информацию, необходимую для обновления библиотеки. Функция также генерирует подписанный URL-адрес, позволяющий записывать в исходящую корзину, но только в определенную папку для данной библиотеки, уменьшая радиус взрыва. Наконец, в очередь помещается сообщение, указывающее, что новая версия данной библиотеки готова к публикации.

Демон прослушивает входящие сообщения и порождает непривилегированный контейнер Docker для обработки опасных операций (извлечение архива, минификация и сжатие). После выхода из песочницы демон будет использовать подписанный URL-адрес для хранения обработанных файлов в исходящей корзине хранилища.

Наконец, когда завершенный пакет записывается в исходящую корзину, запускаются несколько демонов. Эти демоны публикуют ресурсы на cdnjs.cloudflare.com и в основном репозитории cdnjs. Демоны также публикуют URL-адрес версии, криптографический хэш и другую информацию в Workers KV, cdnjs.com и API.

В этом измененном дизайне аналогичная уязвимость может эксплуатироваться в контексте песочницы (контейнера Docker). У злоумышленника будет доступ к файлам-контейнерам, но больше ни к чему. Контейнер минимален, недолговечен, не содержит секретов и предназначен для одного обновления библиотеки, поэтому он не может повлиять на файлы других библиотек.

Наша приверженность безопасности

Помимо поддержки программы раскрытия уязвимостей, мы регулярно проводим внутренние проверки безопасности и нанимаем сторонние фирмы для аудита разрабатываемого нами программного обеспечения. Но именно благодаря нашей программе раскрытия уязвимостей мы получаем одни из самых интересных и творческих отчетов. Каждый отчет помог нам повысить безопасность наших услуг. В этом случае мы работали с RyotaK не только над устранением уязвимости, но и над тем, чтобы их сообщение в блоге было подробным и точным. Мы приглашаем тех, кто обнаружит проблему безопасности в любом из сервисов Cloudflare, сообщить нам об этом через HackerOne.

Что такое Cloudflare