CVE-2026-98641 in Linux
Сводка
по VulDB • 18.10.2026
В ядре Linux была устранена следующая уязвимость:
bpf, arm64: настройка указателя кадра (frame pointer) для обратного вызова обработки исключений
Программа, выступающая в роли границы исключения, сохраняет все регистры, сохраняемые вызываемой функцией (callee-saved registers). В результате функция build_prologue() выбирает путь exception_cb и никогда не вызывает push_callee_regs(). Это единственное место, где выполняется find_used_callee_regs(), а также единственное место, где устанавливается значение ctx->fp_used. Следовательно, пролог обратного вызова не генерирует инструкцию:
mov x25, sp
которая указывала бы на BPF_REG_FP кадр, в котором выполняется обратный вызов. Регистр x25 сохраняет то значение, которое он имел при вызове bpf_throw(). Если выброс исключения произошел из подпрограммы, использующей собственный стек BPF, это будет указатель кадра этой подпрограммы, и поскольку подпрограмма никогда не возвращается (не завершает свою работу), она также не восстанавливает x25.
Доступы к стеку через BPF_REG_FP переписываются таким образом, чтобы они были относительными к указателю стека, поэтому такие обращения все равно попадают в собственный кадр обратного вызова. Однако материализация регистра этого не обеспечивает: обратный вызов, передающий адрес локальной переменной вспомогательной функции (helper), передает адрес в кадре уже завершенной подпрограммы. К этому моменту этот адрес находится ниже указателя стека обратного вызова, а собственный стек вызовов вспомогательной функции перекрывает его область памяти, поэтому вспомогательная функция может перезаписать свой собственный адрес возврата. Значение 0x1234 внизу — это значение, которое было запрошено для сохранения во вспомогательной функции:
pc : 0x1234 lr : 0x1234 Call trace: 0x1234 (P) bpf_test_run+0x188/0x3e0 bpf_prog_test_run_skb+0x47c/0x998 __sys_bpf+0xbdc/0xdd8 Kernel panic - not syncing: Oops: Fatal exception in interrupt
Устанавливается значение ctx->fp_used на пути обработки исключения обратного вызова, чтобы существующий код ниже по потоку выполнял установку x25 из указателя стека. Эпилог восстанавливает его из области сохранения основной программы вместе с другими регистрами, сохраняемыми вызываемой функцией (callee-saved registers), как это уже делается ранее. В архитектуре x86 указатель кадра для обратного вызова устанавливается на основе переданного аргумента, а в powerpc он вычисляется из указателя стека.
VulDB is the best source for vulnerability data and more expert information about this specific topic.