Обновить

Комментарии 24

Спасибо за инструкцию.

Если Вам не трудно, попробуйте пройти её на реальном железе. Если будут какие-то проблемы, или я что-то забыл добавить в руководство, то я это исправлю.

Ок, я попробую подписать загрузчик на своем ноуте.

apt-get update && apt-get install mokutil --yes

А из сорцов оно на фре не соберётся?

Не смог найти в портах и через `pkg search` :-(

Что-то мне подсказывает, что эта штука пока существует только под Linux. Дело в том, что эта утилита для управления MOK устанавливает переменной EFI какое-то значение, которое при следующей загрузке приводит к загрузке не shimx64.efi, а mmx64.efi. (посмотрите у себя в /boot/efi/EFI/debian/). В конце своей работы этот загрузчик (если его можно так назвать) сбрасывает значение переменной, и загрузка снова проходит нормально.

Я пробовал собрать mokutil под FreeBSD,там есть ависимость от libkeyutils который под FreeBSD не собирается из-за каких-то специфических зависимостей (заголовочных файлов) от Linux ядра.

Спасибо за статью.
Но хотелось бы прояснить момент. Если я правильно понял, результат поиска доступных загрузчиков из п.2 определяет содержимое boot menu. Собственно вопрос: можно ли настроить так чтобы при обнаружении загрузчика для винды, он не пытался его проверит MOK ключами, и наоборот использовать только MOK для остальных. Почему спрашиваю - все мы люди и после работы иногда играем. А так как работаем ("мы, николай вторый...)))))") в линухе, а играем в батлу на винде возникает проблема дуалбута и переключения профиля ключей в материнке при перезагрузках. Если этого не делать, то или винда не запустит античит или линух продинамит само-сборный (но подписанный MOK) нужный для работы модуль.

Не очень понятен контекст. Расскажу свою ситуацию. У меня три ОС:

  • Windows 11

  • Debian Trixie

  • FreeBSD 15

Загрузчик Windows 11 подписан ключом, который и так есть в UEFI материнской платы (ASUS ROG Strix Z370G), его проверка по умолчанию проходит успешно.

Debian Trixie использует shim-loader, который тоже подписан ключом Microsoft. Не знаю, тем же самым что и загрузчик Windows, или другим, но суть одна: с ним тоже проблем нет.

Драйверы NVIDIA и VirtualBox для Linux подписаны MOK'ом. Им же подписан загрузчик FreeBSD. Благодаря этому я просто включил Secure Boot в режим "Windows OS" и никаких проблем не знаю. Во время загрузки нажал F8, выбрал нужную ОС, нажал Enter, всё (GRUB не видит FreeBSD, но видит Windows). Т. е. если подписать что нужно и поместить ключ в UEFI, то не надо больше теребонькать Secure Boot в настройках материнской платы. Один раз включили и забыли.

Хм, а вот теперь стало интересно. Все тоже самое, только проприетарный модуль для радеон и вмварь. MOK собирал не сам, доверившись установочному скрипту. Подписанные модули так и не завелись с профилем Windows UEFI mode, а при переключение на Other OS уже винда считает загрузку не безопасной.
Весь этот движ для меня начался после того как игры стали требовать безопасную загрузку.
Постараюсь в ближайшее время еще раз проверить.
согласно доке винда все одобрит только если не будет посторонних ключей. Что вполне логично: что мне мешает подписать MOK чит/вирус и загрузить его в винде?

Установочный скрипт обычно работает так:

  1. Создаём приватный ключ, MOK и сертификат.

  2. Подписываем что нужно приватным ключом.

  3. Удаляем приватный ключ.

Заметили чего не хватает? Правильно! Не хватает шага импорта MOK в UEFI. Например, установщик NVIDIA сохраняет MOK по пути /usr/share/nvidia/ в файл с расширением .der. Это наш MOK и есть. Но в какой момент установщик его раскатывает в UEFI? А ни в какой, это надо делать самому.

что мне мешает подписать MOK чит/вирус и загрузить его в винде

Система безопасности Windows, для которой что-то, работающее на уровне ядра, но не имеющее подписи Microsoft, считается угрозой?

Глупый вопрос: вы ведь проверяете в винде состояние безопасной загрузки по выводу msinfo32, а не просто по факту загрузки?

В моём случае я проверяю состояние Secure Boot по состоянию настроек в UEFI.

А можете проверить вывод msinfo32 ? Жаль, но в противном случае это умножает ценность статьи на 0.

В общем в выходные переставил трикси и все собрал аккуратно руками. Все завелось и работает нормально. Атору благодарность за статью. Подробности опишу ниже в ответе тов. @dartraiden

что мне мешает подписать MOK чит/вирус и загрузить его в винде?

Windows проверяет подпись драйверов независимо от того, что там у вас в хранилище, и включён ли Secure Boot вообще.

Если вы хотите загрузить ядерный драйвер Windows, не имеющий подписи MS WHQL, вам придётся, во-первых, отключить Secure Boot (иначе Windows не позволит включить тестовый режим), во-вторых, включить тестовый режим и подписать этот драйвер своим ключом, в-третьих, добавить ключ в доверенные корневые в самой Windows.

(чтобы не усложнять, я специально не упоминаю про такую экзотику как полное отключение проверки подписей (потому что этот режим нужно включать перед каждой загрузкой и для повседневного использования он не предназначен) и известную дыру с кросс-подписями, позволяющую подписывать драйверы утекшими сертификатами в обход WHQL (их осталось мало живых, да и они давно в чёрных списках у популярных античитов)

Подписанные модули так и не завелись с профилем Windows UEFI mode, а при переключение на Other OS уже винда считает загрузку не безопасной.

У майков есть два ключа. Одним они подписывают собственные загрузчики (Windows), вторым - всякое линуксовое добро типа shim, GRUB и т.д.

"Windows UEFI mode" означает "доверять только ключу, которым подписывают винду", что позволяет грузить только Windows.

"Other OS" позволяет грузить то, что подписано не предыдущим ключом

Почему у вас Windows считает Other OS чем-то недостаточно надёжным, я не знаю.

(опять же, я специально упрощаю, говоря про "два ключа", на самом деле, сейчас их уже пять: поскольку те самые "два ключа" в следующем году протухнут, майки выпустили ещё три: пара на замену описанным выше, а третий отдельный для подписи прошивок внешних устройств типа видеокарт).

В винде, в принципе, мне ничего не нужно. Это просто прошивка компа для игр. Собственно моя задача это обеспечить вывод msinfo32 о безопасной загрузке (для работы античита) и нормальную работу самообороных модулей ядра в линуксе без манипуляций с биосом при перезагрузке. Попытка решить это в режиме домохозяйки и стандартными установочными скриптами не увенчались успехом. Работало что-то одно. Судя по тому, что при включённом секъюр буте нормально загружались модули в линуксе при выборе профиля otherOS, МОК таки прописался в материнку. В выходные ещё раз накачу трикси руками и проверю.

Почему у вас Windows считает Other OS чем-то недостаточно надёжным, я не знаю.

Об чем и спич!!! Я так понял это не только у меня, а вообще поведение винды. Я понимаю это, и не против. У меня больше вопрос к производителям материнок: прикрутите возможность привязки профиля ключей к бут меню.

Судя по документации, у асуса Other OS это отключение SB вообще.

https://www.asus.com/ru/support/faq/1049829/

А вам для дуалбута нужно скрафтить свои ключи и добавить к ним ключи Microsoft, как описано в этой статье. Затем в настройках биоса стереть предустановленные и загнать то, что у вас получилось. Таким образом, вы сможете грузить загрузчики Windows, сторонние загрузчики, подписанные Microsoft, а также загрузчики и модули ядра Linux, подписанные лично вами.

В общем, я посмотрел, биос асуса, там Other OS, похоже, означает "выключить Secure Boot", так что выше мои рассуждения про это можно смело пропускать.

Асусу минус в репутацию за то, что не назвал опцию просто и понятно - "Enable Secure Boot"

Да, вы совершенно правы. В моей матринке сработал выбор режима Winodws UEFI и Custom (а не Standart для key management). Моей главной ошибкой была спешка. При импорте ключа и ввода пароля после перезагрузки просто жмякал continue boot. На самом деле надо было пройти квест вроде "чувак, ты уверен?... точно-точно???... ну ок, я предупреждал". т.е. факт ввода пароля вовсе не значил что ключ импортнулся. В итоге после этого все заработало: винда отчиталась что загрузка безопасна и античит в батле заработал нормально, а в линухе модули успешно загружены.
Для себя отметил следующее:
1. делать бэкап - чтобы не плодить ключи, а подписывать одним (в моем случае собрал модули для vmware и virtualbox)
2. если что-то не работает в первую очередь проверить вывод `mokutil --list-enrolled`
3. выбрать какой-то один способ выбора загрузки: F8 boot menu или GRUB - линуху пофигу, а вот в винде слетает Windows Hello и нужно заново авторизовать все учетки


mokutil --import MOK.der

А что мешает вирусу сделать то же самое?

Может быть это слишком, или детектится антивирем легко.. а вообще если захотят реально взломать - не помешает ни МОК, ни антивирус)

После выполнения этой команды нужно ввести пароль. Ну, допустим, инвертированный кейлоггер это сделал. На следующем этапе нужно:

  1. Перезагрузить компьютер. Окей, не сложно.

  2. Загрузить отдельную операционную систему, подписанную уже установленным в UEFI ключом (в Debian Linux это /boot/efi/EFI/debian/mmx64.efi).

  3. В загруженной ОС как-то пронажимать клавиши, чтобы раскатать свой ключ.

Ну, ок, удачи.

не выглядит невозможным для спецслужб, например.

для вирусописателей - да, геморройно

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации