
CVE-2026-68398 Ubuntu PPPoL2TP use-after-free локальное повышение привилегий

Этот репозиторий содержит эксплойт локального повышения привилегий, привязанный
к конкретной сборке, для CVE-2026-68398 — гонки вида «использование после
освобождения» (use-after-free) между обработкой приёма PPPoL2TP и уничтожением
неприсоединённого PPP-канала. Он был проверен в QEMU на официальном пакете Ubuntu
22.04 linux-image-5.15.0-187-generic (5.15.0-187.197).
Финальный тест запускается от выделенного пользователя с UID 1001, без
дополнительных групп, без capabilities и без доступа к sudo, после чего получает
UID 0 в начальном пространстве имён. KASLR, SMEP, SMAP и AppArmor остаются
включёнными. Гостевая система не загружается с параметрами nokaslr, nopti,
nosmep или nosmap.
Предупреждение
Этот код намеренно повреждает состояние кучи ядра и привязан к одной конкретной сборке ядра Ubuntu. Неудачная гонка может вызвать панику или повредить систему. Запускайте его только в изолированной, одноразовой виртуальной машине, которой вы владеете.
pppol2tp_recv() выполняется на пути приёма UDP-пакетов L2TP внутри критической
секции чтения RCU и в конечном итоге вызывает ppp_input(&po->chan). Сокет PPPoX
и встроенный в него ppp_channel безопасны с точки зрения RCU, однако внутренняя
struct channel, используемая ppp_input(), представляет собой отдельное
выделение памяти.
Для канала, связанного через PPPIOCGCHAN, но не присоединённого к
PPP-устройству и не задействованного в мостовом режиме, путь закрытия немедленно
освобождал этот внутренний объект:
RX: l2tp_udp_encap_recv -> pppol2tp_recv -> ppp_input(channel)
CLOSE: pppol2tp_release -> pppox_unbind_sock
-> ppp_unregister_channel -> ppp_release_channel -> kfree(channel)
Таким образом, путь приёма может работать с очередью skb и очередью ожидания
освобождённого канала. Исправление добавляет колбэк RCU в struct channel и
откладывает очистку очереди и освобождение памяти до истечения периода ожидания
RCU (RCU grace period).
Уязвимость обнаружил и исправил в основной ветке ядра
Норберт Сетеи из Doyensec.
Исправление в основной ветке —
ec4215683e47424c9c4762fd3c60f552a3119142.
Согласно записи Linux CNA, уязвимая линия начинается с Linux 4.15. Вендорные ядра могут содержать это исправление под другим номером версии, поэтому точный исходный код или журнал изменений пакета имеют приоритет над этой таблицей.
| Линия ядра | Первый исправленный выпуск | Коммит исправления |
|---|---|---|
| 6.6.y | 6.6.148 | 4bb84e964ff0 |
| 6.12.y | 6.12.101 | 3ab32218d718 |
| 6.18.y | 6.18.42 | c9574b8a8ede |
| 7.1.y | 7.1.6 | 06213c85d8c0 |
| Mainline | 7.2-rc4 | ec4215683e47 |
Для более старых поддерживаемых вендорных линий требуется бэкпорт. По состоянию
на 2026-08-12
трекер CVE Ubuntu
помечает пакет linux для Jammy как needs-triage; исправленный пакет Ubuntu
Jammy не обнаружен. Исходный код проверенной версии 5.15.0-187.197
по-прежнему напрямую вызывает kfree(pch) и уязвим.
| Свойство | Значение |
|---|---|
| Дистрибутив | Ubuntu 22.04.5 LTS (Jammy) |
| Пакет ядра | linux-image-5.15.0-187-generic / 5.15.0-187.197 |
| Релиз ядра | 5.15.0-187-generic #197-Ubuntu |
| Архитектура | x86-64 |
| ВМ | QEMU/KVM, -cpu host, четыре vCPU, 5 ГиБ ОЗУ |
| Исходная идентичность | uid=1001(poc) gid=1001(poc) groups=1001(poc) |
| Исходные capabilities | inheritable, permitted, effective и ambient — все нулевые |
| Финальная идентичность | uid=0(root) gid=0(root) в начальных пространствах имён |
| Изменения загрузки | Нет; стандартная командная строка, KASLR включён |
Ядро не перекомпилировалось. В минимальном облачном образе отсутствовал
linux-modules-extra-5.15.0-187-generic, поэтому для предоставления l2tp_ppp
был установлен этот официальный пакет Ubuntu. Обычная установка Jammy
с использованием метапакета linux-generic уже зависит от соответствующего
пакета modules-extra. Модуль протокола автоматически загружается, когда эксплойт
создаёт свой PPPoL2TP-сокет.
| Требование | Состояние в Ubuntu 5.15.0-187 | Использование эксплойтом |
|---|---|---|
| PPP | CONFIG_PPP=y | Встроен |
| L2TP / PPPoL2TP | CONFIG_L2TP=m, CONFIG_PPPOL2TP=m | Официальный модуль linux-modules-extra |
| Ключи пользователя | CONFIG_KEYS=y | Повторно занимает освобождённый канал kmalloc-256 |
| AppArmor | CONFIG_SECURITY_APPARMOR=y | Остаётся активным; поддельные учётные данные включают допустимую метку unconfined |
| KASLR | CONFIG_RANDOMIZE_BASE=y | Остаётся активным; сдвиг восстанавливается во время выполнения |
| SMAP | CONFIG_X86_SMAP=y | Остаётся активным |
| Пространства имён пользователя/сетей | Включены Ubuntu, но не используются | Не требуется настройка пространств имён или получение capabilities |
/dev/ppp | Не требуется | Канал связан, но никогда не подключается к PPP-устройству |
Автоматический детектор KASLR использует побочный канал по времени выполнения
инструкции prefetch в x86 и требует RDTSCP при неактивном KPTI. Проверенный
процессор хоста поддерживает rdtscp, smep и smap и не подвержен Meltdown,
поэтому Ubuntu оставляет KPTI неактивным без каких-либо изменений параметров
загрузки. На процессоре, где /proc/cpuinfo сообщает флаг pti, детектор
отказывается запускаться. Это аппаратное условие, специфичное для эксплойта:
базовый CVE остаётся достижимым, но этот выпуск не заявляет об обходе KASLR
в системе с активным KPTI. Сдвиг, задаваемый вручную, существует только для
контролируемой диагностики.