В ядре Linux выявлены две уязвимости, позволяющие использовать подсистему еBPF для обхода защиты от атаки Spectre v4 (SSB, Speculative Store Bypass). При помощи непривилегированной BPF-программы атакующий может создать условия для спекулятивного выполнения определённых операций и определить содержимое произвольных областей памяти ядра. Сопровождающие подсистемы eBPF в ядре получили доступ к прототипу эксплоита, демонстрирующего возможность совершения атак на практике. Проблемы устранены в форме патчей (1, 2), которые войдут в состав ближайшего обновления ядра Linux. Обновления в дистрибутивах пока не сформированы (Debian, RHEL, SUSE, Arch, Fedora, Ubuntu).
Метод атаки Spectre 4 базируется на восстановлении осевших в процессорном кэше данных после отбрасывания результата спекулятивного выполнения операций при обработке чередующихся операций записи и чтения с использованием косвенной адресации. Когда операция чтения следует за операцией записи (например, mov [rbx + rcx], 0x0; mov rax, [rdx + rsi]), смещение адреса для чтения уже может быть известно из-за выполнения похожих операций (операции чтения выполняются значительно чаще и чтение может быть выполнено из кэша) и процессор может спекулятивно выполнить чтение раньше записи, не дожидаясь пока будет вычислено смещение косвенной адресации для записи.
Если после вычисления смещения выявлено пересечение областей памяти для записи и чтения, процессор просто отбросит уже спекулятивно полученный результат чтения и повторит эту операцию. Данная особенность позволяет инструкции чтения получить доступ к старому значению по некоторому адресу во время пока операция сохранения ещё не завершена. После отбрасывания неудачной спекулятивной операции в кэше остаются следы от её выполнения, после чего для его извлечения может применяться один из способов определения содержимого кэша на основе анализа изменения времени доступа к прокэшированным и не прокэшированным данным.
Первая уязвимость (CVE-2021-35477) вызвана недоработкой в механизме проверки программ BPF. Для защиты от атаки Spectre 4 верификатор добавляет после потенциально проблемных операций сохранения в память дополнительную инструкцию, сохраняющую нулевое значение для вытеснения следов прошлой операции. Предполагалось, что операция записи нуля выполнится очень быстро и блокирует спекулятивное выполнение, так как она зависит только от указателя на кадр стека BPF. Но на деле, оказалось возможным создание условий, при которых инструкция, приводящая к спекулятивному выполнению, успевает выполниться до операции вытесняющего сохранения.
Вторая уязвимость (CVE-2021-3455) связана с тем, что при выявлении верификатором BPF потенциально опасных операций сохранения в память, не учитываются неинициализированные области стека BPF, первая операция записи в которые не защищается. Подобная особенность приводит к возможности совершения спекулятивной операции чтения, зависимой от неинициализированной области памяти, перед выполнением инструкции сохранения. Новая память для BPF-стека выделяется без проверки содержимого, уже имеющегося в выделяемой памяти, и на стадии до запуска BPF-программы имеется способ управления содержимым области памяти, которая затем будет выделена под стек BPF.