
Анализ - POC - Митигация
Только для образовательных целей. НЕ используйте на системах без явного разрешения.
| Поле | Значение |
|---|---|
| CVE | CVE-2026-31431 |
| Псевдоним | Copy Fail |
| CVSS | 7.8 (High) |
| Тип | Local Privilege Escalation (LPE) |
| Затронутое ядро | 2017 – 2026 (коммит 72548b093ee3 и далее) |
| Исправление upstream | коммит a664bf3d603d (откат 2017 года) |
| Раскрытие | 29 апреля 2026 г. (Theori / Xint Code) |
Copy Fail — это детерминированная логическая ошибка (не требует гонок) в криптографической подсистеме ядра Linux. Она позволяет непривилегированному пользователю записать 4 контролируемых байта в page cache любого читаемого файла в системе, включая setuid-бинарники, такие как su или sudo.
В отличие от предыдущих подобных уязвимостей:
| Уязвимость | Тип | Требуется гонка? | Переносимость? | Размер эксплойта |
|---|---|---|---|---|
| Dirty Cow (CVE-2016-5195) | CoW race | Да | Частичная | ~КБ |
| Dirty Pipe (CVE-2022-0847) | pipe buffer | Нет | Ограниченная | ~КБ |
| Copy Fail (CVE-2026-31431) | Логическая | Нет | Полная | 732 байта |
Linux kernel — crypto/authencesn.c
└── algif_aead (модуль AF_ALG)
└── in-place optimization (коммит 72548b093ee3, 2017)
└── AEAD scratch write → пересекает границу scatterlist
└── записывает 4 байта в page cache внешнего файла
Затронутые дистрибутивы: Ubuntu, Debian, RHEL, Amazon Linux, SUSE, Fedora, Arch, AlmaLinux — любой дистрибутив с ядром ≥ 2017.
В 2017 году была введена оптимизация, из-за которой req->src и req->dst указывают на один и тот же комбинированный scatterlist. Это приводит к тому, что страницы page cache (полученные через splice()) оказываются напрямую привязаны к записываемому scatterlist назначения.
1. Открыть сокет AF_ALG с алгоритмом authencesn
2. Использовать splice() для подачи страниц page cache целевого бинарника
в сокет AF_ALG (например, /usr/bin/sudo)
3. Выполнить операцию расшифровки AEAD
4. authencesn использует буфер назначения как scratch pad →
пишет seqno_hi (4 контролируемых байта) ЗА пределы легитимного вывода,
пересекая границу scatterlist
5. 4 байта попадают в страницу page cache целевого бинарника
6. Файл на диске НЕ изменяется → проверки целостности ничего не обнаруживают
7. Модифицированный в памяти бинарник выполняет payload → root
Запись обходит обычный путь записи VFS. Файл на диске остаётся нетронутым. Такие инструменты, как sha256sum, aide, tripwire или inotify, не обнаруживают изменение, поскольку они работают с файлом на диске или с inode, а не с page cache в памяти.
Лаборатория использует уязвимое ядро для демонстрации повреждения page cache. В среде Docker полное повышение привилегий зависит от конфигурации хоста (общее ядро).
# Клонировать репозиторий
git clone https://github.com/theori-io/copy-fail-CVE-2026-31431
cd cve-2026-31431
# Собрать уязвимый образ
docker build -t copyfail-lab -f docker/Dockerfile.vulnerable .
# Запустить лабораторию
docker run --rm -it \
--cap-add=NET_ADMIN \
--security-opt seccomp=unconfined \
copyfail-lab bash
# Внутри контейнера:
cd /lab
python3 exploit/poc.py
os.splice)См. exploit/poc.py и exploit/README.md.
PoC демонстрирует:
См. mitigation/README.md для подробных инструкций.
TL;DR — Немедленное смягчение (без перезагрузки):
# Отключить затронутый модуль
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif.conf
sudo modprobe -r algif_aead 2>/dev/null || true
Окончательное исправление: Обновите ядро до пропатченной версии (после коммита a664bf3d603d).
cve-2026-31431/
├── README.md ← этот файл
├── docs/
│ ├── technical-analysis.md ← глубокий технический анализ
│ └── affected-kernels.md ← таблица затронутых/исправленных версий
├── exploit/
│ ├── README.md ← документация PoC
│ └── poc.py ← proof of concept (Python 3.10+)
├── mitigation/
│ ├── README.md ← руководство по смягчению
│ ├── disable-algif.conf ← конфигурация modprobe
│ └── check-vulnerable.sh ← скрипт обнаружения
├── docker/
│ ├── Dockerfile.vulnerable ← уязвимая лаборатория
│ └── Dockerfile.patched ← лаборатория с применённым смягчением
└── scripts/
└── setup-lab.sh ← автоматизация настройки лаборатории
| Дата | Событие |
|---|---|
| 2017 | Коммит 72548b093ee3 вносит ошибку в ядро |
| ~2025 | Theori/Xint Code начинает анализ криптоподсистемы |
| 28 апреля 2026 | Координация с дистрибьюторами |
| 29 апреля 2026 | Публичное раскрытие + публикация PoC |
| 1 мая 2026 | Пропатченные ядра доступны в производственных репозиториях |
| 1 мая 2026 | Добавлен в каталог CISA KEV |
a664bf3d603d