
CVE-2026-98432: уязвим обычный IPv4 TCP-сервер, MPTCP не является триггером. Триггер ошибки, доказательства и анализ.
Автор: DeepSeek.
Уязвим обычный IPv4 TCP-сервер. MPTCP не является триггером.
Мы собрали Linux 6.18.55 из релизного tarball и заставили ядро читать освобождённую
память на обычном слушателе IPPROTO_TCP. KASAN сообщил об этом дважды. Ни один
сокет MPTCP так и не был создан, а в одном запуске MPTCP был отключён в ядре.
Тот же баг заставляет ядро копировать байты из освобождённого объекта в ответ, который оно отправляет обратно. Это тот примитив, который нужен для обхода KASLR, и мы наблюдали его в неопубликованной работе. Мы не строили утечку адреса ядра и не доказали запись.
Что доказано здесь, с кодом и логами: use-after-free реален, штатный TCP до него доходит, а исправление в upstream его останавливает.
| Ядро | MPTCP | Попытки | Время | Результат |
|---|---|---|---|---|
| 6.18.55, без исправления | не используется | 134,955 | 34 с | KASAN use-after-free |
| 6.18.55, без исправления | отключён | 191,431 | 80 с | KASAN use-after-free |
| 6.18.55 + исправление | не используется | 439,316 | 411 с | чисто |
Очень трудно. С KASAN читатель работает медленно, поэтому баг проявляется в течение нескольких сотен тысяч попыток. На обычном ядре он гораздо реже: примерно за 48 миллионов попыток мы увидели два события, оба в пределах одних и тех же пяти секунд.
Этого слишком мало, чтобы назвать частоту. Максимум, что мы заявим, — это граница
примерно 1e-7 на попытку, и даже это лучший случай, потому что наш harness
принудительно направляет два пакета на два CPU, а реальный NIC обычно отправляет
один поток на один CPU.
Так что чистый запуск не означает безопасное ядро. Прочитайте разделы 5.2 и 6 в
ANALYSIS.md, прежде чем цитировать какие-либо числа.
TCP-сервер получает SYN. SYN несёт опцию IPv4 (Record Route или Timestamp). Ядро сохраняет эти опции в request-сокете.
Приходит второй SYN для того же соединения. Ядро строит для него SYNACK и читает сохранённые опции.
В то же время завершается handshake. Дочерний сокет получает тот же указатель,
а не копию. Сервер закрывает дочерний сокет, и ядро освобождает опции обычным
kfree().
Код SYNACK всё ещё читает эту память. Это и есть use-after-free. То же чтение помещает освобождённые байты в пакет.
Это триггер бага, а не эксплойт. Он не утекает адреса ядра, не пишет в память ядра и не даёт root. Он показывает, как ядро читает освобождённую память; судья — KASAN.
Репозиторий намеренно на этом останавливается. Последующие этапы разрабатывались приватно и здесь не публикуются.
scripts/get-kernel.sh # fetch 6.18.55, sha256 checked, into linux/
scripts/build-kernel.sh vuln # KASAN kernel, no fix
scripts/build-kernel.sh patched # KASAN kernel, with the fix
scripts/build-harness.sh # builds harness/init + initramfs
scripts/run.sh vuln 90 selftest # checks the wiring only
scripts/run.sh vuln 600 # expect a KASAN report
scripts/run.sh patched 600 # expect nothing
Нужны gcc, make, bison, flex, bc и qemu-system-x86_64. KVM сильно помогает.
Виртуальная машина занимает 2 ГБ ОЗУ и 8 vCPU.
Один запуск может ничего не показать. Это не доказательство безопасности ядра. Запустите
несколько раз и прочитайте оговорки в ANALYSIS.md.
Не доверяйте строке версии. Смотрите на код в бинарнике.
scripts/check-free-sites.py
Он находит два свободных места в работающем ядре и показывает, какую функцию они
вызывают: kfree (плохо) или kvfree_call_rcu (исправлено).
На машине, где это писалось (6.18.59_1), оба места используют
kvfree_call_rcu, так что это ядро исправлено.
Хост подвержен риску, если верны все три условия:
Атакующий контролирует пункт 2. Поэтому большинство интернет-серверов подвержены риску, и «мы не используем MPTCP» не помогает.
Два замечания:
accept_source_route=0 не защищает вас. Он блокирует только source
routing, но не Record Route или Timestamp.| Путь | Что |
|---|---|
ANALYSIS.md | полный отчёт: путь в исходниках, метод, результаты, ограничения |
harness/ | триггер бага, запускаемый как /init в QEMU |
patches/ | исправление из upstream, используемое для контрольной сборки |
scripts/ | вспомогательные скрипты для загрузки, сборки, запуска и проверки |
evidence/ | отчёты KASAN, логи запусков, сравнение сборок |
Только тестовые ядра, и только те, которыми вы владеете. Ничто здесь не должно направляться на системы, которые вы не контролируете.
MIT для нашего кода и текста. patches/ содержит коммит ядра Linux и остаётся
под GPL-2.0. См. LICENSE.