
UEFI shim loader
shim은 실행 시 다른 애플리케이션을 열어 실행하려고 시도하는 간단한 EFI 애플리케이션입니다. 처음에는 표준 EFI LoadImage() 및 StartImage() 호출을 통해 이를 시도합니다. 이러한 호출이 실패하면(예: Secure Boot가 활성화되어 있고 바이너리가 적절한 키로 서명되지 않은 경우) shim은 내장 인증서를 기준으로 바이너리를 검증합니다. 검증에 성공하고 바이너리 또는 서명 키가 금지되지 않은 경우 shim은 바이너리를 재배치하고 실행합니다.
shim은 또한 2단계 부트로더가 유사한 바이너리 검증을 수행할 수 있게 하는 프로토콜을 설치합니다. 이 프로토콜은 shim.h 헤더 파일에 설명된 GUID를 가지며 단일 진입점을 제공합니다. 64비트 시스템에서 이 진입점은 MSABI가 아닌 SysV ABI로 호출되어야 하므로, 해당 호출을 래핑해서는 안 됩니다.
버전 16.1부터 shim은 시스템 테이블을 재정의하고 자체 버전의 LoadImage()/StartImage()/UnloadImage()/Exit() 함수를 설치합니다. 이에 따라 2단계 부트로더는 시스템 테이블에서 해당 함수를 간단히 호출할 수 있으며, shim이 1단계인지 여부와 관계없이 2단계에서 shim 전용 코드를 요구하지 않고도 작동합니다.
이 프로토콜이 설치되면, UKI가 로드되고 검증된 후 shim이 UKI에 포함된 모든 섹션의 내부 허용 목록을 구축하므로, 서명된 UKI Unified Kernel Images는 내부 커널이 서명되지 않은 경우에도 로드될 수 있습니다. 이러한 섹션 중 하나에서 이미지가 로드되면 차단 목록(작성 시점 기준 DBX/MOKX/SBAT)에 대해 검증되지만 허용 목록(DB/MOK 해시/서명)에는 검사되지 않습니다. 외부 이미지가 이미 검증되었고 내부 이미지가 해당 서명 또는 해시에 포함되기 때문입니다. 또한 이중 측정을 피하기 위해 내부 이미지는 TPM에서 측정되지 않습니다.
TPM 칩이 활성화되어 있고 시스템 펌웨어가 지원하는 시스템에서 shim은 로드 중인 대상의 다이제스트로 다양한 PCR을 확장합니다. 전체 목록은 README.tpm 파일에 있습니다.
shim을 사용하려면 DER로 인코딩된 공개 인증서를 pub.cer과 같은 파일에 넣고 make VENDOR_CERT_FILE=pub.cer로 빌드하기만 하면 됩니다.
BUILDING에 설명된 대로 몇 가지 빌드 옵션과 빌드를 사용자 지정하는 몇 가지 방법이 있습니다.
테스트 계획을 확인하고, 문제가 발생하면 티켓을 제출하세요!
보안 사고 또는 취약점 관련하여 개발자에게 연락해야 하는 경우 [email protected]으로 메일을 보내 주시기 바랍니다.