
Инструменты для тестирования смягчения последствий в ядре Linux для CVE-2018-3639 (также известный как Variant 4) с использованием функции Speculative Store Bypass Disable (SSBD) процессоров x86
Проект ssbd-tools представляет собой набор программ, использующих функцию отключения спекулятивного буфера записи (SSBD) в процессорах x86. SSBD — это аппаратная защита от атаки с использованием спекулятивного буфера записи, известной как Variant 4 и зарегистрированной как CVE-2018-3639. Ядро Linux предоставляет контроль за использованием SSBD для каждого процесса, и эти инструменты могут использоваться для применения этих средств контроля и проверки их корректности.
Ядро Linux предоставляет несколько различных режимов работы, которые могут быть выбраны во время загрузки с помощью параметра ядра spec_store_bypass_disable для SSBD в системах x86. Документация по параметрам ядра хорошо их описывает. Вот фрагмент из этого документа, описывающий параметры:
on - Безусловно отключить спекулятивный буфер записи
off - Безусловно включить спекулятивный буфер записи
auto - Ядро определяет, содержит ли модель процессора реализацию
спекулятивного буфера записи, и выбирает наиболее подходящую
защиту. Если процессор не уязвим, выбирается "off".
Если процессор уязвим, защита по умолчанию зависит от
архитектуры и Kconfig. См. ниже.
prctl - Управление спекулятивным буфером записи для каждого потока
через prctl. Спекулятивный буфер записи включен
для процесса по умолчанию. Состояние управления
наследуется при fork.
seccomp - То же, что и "prctl" выше, но все потоки seccomp
будут отключать SSB, если они явно не откажутся.
Если этот параметр не указан, это эквивалентно
spec_store_bypass_disable=auto.
Защита по умолчанию:
X86: Если CONFIG_SECCOMP=y, то "seccomp", иначе "prctl"
Функциональность SSBD включается/отключается установкой одного бита в модельно-зависимом регистре (MSR) процессора. Точный MSR и расположение бита внутри MSR различаются в зависимости от производителя процессора, семейства процессоров от одного производителя и того, работает ли ядро под гипервизором. Эти инструменты следуют рекомендациям, опубликованным компаниями Intel и AMD, для определения местоположения бита SSBD в текущей среде выполнения.
В некоторых системах поддержка SSBD может отсутствовать. Это может быть связано с рядом причин:
intel-microcode и amd64-microcode для Debian/Ubuntu). Процессоры AMD семейств 15h, 16h и 17h не требуют обновления микрокода.Программа ssbd-exec использует контроль SSBD для каждого процесса перед выполнением другой программы. Она может использовать prctl PR_SET_SPECULATION_CTRL для разрешения спекуляции (-p enable для использования PR_SPEC_ENABLE), запрета спекуляции через SSBD (-p disable для использования PR_SPEC_DISABLE), или постоянного запрета спекуляции во всех будущих дочерних процессах через SSBD (-p force-disable для использования PR_SPEC_FORCE_DISABLE).
Она также может загружать разрешающий seccomp-фильтр (-s empty), который по умолчанию в x86 включает защиту SSBD для процесса. Существует также опция (-s spec-allow) для загрузки разрешающего фильтра, который не включает SSBD.
$ ./ssbd-exec -- grep Spec /proc/self/status
Speculation_Store_Bypass: thread vulnerable
$ ./ssbd-exec -p disable -- grep -e Spec -e Seccomp /proc/self/status
Seccomp: 0
Speculation_Store_Bypass: thread mitigated
$ ./ssbd-exec -s empty -- grep -e Spec -e Seccomp /proc/self/status
Seccomp: 2
Speculation_Store_Bypass: thread force mitigated
Программа ssbd-verify проверяет, что фактический бит SSBD в MSR и смещении бита, специфичном для вашего процессора, имеет ожидаемое значение. 0 означает, что SSBD не используется, 1 — что используется.
Программа также может использоваться для проверки того, что значение prctl PR_GET_SPECULATION_CTRL задачи установлено на разрешение спекуляции (-p enable для проверки PR_SPEC_ENABLE), запрет спекуляции через SSBD (-p disable для проверки PR_SPEC_DISABLE) или постоянный запрет спекуляции во всех будущих дочерних процессах через SSBD (-p force-disable для проверки PR_SPEC_FORCE_DISABLE).
Программа может быть настроена на повторную проверку значения бита SSBD с использованием опции -t SECONDS. Если SECONDS равно 0, программа бесконечно циклически проверяет бит SSBD. Ненулевое значение SECONDS приводит к проверке бита SSBD в течение указанного времени.
Эта программа требует, чтобы модуль ядра msr был загружен и пользователь имел права root для чтения бита SSBD из соответствующего MSR.
$ sudo ./ssbd-verify 0
$ sudo ./ssbd-verify 1
FAIL: SSBD bit verification failed (expected 1, got 0)
$ ./ssbd-exec -p disable -- sudo ./ssbd-verify 1
$ sudo ./ssbd-exec -s empty -- ./ssbd-verify 1
Примечание: В команде выше требуется sudo для ssbd-exec, потому что NO_NEW_PRIVS используется перед загрузкой seccomp-фильтра. sudo не сможет повысить привилегии, если используется после установки NO_NEW_PRIVS.
Программа ssbd-toggle просто переключает бит SSBD между включением и выключением в бесконечном цикле до тех пор, пока программа не будет завершена. Она может использоваться вместе с ssbd-verify для проверки того, что процесс ssbd-verify всегда имеет ожидаемое значение бита SSBD, когда ядро переключается на его задачу.
Эта программа требует, чтобы модуль ядра msr был загружен и пользователь имел права root для чтения и записи в соответствующий MSR.
$ sudo ./ssbd-toggle
^C
Для сборки инструментов выполните make:
$ make
Чтобы запустить несколько базовых автоматических тестов и убедиться, что SSBD работает должным образом на вашей системе, выполните цель check от имени root:
$ sudo make check
PASS