Современные реалии таковы, что не каждый бизнес может себе позволить сайт, особенно стартующий бизнес. Поэтому выгодно воспользоваться конструктором сайтов, например filandor.com . Запуск сайта через несколько минут.

В Cloudflare мы постоянно бдительны, когда дело доходит до выявления уязвимостей, которые потенциально могут повлиять на экосистему Интернета. Недавно, 12 сентября 2023 года, Google объявил о проблеме безопасности в Google Chrome под названием «Переполнение буфера кучи в WebP в Google Chrome», которая привлекла наше внимание. Поначалу это выглядело как очередная ошибка в популярном веб-браузере. Однако то, что мы обнаружили, было гораздо более важным и имело последствия, выходящие далеко за рамки Chrome.

Влияние гораздо шире, чем предполагалось

Уязвимость, отслеживаемая под номером CVE-2023-4863, была описана как переполнение буфера кучи в WebP в Google Chrome. Хотя это описание может заставить поверить, что эта проблема касается только Chrome, на самом деле все было совсем иначе. Оказалось, что это ошибка, глубоко укоренившаяся в библиотеке libwebp, которая используется не только Chrome, но и практически всеми приложениями, обрабатывающими изображения WebP.

Если копнуть глубже, то об этой уязвимости впервые сообщалось в более ранней версии CVE от Apple, CVE-2023-41064, хотя связь не была сразу очевидна. В начале сентября Citizen Lab, исследовательская лаборатория, базирующаяся на базе Университета Торонто, сообщила о явном эксплойте, который использовался для попытки установить шпионское ПО на iPhone «человека, работающего в организации гражданского общества в Вашингтоне, округ Колумбия». » Сообщение от Apple также было неполным: в нем говорилось, что это «проблема переполнения буфера в ImageIO», и что они знали, что эта проблема могла активно эксплуатироваться. Только после того, как Google выпустил CVE-2023-4863, стало ясно, что эти две проблемы связаны между собой, и что в WebP существует более широкая уязвимость.

Уязвимость позволяет злоумышленнику создать искаженный файл изображения WebP, который заставляет libwebp записывать данные за пределы буферной памяти, выделенной для декодера изображений. Записывая за допустимые границы буфера, можно изменить конфиденциальные данные в памяти, что в конечном итоге приведет к выполнению кода злоумышленника.

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

Как эксплуатируется уязвимость WebP

Разбираемся в технических деталях

Так в чем именно заключалась проблема, как ее можно было использовать и как ее закрыли? Лучшие подсказки мы можем получить, посмотрев патч, внесенный в libwebp. Этот патч исправляет потенциальную ошибку вне буфера (OOB) в части декодера изображений — таблицах Хаффмана — с двумя изменениями: дополнительной проверкой входных данных и измененной моделью динамического распределения памяти. Более глубокое погружение в libwebp и созданный на его основе формат изображений WebP показывает, что это означает.

WebP представляет собой комбинацию двух разных форматов изображений: формата с потерями, аналогичного JPEG, с использованием кодека VP8, и формата без потерь с использованием специального кодека без потерь WebP. Ошибка заключалась в обработке кодеком Хаффмана кодека без потерь.

Фундаментальная идея кодирования Хаффмана заключается в том, что использование постоянного количества битов для каждой базовой единицы информации в наборе данных (например, цвета пикселя) — не самое эффективное представление. Мы можем использовать переменное количество битов и назначать самые короткие последовательности наиболее часто встречающимся значениям, а более длинные — наименее распространённым значениям. Последовательности единиц и нулей можно представить в виде двоичного дерева с более короткими и более распространенными кодами вблизи корня, а более длинными и менее распространенными кодами — глубже в дереве. Пошаговый поиск значений в дереве выполняется относительно медленно. Практические реализации создают таблицы поиска, которые позволяют сопоставлять множество битов одновременно.

Файлы изображений содержат компактную информацию о форме дерева Хаффмана, которую декодер использует для реконструкции дерева и построения справочных таблиц для кодов. Ошибка в libwebp заключалась в коде построения справочных таблиц. Специально созданный файл WebP может содержать очень несбалансированное дерево Хаффмана, которое содержит коды гораздо длиннее, чем любой обычный файл WebP, и это заставляет функцию, генерирующую таблицы поиска, записывать данные за пределы буфера, выделенного для таблиц поиска. В Libwebp были проверки достоверности дерева Хаффмана, но перед проверкой согласованности записывались недопустимые таблицы поиска.

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

Фиксированная версия libwebp гарантирует, что входные данные всегда будут создавать действительную внутреннюю структуру, и если это так, при необходимости выделяется больше памяти, чтобы буфер всегда был достаточно большим.

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

Быстрое действие

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

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

Наши сервисы обработки изображений написаны на Rust. Мы отправили исправления для пакетов Rust, содержащих копию libwebp, и предоставили для них рекомендации RustSec (RUSTSEC-2023-0061 и RUSTSEC-2023-0062). Это гарантировало, что более широкая экосистема Rust будет информирована и сможет принять соответствующие меры.

При интересном повороте событий сканер уязвимостей GitHub быстро распознал наши отчеты RustSec как первый случай CVE-2023-4863, еще до того, как проблема привлекла широкое внимание. Это подчеркивает важность наличия надежных механизмов отчетности о безопасности и жизненно важную роль, которую такие платформы, как GitHub, играют в обеспечении безопасности сообщества открытого исходного кода.

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

Заключение

Google теперь расширил описание этой проблемы, правильно отметив, что потенциально затронуты все виды использования WebP. Первоначально это расширенное описание было зарегистрировано как еще одна новая CVE — CVE-2023-5129, но затем оно было помечено как дубликат исходного CVE-2023-4863, и описание более ранней заявки было обновлено. Этот инцидент служит напоминанием о сложной и взаимосвязанной природе экосистемы Интернета. То, что поначалу казалось проблемой, специфичной для Chrome, выявило гораздо более глубокую проблему, которая затронула почти каждый уголок цифрового мира. Этот инцидент также продемонстрировал важность быстрого сотрудничества и решающую роль, которую ответственное раскрытие информации играет в снижении рисков безопасности.

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

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