
shim — это тривиальное EFI-приложение, которое при запуске пытается открыть и выполнить другое приложение. Изначально оно пытается сделать это через стандартные вызовы EFI LoadImage() и StartImage(). Если эти вызовы завершаются неудачей (например, из-за включённого Secure Boot, когда двоичный файл не подписан подходящим ключом), то shim проверяет двоичный файл с помощью встроенного сертификата. Если эта проверка проходит успешно и двоичный файл или подписывающий ключ не запрещены, shim перемещает и выполняет двоичный файл.
shim также устанавливает протокол, который позволяет загрузчику второй стадии выполнять аналогичную проверку двоичных файлов. Этот протокол имеет GUID, описанный в заголовочном файле shim.h, и предоставляет единственную точку входа. В 64-битных системах эта точка входа должна вызываться с SysV ABI, а не MSABI, поэтому вызовы к ней не должны быть обёрнуты.
Начиная с версии 16.1 shim переопределяет системную таблицу и устанавливает собственную версию функций LoadImage()/StartImage()/UnloadImage()/Exit(), так что вторые стадии могут просто вызывать их из системной таблицы, и это будет работать независимо от того, является ли shim первой стадией, без необходимости в shim-специфичном коде во вторых стадиях.
Когда этот протокол установлен, подписанные UKI Unified Kernel Images могут быть загружены, даже если вложенное ядро не подписано, поскольку после загрузки и проверки UKI shim создаёт внутренний список разрешённых (allowlist) всех секций, содержащихся в UKI. Когда образ загружается из такой секции, он проверяется по спискам запрещённых (denylists) (на момент написания — DBX/MOKX/SBAT), но не проверяется по спискам разрешённых (allowlists) (хэши/подписи DB/MOK), поскольку внешний образ уже был проверен, и внутренний образ, таким образом, покрыт этими подписями или хэшами. Кроме того, внутренний образ не измеряется в TPM, чтобы избежать двойных измерений.
В системах с включённым и поддерживаемым прошивкой системы чипом TPM shim расширяет различные PCR значениями хэшей (digests) загружаемых целей. Полный список приведён в файле README.tpm.
Для использования shim просто поместите DER-кодированный открытый сертификат в файл, например pub.cer, и выполните сборку с make VENDOR_CERT_FILE=pub.cer.
Существует несколько параметров сборки и несколько способов её настройки, описанных в BUILDING.
См. test plan и создайте тикет, если что-то не работает!
В случае, если необходимо связаться с разработчиками по поводу инцидента безопасности или уязвимости, напишите на [email protected].