4,6K подписчиков

Уязвимость в Fluent Bit, затрагивающая многих облачных провайдеров

В открытом проекте Fluent Bit выявлена уязвимость (CVE-2024-4323),  позволяющая удалённо добиться повреждения памяти, что можно  использовать для вызова отказа в обслуживании, утечки данных и ...

В открытом проекте Fluent Bit выявлена уязвимость (CVE-2024-4323), позволяющая удалённо добиться повреждения памяти, что можно использовать для вызова отказа в обслуживании, утечки данных и потенциально выполнения своего кода на сервере. Проблема, которой присвоено кодовое имя "Linguistic Lumberjack", имеет критический уровень опасности (9.8 из 10). Уязвимость проявляется начиная с версии 2.0.7 и устранена в корректирующих обновлениях 2.2.3 и 3.0.4.

Fluent Bit насчитывает более 10 миллиардов внедрений и применяется для обработки и сбора логов и метрик во многих компаниях и облачных платформах, например, среди пользователей отмечаются Google Cloud, AWS, DigitalOcean, vmWare, Cisco, Microsoft, Lyft, LinkedIn, Walmart, Couchbase, Swift и Dell. В течение марта было загружено 13 млн Docker-образов с Fluent Bit. По данным компании Tenable, выявившей уязвимости, многие облачные сервисы не блокируют доступ к Web API для получения внутренних метрик, таких как uptime, и для обработки обращений к подобным API используется Fluent Bit.

Уязвимость вызвана ошибкой во встроенном HTTP-сервере, проявляющейся при обработке внешних запросов через API-вызовы "/api/v1/traces" и "/api/v1/trace", позволяющие пользователям получать информацию о настроенных трассировках. Независимо от включения трассировки пользователь имеет возможность обратиться к данным API, если ему предоставлен соответствующий доступ. Во время разбора входящих запросов типы некоторых входных полей, передаваемых через массив в блоке JSON, определялись неверно и независимо от ожидаемого типа поля интерпретировались как тип MSGPACK_OBJECT_STR. Указание в массиве входных данных нестроковых значений, например, целочисленных параметров, приводило к повреждению памяти из-за того, что функция flb_sds_create_len() извлекала переданное целочисленное значение как поле с размером строки.

Пример запроса, вызывающего аварийное завершение:

python3 -c 'print("{\"output\":\"stdout\", \"params\": {\"format\": \"json\"},\"inputs\":[\"" + "A"*8 + "\"," + str(0xffffffff) + ", \"" + "B"*500 + "\"]}")' > test
curl -v http://:2020/api/v1/traces/ -H "Content-Type: application/json" -H "Expect: " --data "@test"

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