追踨法蘭克

2012年12月27日 星期四

Secure Boot & Secure Flash

 Secure Boot

Secure Boot 是Microsoft在Windows 8 導入的一項新技術,需要UEFI 2.3.1之後版本的配合,它用來防止未認證的firmware、EFI Driver/Loader、OS在開機過程的時候被執行,而這篇主要是介紹認證的方法,我們叫做sign的動作,而被sign過的Program會在原Program的檔案加上數位簽章(Digital Signature),還有驗證是否有被認證等等。

在Platform的Secure Boot功能被Disable時,所有的EFI Program不需要認證就可以被執行,但是在Secure Boot功能被Enable時,EFI Programs必須被Sign過才能被執行,否則在開機時會發生認證失敗,而不允許開機。



它認證的方式是,在BIOS裡會有一個Database,它存放著一組公鑰(Public Key),在開機的過程中,會由這組公鑰來驗證EFI Program是否有數位簽章? 如果驗證通過,該EFI Program就可以被執行,而繼續開機驗證下一個EFI Program.

它sign的動作,是私鑰(Private Key)由signer來達到sign Program的目的,一般這個signer tool會由BIOS Vendor、OEM或OS廠商提供,而私鑰會保留在OEM廠商或是OS廠商,由它們來做sign的動作,例如OS的loader由OS廠商來sign, OEM的Program由OEM廠商做sign的動作。

公鑰和私鑰是一起產生出來的一對Key,私鑰保留在原廠商,用來sign program,公鑰提供給ODM廠開發BIOS時,放入BIOS的DB中,用來驗證program是否有被sign過,以達到secure boot的功能。

Secure boot database裡主要有PK、KEK、db、dbx四個成員,它們的定義和用途如下...

PK:  可以稱作Platform Key或是System Master Key,它是一個Key pair, 一般是由OEM提供,用途是update KEK.

KEK:  Key Enrollment Key database, 一般是由OEM或是OS Partner提供,用途是update db.

db: signature database, db裡會存放許多private keys和public keys,private key用來sign EFI program(Driver/Loader), public key用來verify EFI program是否有digital signature,這些keys由OEM或OS Partner提供。


dbx: revoked signatures database, 這和db正好相版,類似黑名單的功能,在dbx裡所列的EFI program或loader是不被信任,也不能被執行的。

我們有一些defaut key來自於Microsoft必須導入...

一組為KEK,叫做KEK_MSFTproductionKekCA.cer,它允許一些Microsft的Variable可以用Set Variable的方式來更新db和dbx.

另外兩組在db裡,一個叫做db_MSFTproductionUEFIsigningCA.cer, 它用來允許來自3rd party的UEFI drivers和applications能夠正常執行。另一個叫做db_MSFTproductionWindowsSigningCA.cer, 它用來通過Win 8 OS loader的驗證。

Secure Flash:

Secure Flash就更為單純, 它在BIOS flash tool作BIOS update時,必須要使用sign過的BIOS binary才能做更新,否則不允許更新BIOS。它一樣需要把Secure Flash的Key放在BIOS中,這把Key是由OEM提供。

Sign和Verify的步驟:

不管是Secure Boot還是Secure Flash, 都有Sign和Verify的動作,Sign都是由signer tool搭配private key來做,Verify由BIOS code搭配放入BIOS的public Key來運作。

Sign by tool:

1.將要被sign的program檔案做hash處理(SHA256).
2.用private key把hash過的資料做編碼的動作,這動作我們叫sign的動作,sign好的資料叫做數位簽章。
3. 將數位簽章附加到檔案上。

Verify by BIOS:

1. 將sign過的program分離出progarm原檔案和數位簽章的資料。
2. 用public key把數位簽章的資料做解碼的動作,產生資料A.
3. 把program原檔案做hash處理(SHA256),產生資料B.
4. 將資料A和資料B做比對,如果相等表示此Program是可執行的。




1 則留言:

  1. Hi, I also have a post about how to customize Signature for secure boot using OpenSSL. Welcome to check my blog as well, thanks!

    http://mephistolai.blogspot.tw/2013/11/x86-8-how-to-customize-signature-for.html

    回覆刪除