
Исследовательский репозиторий для CVE-2026-81000 (TUNderflow) — целочисленное переполнение приёмного headroom в TUN/TAP ядра Linux, позволяющее локальное повышение привилегий, с PoC, анализом первопричины и настройкой лабораторной среды.
TUNderflow
Уязвимость повреждения памяти в ядре Linux в подсистеме сетевых интерфейсов TUN/TAP, вызванная недостаточными ограничениями на headroom при приёме и целочисленным underflow в пути выделения пакета.
Этот репозиторий предназначен для авторизованных исследований в области безопасности, анализа уязвимостей, сред CTF, отладки ядра и защитного тестирования.
Не используйте код proof-of-concept против систем без явного разрешения.
| Поле | Детали |
|---|---|
| CVE | CVE-2026-81000 |
| Кодовое имя | TUNderflow |
| Компонент | Ядро Linux |
| Подсистема | TUN/TAP |
| Затронутый код | drivers/net/tun.c |
| Основная функция | tun_get_user() |
| Класс ошибки | Целочисленный underflow / выход за границы памяти |
| Воздействие | Повреждение памяти ядра |
| Потенциальное воздействие | Локальное повышение привилегий |
| CVSS v3.1 | 7.8 — High |
| Вектор атаки | Локальный |
| Требуемые привилегии | Низкие |
| Взаимодействие с пользователем | Отсутствует |
| Статус | Исправлено |
В рекомендации по CVE проблема описывается как целочисленный underflow,
который может привести к тому, что skb->data окажется за пределами
выделенного head у skb.
Уязвимость существует в пути приёма TUN/TAP ядра Linux.
Затронутый код использует настроенный для TUN-устройства headroom приёма как headroom пакета, а также при вычислении того, сколько данных пакета должно оставаться линейным.
Поэтому завышенное значение headroom может привести к некорректному вычислению в:
SKB_MAX_HEAD(align)
Когда переданное значение превышает доступный заголовок skb размером в одну страницу, вычисление может привести к underflow.
Концептуально:
Oversized receive headroom
│
▼
SKB_MAX_HEAD()
│
▼
Integer underflow
│
▼
Negative value
│
▼
size_t wrap
│
▼
Invalid skb data placement
│
▼
Kernel memory corruption
Уязвимая реализация находится в:
drivers/net/tun.c
где tun_get_user() является центральным элементом уязвимого пути.
Основная проблема заключается в недостаточно ограниченном запасе заголовка приёма TUN (TUN receive headroom).
Ядро может получить запрос на чрезмерно большой запас заголовка через пути сетевых устройств, которые передают это значение в TUN/TAP.
Уязвимость становится особенно интересной, когда сложная конфигурация виртуальной сети приводит к тому, что большое значение запаса заголовка достигает устройства TUN.
Публичное раскрытие описывает сценарий, включающий:
Netkit
│
▼
VXLAN
│
▼
Open vSwitch
│
▼
TUN
Пример конфигурации может передать примерно 4160 байт запаса сырому TUN-порту, что приводит к целочисленному переполнению в уязвимой арифметике.
Повреждение происходит в логике управления памятью сетевой подсистемы ядра.
Возможные последствия включают:
В публичном раскрытии уязвимость описывается как одна из группы уязвимостей локального повышения привилегий до root в Linux, и указывается, что опубликованный PoC позволяет непривилегированному локальному пользователю получить права root на поддерживаемых целях.
Возможность эксплуатации зависит от окружения и требует соответствующей конфигурации TUN/сетевого устройства и поддерживающей функциональности.
ATTACKER
│
▼
Oversized network headroom
│
▼
Virtual network device
│
▼
Open vSwitch
│
▼
TUN/TAP
│
▼
tun_get_user()
│
▼
SKB_MAX_HEAD(align)
│
▼
Integer underflow
│
▼
size_t wraparound
│
▼
Invalid skb->data offset
│
▼
Kernel memory corruption
Важными компонентами являются:
drivers/net/tun.c
│
├── tun_set_headroom()
│
├── tun_get_user()
│
└── tun_alloc_skb()
Уязвимую связь можно упрощённо представить так:
tun->align
│
├── skb headroom
│
└── linear-data calculation
Использование одного и того же завышенного значения в обоих вычислениях создаёт небезопасную связь между запрашиваемым запасом и фактическим бюджетом head у skb.
Критическое свойство безопасности можно концептуально представить как:
usable_head < requested_headroom
что может привести к:
SKB_MAX_HEAD(align) < 0
с последующим беззнаковым преобразованием:
negative value
↓
size_t
↓
very large unsigned value
Это в конечном итоге может повлиять на выделение skb и размещение данных.
В официальном описании особо отмечается, что итоговое значение переполняется при
присваивании переменной linear типа size_t.
Исправление в upstream выглядит так:
447c9303942c439a117d9b76ce6d6e2116c38ee7
Commit:
net: tun: bound receive headroom
Исправление ограничивает запас места, сохраняемый TUN, доступным бюджетом запаса skb размером в одну страницу и максимальным допустимым 16-битным смещением заголовка skb. Оно также гарантирует наличие достаточного объёма линейных данных для обработки raw TUN и TAP.
User / network device
│
▼
Large headroom
│
▼
tun->align
│
▼
Unsafe arithmetic
│
▼
Potential OOB access