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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-89633 — PoC и цепочка эксплуатации для CVE-2026-89633 — записи за границы кучи (heap out-of-bounds write) в пути объединения SMB1 TRANS2 в Linux cifs.ko, с повышением привилегий до uid 0 через перезапись cred и алиасинг PTE. | Kitploit
Инструменты/GitHubGitHub/woshigenm/cve-2026-89633
Безопасность AndroidПовышение привилегийКриминалистика памятиАнализ уязвимостейЭксплуатацияСтатьи и ИсследованияЭксплуатация Бинарных Файлов
GitHubwoshigenm/cve-2026-89633

CVE-2026-89633

PoC и цепочка эксплуатации для CVE-2026-89633 — записи за границы кучи (heap out-of-bounds write) в пути объединения SMB1 TRANS2 в Linux cifs.ko, с повышением привилегий до uid 0 через перезапись cred и алиасинг PTE.

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

Популярное

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

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

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

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

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

CVE-2026-89633 — cifs SMB1 coalesce_t2 запись за границей кучи

English | 简体中文

Исследовательский PoC/EXP для записи за границей кучи в SMB1-клиенте cifs.ko ядра Linux. Вредоносный SMB1-сервер управляет DataOffset во вторичном ответе TRANS2, и coalesce_t2() копирует 8-байтовую вторичную полезную нагрузку в &primary->Protocol + DataOffset + accumulated без какой-либо проверки границ назначения. Место назначения копирования — куда бы сервер его ни направил, относительно буфера ответа (server->bigbuf).

В этом репозитории хранятся две демонстрации с разными ролями; они не являются взаимозаменяемыми:

  • POC — вызвать запись за границей и наблюдать её: вредоносный SMB1-сервер плюс TCP-прокси, который патчит DataOffset во время выполнения.
  • EXP 1 (минимальный примитив) — цепочка со стороны root, превращающая запись в реальную перезапись учётных данных: страница slab-кэша cred целевого процесса размещается на физической странице, контролируемой через pipe, затем 4-кадровый ответ coalesce обнуляет uid/gid/suid/sgid/euid/egid/fsuid/fsgid. Это самое прямое доказательство того, что запись за границей контролируема и может изменить cred, с наименьшим числом зависимостей.
  • EXP 2 (продвинутый примитив) — цепочка PTE только из оболочки: та же запись за границей устанавливает PTE, доступный для записи пользователем, алиас отображает страницу cred и, опционально, selinux_state, и клон становится uid 0 с полными capabilities без наблюдения со стороны root. Это расширение EXP 1, а не его замена.

Загрузка модулей ядра намеренно выходит за рамки этого репозитория: цепочка останавливается на uid 0 (и, опционально, selinux_state в режиме permissive) и не устанавливает модуль. Даже без загруженного модуля uid 0 + permissive — это полная демонстрация LPE, на которую претендует этот репозиторий.

Издержки EXP 2 остаются явными: лотерея на каждое окно (~25–33%, ~97–99% за 12 попыток), «голый» PTE, который остаётся активным до перезагрузки, зависимость от tracefs, доступного для записи из оболочки, и привязанные к сборке предположения о direct-map/месте вызова/SEL_PFN. EXP 1 остаётся самым простым доказательством примитива и запасным вариантом, когда tracefs, доступный для записи из оболочки, недоступен.

Статус

ПунктЗначение
CVECVE-2026-89633
КлассЗапись за границей кучи (CWE-787)
Компонентcifs.ko, объединение вторичных ответов SMB1 TRANS2
Исправление в upstream36d01415d881 ("smb: client: fix ... coalesce_t2", 6.12.113)
POCТриггер и запись за границей подтверждены (после монтирования и во время монтирования)
EXP 1 (минимальный примитив)4-кадровая запись cred за границей под наблюдением со стороны root; uid 0 подтверждён (после монтирования и при удержанном ответе во время монтирования)
EXP 2 (продвинутый примитив)цепочка PTE только из оболочки; uid 2000 → uid 0 + полные capabilities + Permissive подтверждено (SEL_PFN/SEL_OFF); останавливается на «голом» PTE, без загрузки модуля
ТребованияSMB1-монтирование к контролируемому атакующим серверу (привилегированный шлюз); эталонный шлюз использует su, а размещение только из оболочки требует tracefs, доступного для записи из оболочки

Тестовая среда: вендорная сборка arm64 Android 16, ядро 6.12.38 с cifs.ko, собранным из базовой линии KMI 6.12.23, SELinux в режиме enforcing.

