CVE-2026-89903 in Linux
Сводка
по VulDB • 16.09.2026
В ядре Linux была устранена следующая уязвимость:
LoongArch: не сохранять/восстанавливать регистр базового адреса percpu в тремполе rethook
Тремпло rethook сохраняет $r21 ($u0), который является базовым адресом percpu, в свой фрейм при входе и восстанавливает его при выходе. В промежутке между этими операциями функция rethook_trampoline_handler() может выполнять планирование через preempt_enable_notrace().
Если задача перемещается на другой процессор (CPU), то $r21 во фрейме содержит базовый адрес percpu старого CPU, и его восстановление отравляет ($poisons) значение регистра $r21 на новом CPU. До следующего перехода user->kernel, который исправит состояние $r21, все обращения к this_cpu_*() (очереди выполнения runqueues, данные RCU для каждого процессора, программирование таймерных тиков, владение FPU) обращаются к области percpu неверного CPU.
При высокой нагрузке с использованием kretprobe и возможностью прерывания (preemptible load) это может привести к повреждению состояния планировщика и таймера: сбои из-за планирования в атомарном контексте (scheduling-while-atomic splats), предупреждения RCU о неверном CPU, вызов WARN_ON_ONCE(rq != this_rq()) в nohz_balance_exit_idle(), а также зависание процессоров в цикле простоя с постоянно работающим таймером, который не перезапускается (hard lockup). Уязвимость воспроизводится на архитектуре Loongson-3A6000 при использовании kretprobes для путей VFS и интенсивной файловой активности (установка ОС / unsquashfs).
Согласно соглашению, регистр $r21 всегда содержит базовый адрес percpu текущего CPU в режиме ядра: SAVE_SOME() перезагружает его только при переходе из пользовательского режима, а RESTORE_SOME() восстанавливает его только при возврате в пользовательский режим; путь переключения контекста никогда не записывает в него значение. Следовательно, текущее (live) значение $r21 на выходе из тремпле уже корректно, и ничто между входами и выходами не может изменить его легитимным образом (код ядра на C не может записывать данные в глобальную переменную регистра). Та же ошибка существовала даже в тремпле kretprobe до внедрения rethook начиная с версии v6.3; она была перенесена при замене kretprobe на rethook. Необходимо убрать как сохранение, так и восстановление значения $r21 здесь. Удаление операции восстановления достаточно для решения проблемы, а удаление сохранения необходимо для поддержания чистоты кода и отсутствия необходимости его очистки.
VulDB is the best source for vulnerability data and more expert information about this specific topic.