Как проверить, включено ли ядро ​​Linux «Retpoline» или нет?

17

Что касается уязвимости безопасности «Призрак», то «Ретполин» был представлен как решение для снижения риска. Тем не менее, я прочитал пост, в котором упоминалось:

Если вы CONFIG_RETPOLINEсобираете ядро без , вы не можете собирать модули с помощью retpoline, а затем ожидать их загрузки - потому что символы thunk не экспортируются.

Однако если вы собираете ядро ​​с помощью retpoline, вы можете успешно загружать модули, не созданные с помощью retpoline. ( Источник )

Есть ли простой и общий / универсальный / унифицированный способ проверить, включено ли ядро ​​«Retpoline» или нет? Я хочу сделать это так, чтобы мой установщик мог использовать правильную сборку модуля ядра для установки.

Вэйшан Ян
источник

Ответы:

21

Если вы используете основные ядра или ядра большинства основных дистрибутивов, лучший способ проверить полную поддержку retpoline ( то есть ядро было настроено с помощью компилятора с поддержкой retpoline CONFIG_RETPOLINEи построено с ним) - это поискать «Full generic retpoline». »в /sys/devices/system/cpu/vulnerabilities/spectre_v2. В моей системе:

$ cat /sys/devices/system/cpu/vulnerabilities/spectre_v2
Mitigation: Full generic retpoline, IBPB, IBRS_FW

Если вы хотите более всесторонние тесты, чтобы обнаружить retpolines в ядрах без spectre_v2файла systree, посмотрите, как spectre-meltdown-checkerобстоят дела.

Стивен Китт
источник
2
Чтобы проверить и другие уязвимости, связанные с расплавлением / призраком, запустите программу $ grep . /sys/devices/system/cpu/vulnerabilities/*, что предлагается в блоге Грега Кроа-Хартмана .
Алекс Вонг
1
Спасибо @Alex; Я отвечал на конкретный вопрос, но это полезно - хотя я предпочитаю head /sys/devices/system/cpu/vulnerabilities/*себя ;-). Это в настоящее время охватывает уязвимости Meltdown / Spectre, но должно также охватывать любые будущие уязвимости аналогичного характера (пространство имен преднамеренно универсально).
Стивен Китт
@StephenKitt Да, headдает лучший форматированный вывод.
Алекс Вонг
4

Ответ Стивена Китта является более полным в этом конкретном случае, потому что поддержка retpoline также нуждается в новой версии компилятора.

Но в общем случае в большинстве дистрибутивов файл конфигурации ядра доступен в одном из следующих мест:

  • /boot/config-4.xx.xx-...
  • /proc/config.gz

Тогда вы можете просто zgrep CONFIG_RETPOLINE /boot/config* /proc/config.gz

JPA
источник
4
Я рекомендую не использовать этот параметр /boot/config*, поскольку он может быть обнаружен CONFIG_RETPOLINEв образе ядра, которое установлено, но не запущено в данный момент, что дает ложное чувство безопасности. Проверка /proc/config.gzили /sys/...безопасна, но многие дистрибутивы Linux компилируют ядро ​​без /proc/config.gz.
Очки
Не могли бы вы сделать логику немного умнее и использовать uname (или эквивалентный syscall), чтобы получить работающее в данный момент ядро, а затем изучить этот конкретный файл / boot / config?
Адам Лученброерс
@pt /boot/config-$(uname -r), тогда?
Муру
2
Использование также /boot/config-$(uname -r)не защищено от ошибок: оно по-прежнему не гарантирует, что конфигурация соответствует работающему ядру. Ядра дистрибутива остаются неизменными uname -rв разных версиях, пока ABI ядра не меняется.
Стивен Китт
Спасибо всем за ваш ответ. Ваш ответ и сообщение полезно.
Вейшан Ян