Область тестирования

  • Проверено: указанная выше сборка arm64 Android 16 (ядро 6.12.38, cifs.ko из базовой линии KMI 6.12.23) — триггер/OOB-запись POC (как после монтирования, так и во время самого монтирования, без доступа к точке монтирования), эталонная цепочка EXP 1 со стороны root (uid 0), вариант с удержанным ответом во время монтирования (без statfs, без доступа к точке монтирования), размещение EXP 2 только из оболочки (только tracefs, без наблюдения со стороны root), полная приёмка EXP 2 (uid 0 + все биты cap + Permissive с SEL_PFN/SEL_OFF) и шлюз монтирования через su (только монтирование выполняется от root; размещение выполняется от uid 2000) были протестированы там под SELinux в режиме enforcing.
  • Не проверено: другие сборки 6.12.x, другие версии Android/SoC, стоковые ядра AOSP GKI или платформы, отличные от arm64. Связывание места вызова, смещения структур и константы direct-map привязаны к сборке; перепроверьте их на другом ядре, прежде чем ожидать, что EXP сработает.

Уязвимость

Для ответа SMB1 TRANS2 размером больше MAX_CIFS_SMALL_BUFFER_SIZE - 4 (444 байта) клиент сохраняет первичный ответ в server->bigbuf и помещает его в mid->resp_buf. Последующие ответы SMB_COM_TRANSACTION2_SECONDARY проходят через cifs_check_trans2() -> check2ndT2() -> coalesce_t2():

data_area_of_tgt = &primary->Protocol + primary->DataOffset + total_in_tgt;
memcpy(data_area_of_tgt, data_area_of_src, secondary->DataCount);

DataOffset берётся дословно из ответа сервера. Проверки счётчиков (переполнение total_in_tgt/byte_count, границы исходного буфера) присутствуют, но отсутствует проверка того, что data_area_of_tgt остаётся внутри буфера ответа. Каждый вторичный кадр смещается на 8 байт дальше (накопленный DataCount), поэтому многокадровый ответ даёт запись размером 8*N байт по смещению, выбранному атакующим (16-битному), от начала буфера.

Условия срабатывания:

  1. клиент монтирует SMB1-ресурс (vers=1.0) с сервера, который контролирует атакующий;
  2. клиент отправляет любой запрос TRANS2 (в PoC используется QUERY_FS_INFORMATION через statfs);
  3. сервер отвечает первичным кадром, у которого TotalDataCount > DataCount и который достаточно велик для пути bigbuf, а затем одним или несколькими вторичными кадрами с TotalDataCount > DataCount.

Структура репозитория

Makefile
src/poc/poc_smb1_trans2.py   malicious SMB1 server (QFS hook, runtime ctl)
src/poc/smb1_proxy.py        TCP proxy: patches DataOffset, repeats secondaries
src/exp/pipesearch.c         pipe placement/write driver (modes 3, 8, 9)
src/exp/shcred.c             shell-side drain + clone helper (uid 2000)
src/exp/shp4a2.c             trace-based drainer/observer/clone (modes 8/9)
src/exp/pte_fault.c          2 MiB fault + PTE alias writes
src/exp/bscan.c              bigbuf discovery by call site (no kprobes)
src/exp/kslide.c             KASLR slide from a raw call site
src/exp/smbd.c               device-side SMB1 server (held TRANS2)
src/exp/smbd_templates.h     SMB1 response templates for smbd
src/exp/pfn.c                linear-map VA to pfn
src/exp/kflags.c             /proc/kpageflags reader
scripts/setup_device.sh      trace instance + kprobes (root on device)
scripts/start_servers.sh     host: SMB1 server + proxy + mount helper
scripts/probe_round.sh       one probe round: bigbuf base + free target page
scripts/place.sh             placement: pipesearch mode 3 + shcred
scripts/write_cred.sh        4-frame coalesce write + /proc verification
scripts/mount_su.sh          generic su mount gate (target/decoy/abort/unmount)
scripts/chain_shell.sh       shell-only placement for an already-held TRANS2
scripts/gen_smb_templates.py regenerates smbd_templates.h from a capture
docs/analysis.md             vulnerability and chain analysis
docs/exp-protocol.md         shared-page and smbd ctl protocols

Сборка

make deps        # checks impacket
make helpers     # NDK cross-build of all C helpers
make push        # adb push to /data/local/tmp

NDK, API, ARCH, ADB, DEVICE_DIR можно переопределить.

POC — запуск и наблюдение за OOB-записью

Для самого триггера нужны только SMB1-монтирование и запущенный сервер/прокси. kprobes и kflags — это вспомогательные средства наблюдения, а не часть триггера — устанавливайте их, когда нужны доказательства dst/src/len (и они требуются для цепочки EXP ниже, которой нужны база bigbuf, отслеживание размещения и адрес целевого cred).

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