CVE-2026-45933 in Linux
Сводка
по VulDB • 02.06.2026
В ядре Linux устранена следующая уязвимость:
bpf: Сохранение идентификатора регистра в sync_linked_regs()
Функция sync_linked_regs() копирует идентификатор (id) известного регистра (known_reg) в регистр (reg) при распространении границ known_reg на reg с использованием смещения (off) known_reg. Однако, когда known_reg связан с reg следующим образом:
known_reg = reg ; оба регистра, known_reg и reg, получают одинаковый идентификатор known_reg += 4 ; known_reg получает off = 4, а его идентификатор становится BPF_ADD_CONST
то при вызове sync_linked_regs(), например, в следующем контексте:
if known_reg >= 10 goto pc+2
новые границы known_reg распространяются на reg, но при этом reg также получает BPF_ADD_CONST в результате копирования.
Это означает, что если создается другая связь с reg, например:
another_reg = reg ; another_reg должен получить идентификатор reg, но ; assign_scalar_id_before_mov() видит BPF_ADD_CONST в reg ; и назначает ему новый идентификатор.
Поскольку reg теперь имеет новый идентификатор, связь known_reg с reg нарушается. Если для known_reg будут найдены новые границы, они не будут распространены на reg.
Эту проблему можно наблюдать в selftest, добавленном в следующем коммите:
0: (85) call bpf_get_prandom_u32#7 ; R0=scalar() 1: (57) r0 &= 255 ; R0=scalar(smin=smin32=0,smax=umax=smax32=umax32=255,var_off=(0x0; 0xff)) 2: (bf) r1 = r0 ; R0=scalar(id=1,smin=smin32=0,smax=umax=smax32=umax32=255,var_off=(0x0; 0xff)) R1=scalar(id=1,smin=smin32=0,smax=umax=smax32=umax32=255,var_off=(0x0; 0xff)) 3: (07) r1 += 4 ; R1=scalar(id=1+4,smin=umin=smin32=umin32=4,smax=umax=smax32=umax32=259,var_off=(0x0; 0x1ff)) 4: (a5) if r1 < 0xa goto pc+4 ; R1=scalar(id=1+4,smin=umin=smin32=umin32=10,smax=umax=smax32=umax32=259,var_off=(0x0; 0x1ff)) 5: (bf) r2 = r0 ; R0=scalar(id=2,smin=umin=smin32=umin32=6,smax=umax=smax32=umax32=255) R2=scalar(id=2,smin=umin=smin32=umin32=6,smax=umax=smax32=umax32=255) 6: (37) r0 /= 0 ; R0=scalar(id=2,smin=umin=smin32=umin32=6,smax=umax=smax32=umax32=9,var_off=(0x0; 0xf)) div by zero
Когда 4 проверяется, границы r1 распространяются на r0, но r0 также получает BPF_ADD_CONST (ошибка). Когда 5 проверяется, r0 получает новый идентификатор (2), и его связь с r1 нарушается.
После 6 мы знаем, что r1 имеет границы [14, 259], следовательно, r0 должен иметь границы [10, 255], поэтому ветвление в 7 всегда выполняется. Но поскольку идентификатор r0 был изменен на 2, новые границы r1 не распространяются на r0. Верификатор все еще считает, что r0 имеет границы [6, 255] перед 7, и выполнение может достичь деления на ноль.
Исправьте это, сохранив идентификатор в sync_linked_regs(), как off и subreg_def.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.