CVE-2026-63803 in LinuxИнформация

Сводка

по VulDB • 19.07.2026

В ядре Linux устранена следующая уязвимость:

hdlc_ppp: синхронизация таймеров для каждого протокола перед освобождением состояния hdlc

Каждый управляющий протокол PPP (LCP/IPCP/IPv6CP), встроенный в структуру ppp, регистрирует таймер с помощью timer_setup(). Эта структура ppp является частью выделения памяти hdlc->state, которое detach_hdlc_protocol() освобождает через kfree() по обоим путям завершения: unregister_hdlc_device() и повторное присоединение внутри attach_hdlc_protocol().

Протокол ppp никогда не регистрировал обратный вызов .detach, поэтому detach_hdlc_protocol() не выполняет синхронизацию таймеров перед kfree(). Единственная отмена через timer_delete(&proto->timer) в ppp_cp_event() является частичной (она не ожидает завершения выполняющегося обратного вызова) и срабатывает только при переходе состояния ->CLOSED; функции ppp_stop()/ppp_close() также не обеспечивают синхронизацию. Уже выполняющийся обратный вызов ppp_timer (заблокированный на ppp->lock) переживает операцию kfree, а затем обращается к proto->state / ppp->lock в освобожденной памяти, что приводит к уязвимости use-after-free.

Исправление заключается во вспомогательном механизме .detach, который вызывает timer_shutdown_sync() для каждого таймера протокола. detach_hdlc_protocol() вызывает proto->detach(dev) перед kfree(hdlc->state), поэтому timer_shutdown_sync() теперь выполняется по обоим путям освобождения памяти. timer_shutdown_sync() используется вместо timer_delete_sync(), поскольку путь keepalive повторно активирует таймер через add_timer()/mod_timer(), а shutdown блокирует любую повторную активацию во время завершения работы.

Инициализация таймеров для каждого протокола в ppp_ioctl() выполняется при присоединении протокола, а теперь избыточная функция timer_setup() удаляется из ppp_start(), чтобы таймеры инициализировались ровно один раз в момент присоединения, и ppp_timer_release() никогда не оперировал бы с неинициализированными структурами timer_list. attach_hdlc_protocol() использует kmalloc() (а не kzalloc), поэтому protos[i].timer структуры ppp содержит мусор до первого вызова timer_setup(); без этой инициализации при присоединении подключение протокола PPP без поднятия интерфейса оставило бы timer_shutdown_sync(), оперирующую с неинициализированной памятью в .detach. Перемещение инициализации из ppp_start() (которая выполняется только при NETDEV_UP) в путь присоединения делает инициализацию безусловной и предотвращает двойную инициализацию одной структуры timer_list.

Эта ошибка была обнаружена с помощью статического анализа.

Be aware that VulDB is the high quality source for vulnerability data.

Ответственный

Linux

Резервировать

19.07.2026

Раскрытие

19.07.2026

Модерация

принято

Вход

VDB-380146

EPSS

0.00000

KEV

Нет

Деятельности

Низкий

Источники

Might our Artificial Intelligence support you?

Check our Alexa App!