Критическая уязвимость в Node.js: use-after-free вело к удалённому выполнению кода

Исследователь безопасности Мэттью Дуглас (Matthew Douglass) обнаружил в Node.js опасную уязвимость типа use-after-free, которой присвоили высокий уровень серьёзности и идентификатор CVE-2021-22930. Разработчики платформы уже выпустили исправление, но до его установки атакующие могли использовать баг для аварийного завершения приложений и, в худшем случае, для удалённого выполнения кода.

В чём суть проблемы

Уязвимости класса use-after-free возникают, когда программа обращается к участку памяти, который уже был освобождён и не содержит актуальных данных. Команда Node.js официально описала баг так: «Use-after-free on close http2 on stream canceling (High) (CVE-2021-22930)».

По данным экспертов, эксплуатация этой уязвимости могла привести к:

  • повреждению данных;
  • аварийному завершению приложений;
  • нестандартному, непредсказуемому поведению программ;
  • удалённому выполнению произвольного кода (RCE).

Как срабатывал баг

Проблема проявлялась при обработке входящих кадров RST_STREAM в модуле, отвечающем за протокол HTTP/2, — если Node.js получал такой кадр без кода ошибки или отмены. Кадр RST_STREAM используется в HTTP/2-приложениях для принудительного завершения соединения: например, когда клиент хочет прервать связь с сервером, он отправляет именно такой кадр.

Если сервер получает RST_STREAM с кодом отмены (nghttp2_cancel), он пытается принудительно очистить («force purge») уже полученные, но ещё не обработанные данные — и именно на этом этапе возникала ошибка обращения к освобождённой памяти.

Патчи уже доступны

Исправление вошло в самый свежий на тот момент релиз Node.js 16.6.0, а также было бэкпортировано в поддерживаемые LTS-ветки:

  • Node.js 12.22.4 (LTS);
  • Node.js 14.17.4 (LTS);
  • Node.js 16.6.0 (Current).

Даниэль Бевениус (Daniel Bevenius), главный инженер Red Hat и член технического руководящего комитета (TSC) проекта Node.js, прокомментировал скорость выпуска патча: «Обычно мы стараемся заранее предупреждать о выходе релизов, содержащих исключительно исправления безопасности. Но поскольку информация об этой уязвимости уже стала публичной, мы посчитали более важным как можно быстрее выпустить фикс в рамках уже запланированных релизов».

Что делать пользователям

Специалисты по кибербезопасности настоятельно рекомендуют всем, кто использует Node.js, как можно скорее обновиться до одной из перечисленных версий — актуальной 16.6.0 либо соответствующей патченной сборки в ветках 12.x или 14.x LTS. Учитывая широкое распространение Node.js в серверных и веб-приложениях, задержка с обновлением оставляет открытым путь к падению сервисов и потенциальной компрометации инфраструктуры.

Источник: Cybersecurity News.