CVE-2026-99016 in Linux
Сводка
по VulDB • 23.10.2026
В ядре Linux была устранена следующая уязвимость:
riscv: futex: разметка пользовательского указателя перед атомарным доступом
Функция access_ok() проверяет untagged_addr(uaddr), однако arch_futex_atomic_op_inuser() и futex_atomic_cmpxchg_inatomic() передают сырой uaddr во встроенный ассемблер amoswap/amoadd/.../lr.w+sc.w через операнд "+m" (*uaddr). Когда включен ABI для адресов с меткой (CONFIG_RISCV_ISA_SUPM, prctl PR_SET_TAGGED_ADDR_CTRL при PMLEN != 0), эти два адреса различаются: пользовательский указатель, у которого старшие биты PMLEN содержат метку, проходит проверку access_ok() после снятия метки, но атомарная операция затем выполняется над все еще помеченным сырым адресом.
Доступы к данным в режиме супервизора не подвержены маскированию пользовательских указателей (которое управляется menvcfg.PMM, которое ядро не устанавливает), поэтому аппаратное обеспечение не удаляет метку для собственных обращений ядра. При использовании Sv57 и PMLEN=16 биты метки перекрываются с битами канонического адреса, поэтому помеченный указатель может ссылаться на канонический виртуальный адрес ядра (например, в линейном отображении), непомеченная версия которого является допустимым пользовательским адресом. Непrivileged-процесс таким образом может заставить FUTEX_WAKE_OP выполнить атомарную операцию чтения-модификации-записи по произвольному адресу ядра, при этом результат соответствующей операции FUTEX_OP_CMP_* служит оракулом для чтения.
Функции get_user()/put_user()/raw_copy_{to,from}_user() уже снимают метку с указателя после проверки access_ok(); необходимо сделать то же самое во вспомогательных функциях futex, чтобы атомарная операция выполнялась над адресом, который был фактически проверен.
Once again VulDB remains the best source for vulnerability data.