
🔐 Полное исследование случая CVE-2026-31431 (CopyFail) — критическая уязвимость повышения привилегий в ядре Linux. Включает технический анализ, скрипты проверки, hardening и playbook реагирования на инциденты. В образовательных целях.
Полное исследование — как была обнаружена, как работает, как тестировать, как воспроизвести (в безопасной среде) и как исправить критическую уязвимость, затрагивающую почти все дистрибутивы Linux с 2017 года.
Этот репозиторий предназначен исключительно для образовательных целей. Информация, представленная здесь, предназначена для специалистов по безопасности, исследователей и студентов в области кибербезопасности. Никогда не используйте описанные здесь методы на системах без явного разрешения. Неправомерное использование этой информации может квалифицироваться как преступление, предусмотренное Законом № 12.737/2012 (Закон Каролины Дикманн) и Гражданским марко об интернете (Закон № 12.965/2014).
| Поле | Детализация |
|---|---|
| CVE ID | CVE-2026-31431 |
| Псевдоним | CopyFail |
| Тип | Local Privilege Escalation (LPE) — повышение привилегий |
| Оценка CVSS | 8.8 (High) / потенциально критическая в цепочке |
| Компонент | Ядро Linux — механизм копирования данных |
| Версии | Ядро Linux ≤ 7.0 (дистрибутивы с 2017 года) |
| Обнаружено | Theori (компания по безопасности) |
| Раскрыто | Март 2026 |
| Патч upstream | Доступен ~через неделю после ответственного раскрытия |
| Статус CISA | Внесено в каталог как активно эксплуатируемое — KEV Catalog |
| Срок CISA | Федеральные агентства должны исправить до 15/05/2026 |
Уязвимость CopyFail была обнаружена компанией по безопасности Theori во время анализа кода ядра Linux, а именно подсистемы, отвечающей за копирование данных между областями памяти.
Март/2026 → Исследователи Theori выявляют аномальное поведение в ядре
Март/2026 → Ответственное раскрытие (Responsible Disclosure) команде безопасности ядра
~1 неделя спустя → Патч upstream доступен на kernel.org
Май/2026 → Код эксплойта (PoC) опубликован публично
01/05/2026 → Microsoft публикует технический анализ
04/05/2026 → CISA добавляет в KEV Catalog (Known Exploited Vulnerabilities)
15/05/2026 → Срок исправления для федеральных агентств США
Ядро Linux имеет внутренние процедуры, отвечающие за копирование данных между различными областями памяти (userspace ↔ kernelspace). Ошибка получила название CopyFail, потому что затронутый компонент перестаёт копировать определённые данные, когда должен. Это повреждает чувствительные структуры данных внутри ядра, открывая окно для эксплуатации с целью повышения привилегий.
Ядро Linux управляет памятью в двух отдельных пространствах:
┌─────────────────────────────────────┐
│ USERSPACE │
│ Процесс атакующего (uid=1000) │
│ → вызывает вредоносный syscall │
└────────────────┬────────────────────┘
│ syscall
▼
┌─────────────────────────────────────┐
│ KERNELSPACE │
│ Процедура копирования данных │
│ → ОШИБКА: сбой копирования │
│ метаданных │
│ → повреждает структуру управления │
│ → атакующий манипулирует │
│ указателем │
│ → выполняет код как root │
└─────────────────────────────────────┘
uid=0 (root), получая полный контроль над системой// УЯЗВИМАЯ версия (упрощённая, для обучения)
int kernel_copy_data(struct user_request *req) {
struct kernel_buffer kbuf;
// ОШИБКА: копирует только часть данных, игнорируя критические поля
// Поля безопасности (security_context) не копируются!
memcpy(&kbuf.data, req->data, req->size);
// → kbuf.security_context остаётся неинициализированным (мусор в памяти)
process_buffer(&kbuf); // использует повреждённые данные
return 0;
}
// ИСПРАВЛЕННАЯ версия
int kernel_copy_data(struct user_request *req) {
struct kernel_buffer kbuf;
// ИСПРАВЛЕНИЕ: копирует всю struct, включая поля безопасности
if (copy_from_user(&kbuf, req, sizeof(struct kernel_buffer)))
return -EFAULT;
process_buffer(&kbuf);
return 0;
}
| Дистрибутив | Версия | Статус |
|---|---|---|
| Red Hat Enterprise Linux | 10.1 | ✅ Уязвим |
| Ubuntu LTS | 24.04 | ✅ Уязвим |
| Amazon Linux | 2023 | ✅ Уязвим |
| SUSE Linux | 16 | ✅ Уязвим |
| Debian | Недавний стабильный | ✅ Уязвим |
| Fedora | Недавний | ✅ Уязвим |
| Kubernetes (узлы) | Все на ядре ≤7.0 | ✅ Уязвим |
⚠️ Любой дистрибутив Linux с ядром ≤ 7.0, выпущенный с 2017 года, потенциально уязвим.
Пользователь без привилегий на общем сервере (например, в среде хостинга, VPS) запускает эксплойт и получает root.
Интернет → [RCE через веб-уязвимость] → ограниченная оболочка → [CopyFail] → root
Согласно анализу Microsoft: ошибка может быть объединена в цепочку с эксплойтом, доставленным через интернет (например, RCE в веб-приложении), что приводит к полной компрометации сервера.
Пользователь Linux обманом заставляется открыть вредоносную ссылку или вложение, которое запускает эксплойт локально.
Злоумышленник компрометирует аккаунт разработчика open source и внедряет эксплойт в широко распространяемый код.
Скомпрометированный облачный сервер может раскрыть все виртуальные машины, контейнеры, приложения и базы данных клиентов на той же инфраструктуре.
⚠️ ТОЛЬКО в контролируемой и изолированной среде — виртуальная машина без доступа к внешней сети!
# Необходимые инструменты
sudo apt install -y git build-essential libssl-dev bc flex bison
# Проверить текущую версию ядра
uname -r
# Проверить, находится ли она в уязвимом диапазоне (≤ 7.0)
# Пример уязвимого вывода: 6.8.0-51-generic
# 1. Создать изолированную виртуальную машину (рекомендуется: VirtualBox или QEMU)
# Используйте ISO Ubuntu 24.04 или Debian Bookworm
# 2. Убедиться, что виртуальная машина НЕ имеет доступа к производственному интернету
# (используйте host-only сеть или изолированный NAT)
# 3. Создать пользователя без привилегий для имитации атакующего
sudo adduser testuser
su - testuser
# 4. Убедиться, что testuser не имеет sudo
sudo whoami # должно вернуть: "testuser is not in the sudoers file"
# Скрипт проверки (НЕ эксплуатирует, только проверяет)
#!/bin/bash
KERNEL_VERSION=$(uname -r | cut -d. -f1,2)
MAJOR=$(echo $KERNEL_VERSION | cut -d. -f1)
MINOR=$(echo $KERNEL_VERSION | cut -d. -f2)
echo "[*] Обнаружено ядро: $(uname -r)"
if [ "$MAJOR" -lt 7 ] || ([ "$MAJOR" -eq 7 ] && [ "$MINOR" -eq 0 ]); then
echo "[!] ПОТЕНЦИАЛЬНО УЯЗВИМО к CVE-2026-31431 (CopyFail)"
echo "[!] Проверьте, применён ли патч вашим поставщиком дистрибутива"
else
echo "[+] Версия ядра вне затронутого диапазона"
fi
# Проверить, применён ли патч (через журналы изменений пакета)
apt changelog linux-image-$(uname -r) 2>/dev/null | grep -i "CVE-2026-31431" && \
echo "[+] Патч CVE-2026-31431 найден в журнале изменений" || \
echo "[?] Патч не обнаружен в журнале изменений — проверьте вручную"
🔒 Этот раздел строго образовательный. Код ниже — это упрощённое дидактическое представление вектора атаки — это не реальный эксплойт (который не публикуется здесь по этическим соображениям).
#!/usr/bin/env python3
"""
CVE-2026-31431 (CopyFail) — Дидактическое представление
Цель: Обучение наступательной/оборонительной безопасности
НЕ ИСПОЛЬЗОВАТЬ НА СИСТЕМАХ БЕЗ РАЗРЕШЕНИЯ
"""
import ctypes
import os
import sys
def check_environment():
"""Проверяет, находимся ли мы в лабораторной среде"""
kernel = os.uname().release
print(f"[*] Ядро: {kernel}")
print(f"[*] Текущий UID: {os.getuid()}")
if os.getuid() == 0:
print("[-] Мы уже root. Эксплойт не требуется.")
sys.exit(0)
def demonstrate_concept():
"""
Концептуальная демонстрация вектора атаки:
1. Определить уязвимый syscall
2. Создать payload, запускающий неполное копирование
3. Отслеживать повреждение памяти
4. Перенаправить поток для повышения привилегий
В реальном эксплойте:
- Атакующий использует такие техники, как heap spray или ROP-цепочки
- Злоупотребляет окном между повреждением и использованием повреждённых данных
- Перезаписывает учётные данные процесса (uid → 0)
"""
print("[*] Концепция: триггер дефектной процедуры копирования")
print("[*] Концепция: отслеживание повреждения struct kernel_buffer")
print("[*] Концепция: перенаправление потока выполнения")
print("[*] См.: https://xint.io/blog/copy-fail-linux-distributions")
def main():
check_environment()
demonstrate_concept()
print("\n[i] Для полного технического анализа см.:")
print(" → https://xint.io/blog/copy-fail-linux-distributions")
print(" → https://www.microsoft.com/en-us/security/blog/2026/05/01/cve-2026-31431-copy-fail-vulnerability-enables-linux-root-privilege-escalation/")
if __name__ == "__main__":
main()
# В отдельном терминале отслеживать журналы ядра
sudo dmesg -w | grep -E "(oops|panic|null pointer|exploit|cve)"
# Отслеживать системные вызовы
sudo strace -e trace=all -p <PID_ПРОЦЕССА>
# Проверять изменения UID в реальном времени
watch -n 0.5 'cat /proc/self/status | grep -E "^(Uid|Gid)"'
# Ubuntu / Debian
sudo apt update && sudo apt upgrade -y linux-image-generic
sudo reboot
# Проверить версию после перезагрузки
uname -r
# Red Hat / CentOS / Amazon Linux
sudo dnf update -y kernel
sudo reboot
# SUSE
sudo zypper update -t package kernel-default
sudo reboot
# Проверить журнал изменений установленного ядра
apt changelog linux-image-$(uname -r) | grep CVE-2026-31431
# Через трекер CVE Ubuntu
# https://ubuntu.com/security/CVE-2026-31431
# Через базу данных CVE Red Hat
# https://access.redhat.com/security/cve/CVE-2026-31431
# Ограничить выполнение SUID-бинарников (уменьшает поверхность атаки)
find / -perm -4000 -type f 2>/dev/null
# Включить аудит подозрительных syscall
sudo auditctl -a always,exit -F arch=b64 -S all -k syscall_audit
# Отслеживать попытки повышения привилегий
sudo apt install -y auditd
sudo auditctl -w /etc/passwd -p wa -k passwd_changes
sudo auditctl -w /etc/sudoers -p wa -k sudoers_changes
# Активировать защиту ядра
# /etc/sysctl.conf — добавить:
kernel.dmesg_restrict = 1
kernel.kptr_restrict = 2
kernel.perf_event_paranoid = 3
kernel.unprivileged_bpf_disabled = 1
net.core.bpf_jit_harden = 2
# Применить
sudo sysctl -p
# Признаки возможной эксплуатации:
# 1. Процессы обычного пользователя, работающие от root
ps aux | awk '$1 != "root" && $2 == "0"'
# 2. Недавно созданные SUID-бинарники
find / -perm -4000 -newer /etc/passwd -type f 2>/dev/null
# 3. Подозрительные записи в /etc/passwd
grep "uid=0" /etc/passwd
# 4. Журналы ядра с сообщениями о повреждении
dmesg | grep -iE "(oops|BUG:|corruption|cve)"
# 5. Несанкционированные сетевые подключения
ss -tulnp | grep LISTEN
Управление патчами критически важно — Патч upstream был доступен примерно через неделю, но дистрибутивам требуется больше времени для доставки. Активно отслеживайте своих поставщиков.
Защита в глубину — LPE сама по себе недостаточна; атакующему нужен первоначальный доступ. Контролируйте, кто имеет доступ к системе.
Цепочки уязвимостей — Отдельные CVE с «низким риском» могут стать критическими при комбинировании. Оценивайте риск в контексте, а не только по изолированному CVSS.
Цепочка поставок — реальный вектор — Широко используемый open source код может быть вектором атаки. Внедрите проверку целостности пакетов.
Kubernetes и контейнеры не застрахованы — Если ядро хоста уязвимо, контейнеры поверх него также затронуты.
Всегда копируйте полные struct — Никогда не копируйте отдельные поля struct управления ядра, не убедившись, что все критические поля инициализированы.
Используйте copy_from_user() правильно — Функции копирования ядра имеют специфическую семантику. Прочитайте документацию перед использованием.
Проверка безопасности кода — Изменения в ядре требуют проверки, ориентированной на безопасность, а не только на функциональность.
Обновления ядра — приоритет — Это не просто «плановое обслуживание». Уязвимости ядра часто являются критическими.
Инвентаризация активов фундаментальна — Вы не можете исправить то, о существовании чего не знаете. Поддерживайте актуальную инвентаризацию систем Linux и их версий ядра.
План реагирования на инциденты — Имейте готовый playbook для критических уязвимостей с агрессивными сроками (например, CISA KEV).
Нашли что-то устаревшее или хотите добавить сценарий тестирования? Откройте issue или PR!
Пожалуйста, соблюдайте кодекс поведения: этот репозиторий предназначен для образования и защиты — не для вредоносной деятельности.
MIT License — используйте для обучения, преподавания и защиты систем. Никогда для атак.
«Знание атаки — первый шаг к построению защиты.»
⭐ Если это исследование было полезным, поставьте звезду репозиторию!