
CVE-2025-40271 Изменено MadEploits
Доказательство концепции (PoC) для локального повышения привилегий в файловой системе proc ядра Linux. Ошибка — use-after-free (использование после освобождения) в proc_readdir_de(), вызванная rb_erase() без RB_CLEAR_NODE(), что оставляет устаревшие связи красно-черного дерева, которые могут быть использованы в гонке при перечислении каталогов.
Автор: MadExploits
Исходное исследование уязвимости и C PoC от Aviral Srivastava (N-DAY RESEARCH). Этот репозиторий включает shell-порт (
exploit.sh) для сред, где компиляция нецелесообразна.
| Поле | Подробности |
|---|---|
| CVE | CVE-2025-40271 |
| Компонент | fs/proc — proc_readdir_de() / remove_proc_entry() |
| Тип | Use-after-free (устаревшие связи rb-дерева) |
| Влияние | Локальное повышение привилегий (LPE) |
| Архитектура | x86_64 |
| Затронутые | Ядра Linux до 6.18-rc5 |
Когда запись каталога proc удаляется, rb_erase() вызывается для rb-узла записи без RB_CLEAR_NODE(). Освобожденные узлы могут оставаться доступными через устаревшие связи дерева. Если getdents64() участвует в гонке с удалением интерфейса в /proc/self/net/dev_snmp6/, ядро может прочитать освобожденную память — часто занятую разбросанными объектами msg_msg — и вернуть аномальные значения d_ino, которые раскрывают указатели кучи ядра.
PoC проверяет версию запущенного ядра и завершает работу на исправленных сборках:
| Ветка |
|---|
| Файл | Описание |
|---|---|
exploit.c | Полный C PoC — управление netlink veth, гонка pthread, разброс msg_msg |
exploit.sh | Shell-порт без компиляции — unshare, ip, встроенный Python 3 для системных вызовов/гонки |
Обе реализации следуют одному и тому же потоку эксплуатации:
CAP_NET_ADMIN в net ns)/proc/self/net/dev_snmp6/getdents64() с быстрым удалением veth + разброс кучиd_ino, похожим на указатели ядраcat /proc/sys/kernel/unprivileged_userns_clone
# must be 1
exploit.cgcc с pthreadslinux/netlink.h и т.д.)gcc -o exploit exploit.c -lpthread
exploit.shbashpython3ip (iproute2)unshare (util-linux с поддержкой --map-root-user)Компилятор не требуется.
chmod +x exploit.sh
./exploit.sh
gcc -o exploit exploit.c -lpthread
./exploit
Уязвимое ядро — UAF сработало (частичный успех):
[+] Kernel X.Y.Z — VULNERABLE
[+] Namespace ready...
[+] Created 32 veth pairs (/proc/self/net/dev_snmp6 populated)
[+] UAF HIT! d_ino=0xffff8880........ (kernel heap pointer)
[+] Kernel heap leak: 0xffff8880........
[*] PARTIAL SUCCESS: UAF + heap leak DEMONSTRATED
Исправленное ядро:
[-] Kernel X.Y.Z — PATCHED
[*] Kernel is patched. Nothing to do.
d_ino содержит значение, соответствующее шаблону указателя ядра x86_64 (0xffff000000000000), обычно из заголовка msg_msg m_list, перекрывающего освобожденные данные proc_dir_entry.modprobe_path требует смещения между утекшим адресом кучи и базой текста ядра — это зависит от сборки (KASLR). PoC демонстрирует UAF и утечку; полная цепочка требует смещений для вашего целевого образа ядра.sysctl -w kernel.unprivileged_userns_clone=0
Этот проект предоставляется только для авторизованных исследований безопасности, обучения и защитного тестирования.
| Роль | Имя |
|---|---|
| Автор репозитория | MadExploits |
| Исходное исследование CVE и C PoC | Aviral Srivastava — N-DAY RESEARCH |
Используйте на свой страх и риск. Гарантии не предоставляются.
| Исправлено в |
|---|
| 5.10.x | 5.10.247+ |
| 6.1.x | 6.1.159+ |
| 6.6.x | 6.6.123+ |
| 6.12.x | 6.12.73+ |
| 6.18+ | 6.18-rc6+ |
| 7.x+ | Исправлено |