계속하다Microsoft 서명 운영 체제 로더에서 로드된 UEFI 자체 서명 커널나는 사용했다https://github.com/rhboot/shim/releases/tag/15.4내 로컬 컴퓨터에서 빌드합니다(Ubuntu 18.04 LTS).
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.key -out MOK.crt -nodes -days 3650 -subj "/CN=Your Name/"
openssl x509 -in MOK.crt -out MOK.cer -outform DER
SHIM 키(MOK.cer)를 사용하기 위한 소스 코드 컴파일
make VENDOR_CERT_FILE=MOK.cer
콘솔에 "Hello World"를 인쇄하는 테스트 바이너리(grubx64.efi로 이름 변경)에 서명했습니다.
sbsign --key MOK.key --cert MOK.crt --output grubx64.efi test.efi
objdump 도구를 사용하면 서명된 grubx64.efi에서 유효한 SecureDir 섹션을 볼 수 있습니다.
objdump -x grubx64.efi
또한 sbverify를 사용하여 서명을 확인했습니다.
sbverify --list grubx64.efi
이제 SecureBoot에서 SHIM을 실행할 때 SHIM이 SHIM 키로 서명된 grubx64.efi를 로드하려고 하면 다음 오류가 발생합니다.
pe.c:857:handle_sbat() SBAT section data
pe.c:865:handle_sbat() sbat, 1, SBAT Version, sbat, 1, https://github.com/rhboot/shim/blob/main/SBAT.md
pe.c:865:handle_sbat() shim, 1, UEFI shim, shim, 1, https://github.com/rhboot/shim
sbat.c:121:verify_single_entry() component sbat has a matching SBAT variable entry, verifying
sbat.c:182:verify_sbat_helper() finished verifying SBAT data: Success
pe.c:574:generate_hash() sha1 authenticode hash:
pe.c:575:generate_hash() 00000000 XX XX XX XX XX XX XX XX XX XX XX XX 09 aa c7 09 XXXXXXXXXXXX|....|
pe.c:575:generate_hash() 00000004 1e 6b c6 68 88 a9 e5 88 72 fd 81 08 32 15 2e 24 |.k.h....r...2..$|
pe.c:576:generate_hash() sha256 authenticode hash:
pe.c:577:generate_hash() 00000000 08 16 c3 bd 93 91 a5 0f 3a b4 24 a1 b1 97 5c ee |........:.$...\.|
pe.c:577:generate_hash() 00000010 47 33 76 37 7f 71 cc b0 c9 82 e0 ac 50 49 0d 0e |G3v7.q......PI..|
shim.c:630:verify_buffer() check_allowlist: Not Found
shim.c:644:verify_buffer() No signatures found
Verification failed: Security Policy Violation
Failed to load image: Security Policy Violation
shim.c:378 check_allowlist() check_db_hash(db, sha256hash) != DATA_FOUND
shim.c:386 check_allowlist() check_db_hash(db, sha1hash) != DATA_FOUND
shim.c:430 check_allowlist() check_db_hash(MokList, sha256hash) != DATA_FOUND
shim.c:629 verify_buffer() check_allowlist(): Not Found
shim.c:1188 start_image() Failed to load image: Security Policy Violation
start_image() returned Security Policy Violation
Exit status code: Security Violation
어떤 아이디어가 있나요?
답변1
진단하려면 다음이 필요할 수 있습니다.운영 체제 수준 mokutil
도구.
이것을 실행하면 mokutil --list-enrolled
MOK.cer에 대한 인증서 정보를 얻을 수 있습니까(와 유사한 출력 openssl x509 -in MOK.crt -noout -text
)? 그렇지 않으면 MOK가 제대로 등록되지 않은 것입니다. 오류 목록의 다음 줄은 가능한 원인을 제안합니다.
shim.c:630:verify_buffer() check_allowlist: Not Found
shim.c:430 check_allowlist() check_db_hash(MokList, sha256hash) != DATA_FOUND
즉, UEFI NVRAM이라는 변수가 MokList
존재하지 않거나 MOK 인증서를 포함하지 않습니다.
MOK의 경우 부팅 시에만 직접 액세스할 수 있는 방식으로 MokList
새 UEFI NVRAM 변수가 생성되고 보호됩니다( shimx64.efi
및/또는 를 통해). 이는 또한 해당 파일이 존재하지 않기 때문에 파일을 통해 직접 확인할 mmx64.efi
수 없다는 의미이기도 합니다 ./sys/firmware/efi/efivars/MokList-605dab50-e046-4300-abb6-3dd810dd8b23
콘텐츠의 두 번째 복사본은 MokListRT
실행 중인 OS( /sys/firmware/efi/efivars/MokListRT-605dab50-e046-4300-abb6-3dd810dd8b23
Linux에서와 같이)에 액세스할 수 있는 UEFI 변수에 있어야 하며 NVRAM에 영구적으로 저장되어서는 안 됩니다. shimx64.efi
부팅할 때마다 복사되므로 OS에 MokListRT
펌웨어 및 그림과 같이 올바른 내용이 포함되어 있으면 mokutil --list-enrolled
패드에 MOK가 작동하고 있음을 확신할 수 있습니다.
MOK 스토리지에는 UEFI NVRAM 변수가 포함되어 있기 때문에 불행하게도 UEFI 펌웨어 버그 및 구현 문제가 발생할 수 있습니다. 때로는 NVRAM 가변 저장 장치를 공장 초기화할 수도 있습니다(보다 정확하게는UEFI 펌웨어 설정, 그러나 이전 이름이 여전히 존재하는 것 같습니다).
사용 중인 시스템/마더보드의 이름을 언급할 수 있습니다. 보안 부팅 및/또는 UEFI NVRAM 변수에 알려진 문제가 있고 다른 사람이 해결 방법을 찾은 경우 도움을 받을 수 있습니다.