
Cargador de arranque shim UEFI
shim es una aplicación EFI trivial que, al ejecutarse, intenta abrir y
ejecutar otra aplicación. Inicialmente intentará hacerlo mediante las
llamadas estándar de EFI LoadImage() y StartImage(). Si estas fallan (porque
Secure Boot está habilitado y el binario no está firmado con una clave apropiada,
por ejemplo), entonces validará el binario contra un certificado incorporado. Si
esto tiene éxito y si el binario o la clave de firma no están prohibidos, shim
reubicará y ejecutará el binario.
shim también instalará un protocolo que permite al cargador de arranque de segunda etapa realizar una validación binaria similar. Este protocolo tiene un GUID como se describe en el archivo de cabecera shim.h y proporciona un único punto de entrada. En sistemas de 64 bits, este punto de entrada espera ser llamado con la ABI SysV en lugar de MSABI, por lo que las llamadas al mismo no deben envolverse.
Desde la versión 16.1, shim sobrescribe la tabla del sistema e instala su propia versión de las funciones LoadImage()/StartImage()/UnloadImage()/Exit(), de modo que las segundas etapas pueden simplemente llamarlas desde la tabla del sistema, y funcionará tanto si shim es la primera etapa como si no, sin requerir código específico de shim en las segundas etapas.
Cuando este protocolo está instalado, las UKI firmadas Imágenes de Kernel Unificadas pueden cargarse incluso si el kernel anidado no está firmado, ya que después de que la UKI se carga y valida, shim construye una lista de permitidos interna de todas las secciones contenidas en la UKI. Cuando se carga una imagen desde una de esas secciones, se valida contra listas de denegación (DBX/MOKX/SBAT en el momento de escribir esto), pero no se comprueba contra listas de permitidos (hashes/firmas DB/MOK), ya que la imagen externa ya fue validada y la imagen interna queda así cubierta por esas firmas o hashes. Además, la imagen interna no se mide en el TPM, para evitar mediciones dobles.
En sistemas con un chip TPM habilitado y soportado por el firmware del sistema, shim extenderá varios PCR con los resúmenes (digests) de los objetivos que está cargando. La lista completa está en el archivo README.tpm .
Para usar shim, simplemente coloca un certificado público codificado en DER en un
archivo como pub.cer y compila con make VENDOR_CERT_FILE=pub.cer.
Hay un par de opciones de compilación y un par de formas de personalizar la compilación, descritas en BUILDING.
Consulta el plan de pruebas y abre un ticket si algo falla.
En caso de que sea necesario contactar a los desarrolladores en relación con un incidente de seguridad o una vulnerabilidad, envía un correo a [email protected].