Новости · Безопасность

Критическая брешь в node-tar: крошечный gzip-архив кладёт сервер

Библиотека node-tar — стандартный инструмент распаковки tar-архивов в экосистеме Node.js, через который проходят миллионы установок npm-пакетов каждый день. 8 июля 2026 в ней закрыли критическую уязвимость: специально собранный маленький gzip-архив при распаковке разворачивается в гигантский объём данных и полностью исчерпывает диск и процессор сервера.

Коротко: CVE-2026-59873 (CVSS 9.2) в node-tar до версии 7.5.19 — классическая «декомпрессионная бомба». Библиотека не ограничивала объём распакованных данных, число файлов и коэффициент сжатия, поэтому архив в пару килобайт мог занять весь диск. Исправлено в 7.5.19: нужно обновиться.

11 июля 2026 Редакция LoadFile Чтение 5 мин
Маленький архив, разлетающийся потоком данных — декомпрессионная бомба
Содержание
  1. Что произошло
  2. Что такое декомпрессионная бомба
  3. Вторая брешь: бесконечный разбор архива
  4. Кого это касается
  5. Что делать
  6. Источники

Что произошло

8 июля 2026 в популярной библиотеке node-tar (пакет tar в npm, сопровождает разработчик Айзек Шлютер) раскрыли и закрыли критическую уязвимость CVE-2026-59873. По оценке базы CVE, ей присвоен рейтинг CVSS 9.2 — «критический», класс — CWE-770 «выделение ресурсов без ограничений».

Суть проблемы: во всех версиях до 7.5.19 библиотека не устанавливала жёстких верхних пределов на общий объём распакованных данных, количество записей в архиве и коэффициент сжатия. Из-за этого небольшой gzip-архив, собранный злоумышленником, при распаковке в модуле src/extract.ts мог занять весь диск и загрузить процессор, вызвав отказ в обслуживании.

!
Опасность не в самих данных, а в объёме

Уязвимость не даёт злоумышленнику выполнить код или прочитать чужие файлы — она приводит к отказу в обслуживании (denial of service): сервис, который принимает и распаковывает архивы, просто перестаёт отвечать.

Что такое декомпрессионная бомба

Декомпрессионная бомба (её же называют zip-бомбой или, применительно к gzip, gzip-бомбой) — это архив, который занимает считанные килобайты на диске, но при распаковке разворачивается в гигабайты или терабайты данных. Приём известен десятилетиями: он использует свойство алгоритмов сжатия сильно ужимать однообразные данные — например, длинную цепочку одинаковых байтов.

Если программа при распаковке слепо доверяет содержимому и не проверяет, сколько данных она уже записала, такой архив исчерпывает свободное место или память. Защита от бомбы — это лимиты: программа должна прерывать распаковку, когда объём или коэффициент сжатия выходит за разумные рамки. Именно этих лимитов в node-tar и не хватало.

В версии 7.5.19 разработчик добавил ограничители. Появился параметр maxDecompressionRatio (по умолчанию 1000) — максимальное отношение распакованных байтов к сжатым; при превышении распаковка прекращается. Также действует ограничение глубины вложенных папок maxDepth (по умолчанию 1024): всё, что глубже, пропускается с предупреждением. Это стандартный набор мер против архивов-бомб.

Вторая брешь: бесконечный разбор архива

Вместе с «бомбой» в node-tar закрыли и смежную проблему — CVE-2026-59874 (исправлена в версии 7.5.18). Функция tar.replace принимала tar-заголовок с корректной контрольной суммой, но с отрицательным размером записи, закодированным в формате base-256. Из-за этого сканер архива «зацикливался»: он не продвигался вперёд и снова и снова разбирал одну и ту же запись.

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

Кого это касается

node-tar — не пользовательский архиватор вроде WinRAR или 7-Zip, а библиотека для разработчиков. Но зона её влияния огромна: пакет tar входит в зависимости самого npm и множества инструментов сборки, поэтому он установлен практически в любом проекте на Node.js.

Реальный риск возникает там, где сервер распаковывает архивы, полученные извне: загрузка пользователями, приём артефактов в CI/CD, обработка пакетов из недоверенных реестров. Для таких сценариев маленький вредоносный .tar.gz — это готовый инструмент для «положить» сервис. Если приложение распаковывает только собственные, заведомо доверенные архивы, риск ниже, но обновиться всё равно стоит.

i
Файловый контекст

Формат tar.gz — это связка: архив .tar объединяет файлы, а gzip сжимает результат. Как устроен и чем открыть такой архив, разбираем в гайде чем открыть TAR.GZ.

Что делать

  1. Обновите пакет tar до версии 7.5.19 или новее — это закрывает обе уязвимости. Проверить установленную версию можно командой npm ls tar.
  2. Пересоберите зависимости и обновите lock-файл, чтобы уязвимая версия не «подтянулась» транзитивно из другого пакета.
  3. Прогоните npm audit — он покажет, где в дереве зависимостей остаётся старая версия node-tar.
  4. Если обновиться прямо сейчас нельзя, задайте распаковке разумные лимиты вручную и не распаковывайте архивы из недоверенных источников без проверки размера.

Тема разбора недоверенных архивов на сервере шире одной библиотеки. О том, как безопасно принимать и проверять файлы, — в разделе безопасность файлов. Близкие сюжеты последних недель: ClamAV закрыл семь уязвимостей в парсерах файлов и WinRAR 7.23 исправил уязвимость архивов — все они об одном: разбор чужих файлов остаётся частым источником проблем.

Источники

Данные приведены на 11 июля 2026 по материалам GitHub Security Advisory и базы CVE. Рейтинг CVSS и номера версий указаны по первоисточникам.

Читайте также