본문 바로가기
리눅스

SHIM & GRUB Secure Boot 분석

by Joseph.Lee 2020. 8. 16.

GRUB's secure boot

rhboot리포의 grub2에서는 secure boot에 대한 검증이 없다.

하지만 ubuntu에서 설치한 grub2는 secure boot가 켜져 있을 때 vmlinuz가 디지털 서명이 되어있지 않으면 "error: ... has invalid signature" 오류가 발생하며 부팅이 중단된다.

https://github.com/jc-lab/ubuntu-grub2

위 리포는 grub 2.04에 ubuntu의 patch들을 적용한 것이다.

linux 명령 실행

https://github.com/jc-lab/ubuntu-grub2/blob/9b548a0d629038d4b19ab678e167669dd29c0628/grub-core/loader/i386/efi/linux.c#L206

여기서 grub_linuxefi_secure_validate 을 호출한다. 이는

https://github.com/jc-lab/ubuntu-grub2/blob/9b548a0d629038d4b19ab678e167669dd29c0628/grub-core/loader/efi/linux.c#L39

에서 구현되어 있다.

 

여기에서는 SHIM_LOCK_GUID 을 통해 shim의 protocol을 가져와 함수를 호출한다.

 

해당 GUID는

#define SHIM_LOCK_GUID \
 { 0x605dab50, 0xe046, 0x4300, {0xab, 0xb6, 0x3d, 0xd8, 0x10, 0xdd, 0x8b, 0x23} }

이다.

SHIM's secure boot

위에서 실행한 verify함수는 여기서 구현되어 있다.

https://github.com/rhboot/shim/blob/476cbff111001d01a5a27dc2289fc7cd2d34c38e/src/shim.c#L1704

실제 검증의 구현체인 verify_buffer 에서는 아래와 같은 순서로 검증을 시행한다.

 

1. check_blacklist : hard-coding 된 black list에 해당하는 인증서인지 확인한다.

2. check_whitelist : hard-coding 된 white list에 해당하는 인증서인지 확인한다.

3. defined(ENABLE_SHIM_CERT) 인 경우 shim_cert 을 통해 검증한다.

4. vendor_cert 을 통해 검증한다.

 

여기서 vendor_cert는 shim을 빌드할 때 하드코딩된다.

SHIM 사용방법

1. 코드사인용 vendor_cert를 생성한다. 이에 대한 Key는 매우 매우 안전하게 보관되어야만 한다. 안그럼 blacklist되버릴수도..ㅋ 암튼 보안중요!

2. 해당 vendor_cert를 포함한 shim efi를 빌드한다.

3. 빌드된 shim efi를 MS(Microsoft)를 통해 codesign한다. 기본적으로 메인보드에 들어있는 인증서는 MS의 인증서 뿐이므로 MS를 통한 코드사인은 필수적이다.

4. grub efi, vmlinuz 등을 vendor_cert를 통해 코드사인해서 사용한다.

 

SHIM을 사용하는 이유?

SHIM이 없다면 grub를 빌드할 때마다, vmlinuz를 빌드할 때마다 MS를 통해 코드사인 해야 한다. 이는 매우매우 번거로운 방법으로써 shim한번만 빌드하고 MS에서 코드사인하여 이후 과정은 vendor cert를 사용하는 식으로 편리한 배포가 가능해 진다.

반응형

댓글