
Систематическая обратная разработка бинарного файла lina от Cisco ASA для обнаружения и анализа уязвимостей повреждения памяти, включая CVE-2025-20333 и CVE-2025-20362, с фокусом на поиск примитивов удаленного выполнения кода.
linaСоздано: 2026-08-12
Объект: lab_asav9-12-4-67/lina (ASAv 9.12(4)67, ELF x86-64, PIE; база образа Ghidra 0x100000; 112,687 функций, ~167 МБ отображено, 642,707 символов)
Цель трека: систематическое, полное RE-покрытие бинарника lina — в дополнение к целевому RE на основе гипотез, выполненному ранее, — чтобы найти примитив, который лаба ещё не нашла (неаутентифицированный root-RCE на 20362+20333 доказан in the wild, значит, он существует).
Все предыдущие RE-работы были целевыми (декомпиляции по fault-PC, обходы xref от строковых якорей, прочёсывания диапазонов биндингов). Они закрыли все проверенные области (H4-1/2/3/4, рефлексия tostring(userdata), SSH/SNMP/IKE %p, альтернативные семейства переполнений, survival-оракул) — см. , . Эти закрытия действуют в пределах своих областей; бинарника из 112k функций — именно то место, где должен жить недостающий примитив APT. Этот трек заменяет стратегию «угадай следующую поверхность» на .
../RCE_BLOCKERS.md../NEW_ROADS_TO_CODE_EXECUTION.mdПозиция относительно критического пути: жёстким барьером известной цепочки остаётся P0 (дистанционная инфоутечка в реальном времени); перечитывание за границей в CIFS readdir (шаг 19i, окно 4 байта) — единственная эмпирически подтверждённая утечка, и она остаётся основным эмпирическим треком. LINA_FULL_RE — систематическая подстраховка: найти лучшую утечку/примитив в непроверенном коде либо доказать, что её не существует.
0x55.. (lina) или 0x7f.. (libc/heap): эмиттеры форматных строк (%p/%lx/%x по указателям), перечитывания за границей (длина не ограничена инициализированными данными), отражение остатков heap, эхо неинициализированных буферов.memcpy/memmove/strcpy/strcat/sprintf/vsprintf/gets-класс + самописные циклы копирования), на всех протокольных поверхностях (не только в уже исчерпанных Lua-биндингах WebVPN — см. ../LINA_ALT_OVERFLOW_FAMILIES_RE.md).csco_config), чтобы хиты триажа можно было ранжировать по фактической достижимости с провода.(Отложено пользователем: охота за стоком CVE-2025-20363 — по данным OSINT, она потребляет утечку, сиблинг 20333; см. ../CVE-2025-20363_OSINT.md.)
| Этап | Что | Инструменты | Результат |
|---|---|---|---|
| 1. Корпус | Пакетная декомпиляция всех 112,687 функций на диск, один .c на функцию, шардировано по адресам | Ghidra run_script_inline (Java, DecompInterface), чанками + с возобновлением | corpus/<shard>/<addr>.c |
| 2. Механический триаж | ripgrep по корпусу на паттерны стоков (классы утечек и переполнений ниже) | локальные скрипты, triage/ | таблицы хитов (CSV/MD) |
| 3. Фильтр достижимости | оставить хиты в функциях, достижимых из сетевых входных точек | call-граф Ghidra (get_function_call_graph/скрипт) + список seed-точек входа | ранжированный список хитов |
| 4. Глубокий анализ | целевой RE ранжированных хитов (существующий паттерн сабагента ghidra-re) | ghidra-mcp | документы с результатами в этой папке |
Этап 1 — чисто вычислительная работа (оценка: часы–дни, без присмотра, с возобновлением). Этапы 2–3 дёшевы и локальны. Этап 4 — единственный этап, требовательный к человеку/LLM, и он ограничен воронкой.
Research notes/LINA_FULL_RE/
README.md — this file (master plan + status)
TRIAGE.md — sink-pattern catalog + reachability plan (stage 2/3 spec)
scripts/ — decompile + triage + driver scripts
corpus/ — stage-1 output: decompiled functions, sharded (corpus/2c/02c6cc80.c)
_progress.txt — resumable progress marker (done count, last address)
_errors.txt — per-function decompile failures
triage/ — stage-2/3 outputs (hit tables, ranked lists)
findings/ — stage-4 deep-dive writeups (one MD per confirmed candidate)
| Этап | Статус | Примечания |
|---|---|---|
| 1. Корпус | ГОТОВО 2026-08-12 (~19:03 UTC-4) | 111,997/111,997 функций, 0 ошибок, 548 МБ в corpus/; заняло 26,214 с (~7.3 ч) при 4.3 функции/с через scripts/decompile_all.py (GhidraMCP batch_decompile, лимит 20 функций/вызов) |
| 2. Триаж | ГОТОВО 2026-08-13 | scripts/triage_stage2.py; таблицы хитов по классам в triage/*_hits.csv; ранжированное объединение в triage/RANKED.md |
| 3. Достижимость | ГОТОВО 2026-08-13 (повторный прогон, исправленные seed-ы) | call+ref-граф корпуса (427,198 рёбер); 26,291/111,997 достижимы (23.5%) — preauth 26,278 / admin 13 / post20362 0. Seed-ы исправлены: registrar 0317b4e0, session 0317c0a0 (старые 030ab4e0/030ac0a0 не были началами функций). Всё ещё нижняя граница (vtable-ы). |
| 4. Глубокий анализ | В ПРОЦЕССЕ 2026-08-17 | L1 ЗАКРЫТО. L2 C-путь GO (статически): WebVPN UCTE create_type3_message копирует контролируемый атакующим Type-2 TargetInfo без ограничения длины; утечка возвращается обратно к HTTP-серверу атакующего внутри Type-3 Authorization: NTLM (findings/L2_NTLM_C_PATH_TYPE3.md). Lua ntlm.parseType2 — дремлющий близнец. Проход по протоколам O1/O5 ЗАКРЫТ (статически): копирования IKE/SSH/SNMP/EWS/PDTS — dest-sized, send-side или уже известные (031af6d0 / 02ff2f30). O1 «прочие» — 725 ЗАКРЫТО (статически): фильтр stack/global/param+const → новых dest-overflow GO нет; 015a8b30 — хелпер addrtype без ограничения длины, чьи вызывающие передают только AF-размер 4/0x10 (findings/O1_OTHER_SWEEP.md). O2 ЗАКРЫТО (статически): 605 достижимых циклов копирования; новых dest-overflow GO нет. FUN_02fd7270 = ucte_ntlm_authenticate_connection → тот же , что и в L2 C-пути GO (). Далее: проба NTLM в лабе (post-20362) — по окну превосходит CIFS, если появится qword /. Опционально статически: O3/O4. |
Возобновление/управление: драйвер пропускает функции, файл вывода для которых уже существует, — повторно запустите python3 scripts/decompile_all.py в любой момент, чтобы продолжить. Корректная остановка: touch corpus/STOP. Если Ghidra или MCP-плагин перезапустится, просто запустите драйвер заново.
Выявленные ограничения плагина (2026-08-12): run_script_inline отключён (GHIDRA_MCP_ALLOW_SCRIPTS не задана) → корпус использует только HTTP batch-эндпоинты; batch_decompile принимает ?functions=0x..,0x..,.. как GET-параметр запроса (не JSON-тело) и молча обрезает ответы до 20 функций → размер чанка драйвера = 20.
list_functions (проверено: corpus/02/02c6cc80.c = luaH_get = RVA 0x2c6cc80). Обратите внимание: HTTP-плагин GhidraMCP сообщает адреса в стиле RVA, а не VA Ghidra = RVA + 0x100000.../RCE_BLOCKERS.md / ../TODO.md, когда «новый» кандидат пересекается с закрытым маршрутом.0x55.. против 0x7f.. против heap) и превосходит ли она примитив CIFS readdir (шаг 19i) по надёжности.create_type3_message0x7f..0x55..