Уязвимости в Node.js и libuv

Доступны корректирующие выпуски серверной JavaScript-платформы Node.js 21.6.2, 20.11.1, 18.19.1, в которых исправлено 8 уязвимостей, из которых 4 присвоен высокий уровень опасности:

  • CVE-2024-21892 — возможность подстановки непривилегированным пользователем кода, наследующего расширенные привилегии, с которыми выполняется рабочий процесс. Уязвимость вызвана ошибкой в реализации исключения, позволяющего в процессе с расширенными привилегиями обрабатывать переменные окружения, выставленные непривилегированным пользователем. Исключение должно было предоставляться только для полномочий CAP_NET_BIND_SERVICE, но из-за ошибки применялось и к некоторым другими полномочиям (capabilities).
  • CVE-2024-22019 — отказ в обслуживании через исчерпание доступных ресурсов (нагрузка на CPU и расходование пропускной способности) при обработке встроенным HTTP-сервером
    специально оформленных chunked-запросов, приводящих к чтению неограниченное количества байтов в одном соединении.

  • CVE-2024-21896 — выход за границу базового каталога в файловых путях. Уязвимость позволяет обойти нормализации файловых путей при помощи path.resolve() в случае передачи пути с использованием класса Buffer. Для получения подобного пути после проверки вызывается метод Buffer.from(), но в приложении может использоваться вызов Buffer.prototype.utf8Write, приводящий к замене содержимого на стадии после выполнения path.resolve() и возникновению уязвимости.
  • CVE-2024-22017 — вызов setuid() не сбрасывал все привилегии. В частности, setuid() не влияет на операции io_uring, используемые в libuv, если они были инициализированы до вызова setuid().
  • CVE-2023-46809 — уязвимость в API privateDecrypt(), допускающая применение атаки Marvin для расшифровки RSA на основе измерения времени операций.
  • CVE-2024-21891 — возможность обхода модели прав доступа при использовании пользовательских обработчиков нормализации файловых путей.
  • CVE-2024-21890 — некорректная обработка масок в параметрах «—allow-fs-read» и «—allow-fs-write». Например, «—allow-fs-read=/home/node/.ssh/*.pub» приведёт предоставлению доступа ко всему содержимому «.ssh/», а не только к файлам с расширением «.pub», так как маска «*» обрабатывается как последний элемент пути.
  • CVE-2024-22025 — отказ в обслуживании через израсходование ресурсов при декодировании сжатых данных в формате Brotli, полученных через вызов fetch().

Дополнительно можно отметить формирование выпуска библиотеки
libuv 1.48.0, применяемой в Node.js для мультиплексирования соединений и асинхронной обработки ввода/вывода. Кроме Node.js библиотека также используется DNS-серверах BIND 9 и Knot DNS, HTTP-сервере H2O, Lua-фреймворке Luvit, виртуальной машине MoarVM, языке Julia и Python-фреймворке uvloop. В новой версии устранена уязвимость (CVE-2024-24806), проявляющаяся в проектах, использующих libuv, и позволяющая осуществить атаку SSRF (Server-side request forgery) для получения доступа к внутреннему API. Уязвимость возникла из-за обрезания имени хоста функцией uv_getaddrinfo() до 256 символов на этапе до резолвинга домена через функцию getaddrinfo(), что может привести к определению не того IP-адреса и обходу проверок. Например, сервисы типа MySpace, создающие поддомены вида «username.example.com», можно атаковать через указание длинного имени пользователя.

Также вышло обновление используемого в Node.js HTTP-клиента undici 5.28.3, в котором устранена уязвимость (CVE-2024-24758), вызванная отсутствием очистки HTTP-заголовка Proxy-Authorization при перенаправлении запросов.

Источник: http://www.opennet.ru/opennews/art.shtml?num=60612