
PoC и цепочка эксплуатации для CVE-2026-89633 — записи за границы кучи (heap out-of-bounds write) в пути объединения SMB1 TRANS2 в Linux cifs.ko, с повышением привилегий до uid 0 через перезапись cred и алиасинг PTE.
coalesce_t2 запись за границей кучиEnglish | 简体中文
Исследовательский PoC/EXP для записи за границей кучи в SMB1-клиенте cifs.ko ядра Linux. Вредоносный SMB1-сервер управляет DataOffset во вторичном ответе TRANS2, и coalesce_t2() копирует 8-байтовую вторичную полезную нагрузку в &primary->Protocol + DataOffset + accumulated без какой-либо проверки границ назначения. Место назначения копирования — куда бы сервер его ни направил, относительно буфера ответа (server->bigbuf).
В этом репозитории хранятся две демонстрации с разными ролями; они не являются взаимозаменяемыми:
DataOffset во время выполнения.uid/gid/suid/sgid/euid/egid/fsuid/fsgid. Это самое прямое доказательство того, что запись за границей контролируема и может изменить 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, доступный для записи из оболочки, недоступен.
| Пункт | Значение |
|---|---|
| CVE | CVE-2026-89633 |
| Класс | Запись за границей кучи (CWE-787) |
| Компонент | cifs.ko, объединение вторичных ответов SMB1 TRANS2 |
| Исправление в upstream | 36d01415d881 ("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.
statfs, без доступа к точке монтирования), размещение EXP 2 только из оболочки (только tracefs, без наблюдения со стороны root), полная приёмка EXP 2 (uid 0 + все биты cap + Permissive с SEL_PFN/SEL_OFF) и шлюз монтирования через su (только монтирование выполняется от root; размещение выполняется от uid 2000) были протестированы там под SELinux в режиме enforcing.Для ответа 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-битному), от начала буфера.
Условия срабатывания:
vers=1.0) с сервера, который контролирует атакующий;statfs);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 можно переопределить.
Для самого триггера нужны только SMB1-монтирование и запущенный сервер/прокси.
kprobes и kflags — это вспомогательные средства наблюдения, а не часть триггера —
устанавливайте их, когда нужны доказательства dst/src/len (и они требуются для
цепочки EXP ниже, которой нужны база bigbuf, отслеживание размещения и
адрес целевого cred).