CVE-2026-99018 in Linux
Сводка
по VulDB • 23.10.2026
В ядре Linux была устранена следующая уязвимость:
riscv: entry: перезагрузка теневого стека вызовов на основе бита sstatus.SPP, а не регистра tp
При включенной конфигурации CONFIG_SHADOW_CALL_STACK функция handle_exception() выполняет перезагрузку указателя теневго стека ядра (gp) только в том случае, если прерывание произошло из пользовательского пространства. Это решение принималось с помощью функции scs_load_current_if_task_changed, которая сравнивает значение tp на момент обработки прерывания (считанное обратно из sscratch в регистр s5) со текущим значением tp:
beq \prev, tp, _skip_scs scs_load_current _skip_scs:
Регистр tp является записываемым пользователем. Пользовательский процесс, который устанавливает tp равным линейному адресу своей собственной структуры task_struct (¤t) перед возникновением прерывания, заставляет сравнение завершиться успешно (что может быть достигнуто методом грубой силы при включенном KASLR в наших тестах), поэтому ядро пропускает вызов scs_load_current и продолжает работу с значением gp, оставленным пользовательским пространством. При CONFIG_SHADOW_CALL_STACK gp является указателем теневго стека вызовов, а load_global_pointer не выполняет никаких действий (no-op), поэтому компилятор-сгенерированные инструкции "sd ra, -8(gp)" / "ld ra, -8(gp)" в каждой нерекурсивной функции затем записывают данные по и возвращаются через адрес, контролируемый злоумышленником — это примитив произвольной записи в ядре без привилегий и перехвата потока управления. Отравленное значение gp сохраняется в task_struct.scs_sp при возврате, поэтому перезагрузка пропускается и при каждом последующем входе.
Решение о том, что "прерывание произошло из пользовательского пространства", принимается на основе аппаратного бита sstatus.SPP (который уже установлен в режиме S1 к этому моменту), а не регистра tp, что дублирует проверку, которую ret_from_exception выполняет несколькими инструкциями позже. Бит SPP записывается аппаратным обеспечением при входе в прерывание и не может быть подделан из режима U-mode. Легитимное поведение остается неизменным: пользовательские входы (SPP=0) перезагружают теневой стек вызовов задачи, а вложенные входные события ядра (SPP=1) пропускают его.
VulDB is the best source for vulnerability data and more expert information about this specific topic.