SEV Tools

0x00 Downloads

  1. install dependencies
#run .sh
$ sh deps-install.sh

#manually install
$ sudo apt install git make gcc g++ -y --allow-unauthenticated
  1. git
$ git clone  git@github.com:AMDESE/sev-tool.git
  1. compile
$ cd sev-tool
$ autoreconf -vif && ./configure && make

0x01 Run

  1. pull git(从GitHub拉取最新版本)
$ cd sev-tool
$ git pull
$ autoreconf -vif && ./configure && make
  1. run with help flag
$ sudo ./sevtool -h

0x02 Optional Input Flags

  • —sys_info标志将向用户显示系统信息,例如:BIOS版本、BIOS发布日期、SMT状态、处理器频率、操作系统、内核版本、SEV-Tool的Git提交号等
$ sudo ./sevtool --sys_info --get_id
  • —verbose和—brief标志将打开/关闭显示出的certs/IDs等信息到屏幕上的命令,如pek_csr, pdh_cert_export, get_id命令等
$ sudo ./sevtool --verbose --sys_info --get_id
$ sudo ./sevtool --brief --pek_csr
  • 某些命令支持—ofolder标志,该标志允许用户为命令导出的certs选择输出文件夹。

0x03 Proposed Provisioning Steps

platform Owner(SEV服务器)

  1. 生成OCA
$ openssl ecparam -genkey -name secp384r1 -noout -out ec384-key-pair.pem
$ openssl ec -in ec384-key-pair.pem -pubout -out ec384pub.pem
  1. 平台联网
  2. 安装支持SEV的系统
  3. 检查系统支持
  4. 为SEV-Tools创建目录用来导入/导出生成的certs/IDs(—ofolder命令)
  5. 运行get_id命令
  6. 运行generate_cek_ask命令从AMD KDS服务器获取CEK_ASK

    • 注意:每次从KDS服务器拉出CEK证书时,它都是不同的。服务器每次都重新生成/重新签署证书,而不是存储静态证书
  7. 运行pek_csr命令为PEK(Platform Encryption Key)生成一个证书签名请求。
  8. 执行sign_pek_csr命令,使用提供的OCA私钥签署CSR(证书)(可在OCA平台上执行)。
  9. 执行pek_cert_import命令
  10. 执行pdh_cert_export命令
  11. 执行get_ask_ark命令
  12. 执行export_cert_chain命令将PDH导出到ARK (AMD根目录)并将其压缩
  13. 保存完整的证书链以发送给Guest Owner
  14. 交付可用的UEFI镜像

Guest Owner

  1. 为SEV-Tool创建一个文件夹,用于从/到导入/导出certs/ id(传入带有—ofolder标志的命令)
  2. 从PO处获得镜像
  3. 确认镜像可信
  4. 从平台所有者(PO)获取证书链(PDH通过ARK),并将其解压缩到本地文件夹中
  5. 运行validate_cert_chain命令验证从PDH到ARK (AMD根)的证书链

    • 下载证书并提取相应的ARK和ASK,并使用它们执行验证过程,而不是用PO提供的那些。例子如下:
    # Example for naples and rome processors
     device_type=naples
     if [[ $device_type == naples ]]; ask_size=832; else device_type=rome; ask_size=1600; fi
     wget https://developer.amd.com/wp-content/resources/ask_ark_$device_type.cert
     head -c $ask_size ask_ark_$device_type.cert > ask.cert
     dd < /dev/zero bs=$ask_size count=1 > ark.cert
     dd conv=notrunc if=ask_ark_$device_type.cert of=ark.cert skip=$ask_size iflag=skip_bytes
  6. 验证PO处获得的OCA cert chain
  7. 运行generate_launch_blob命令

    • 读取平台Diffie-Hellman密钥(来自平台的PDH证书)并生成新的公共/私有GO Diffie-Hellman密钥对。当PO使用GODH(Guest Owner Diffie-Hellman)公钥调用Launch_Start时,DH密钥交换完成。
  8. 将blob和来宾所有者的DH公钥发送给PO,用来启动Guest虚拟机
  9. 从PO获得measurement
  10. 运行calc_measurement命令,验证从PO获得的mesurement

    • UEFI镜像是我们hash的摘要参数,可以验证平台是否修改了他
  11. 运行package_secret命令
  12. 发送secret给PO
  13. 给PO“ready to run”的批准

Hypervisor

  1. 在从Guest Owner接收到启动blob和GO Diffie-Hellman公钥之后,Hypervisor可以启动Guest(使用Launch_Start)
  2. 调用Launch_Update_Data 和Activate等
  3. 调用Launch_Measure并将从PSP接收到的measurement发送给GO
  4. 调用Launch_Finish等
  5. 接受到GO发送的package secret后,调用Launch_Secret将GO的secret传递给Guest
  6. GO批准Hypervisor运行Guest

0x04 Command List

详细信息参考SEV-API

1.factory_reset

  • 运行在PO端
  • 注意:在当前的SEV API中,该命令被重命名为PLATFORM_RESET
$ sudo ./sevtool --factory_reset

2.platform_status

  • 输出当前平台状态
  • 运行在PO端
$ sudo ./sevtool --platform_status

3.pek_gen

生成PEK

  • 运行在PO端
$ sudo ./sevtool --pek_gen

4.pek_csr

为PEK导出一个CSR

注意:只有在平台是自有的情况下,这种CSR导出才有效。同理重新导出也需要满足平台自有的条件

  • 可选input参数:

    • —ofolder [folder_path] :csr输出目录
  • 输出:

    • (可选)—verbose :pek_csr以十六进制的可读形式输出到屏幕
    • (可选)—ofolder :pek_csr以十六进制的可读形式输出到指定目录的文件中(pek_csr_out.cert和pek_csr_out_readable.cert)
  • 运行在PO端
$ sudo ./sevtool --ofolder ./certs --pek_csr

5.pdh_gen

生成PDH

  • 运行在PO端
$ sudo ./sevtool --pdh_gen

6.pdh_cert_export

为PDH导出一个证书

  • 可选input参数:

    • —ofolder [folder_path] :PDH证书和证书链(PEK、OCA、CEK)输出目录
  • 输出:

    • (可选)—verbose :PDH证书和证书链以十六进制的可读形式输出到屏幕
    • (可选)—ofolder :PDH证书和证书链以十六进制的可读形式输出到指定目录的文件中(pdh_out.cert、pdh_readable_out.cert、cert_chain_out.cert、cert_chain_readable_out.cert)
  • 运行在PO端
$ sudo ./sevtool --ofolder ./certs --pdh_cert_export

7.pek_cert_import

先进行命令18

导入已签名的PEK CSR和相应的OCA证书

注意:平台必须自有才可导入

  • 需要input参数:

    • 已签名的PEK CSR
    • 签署CSR的OCA证书(AMD证书格式)
  • 读入文件:[signed PEK CSR] [oca_cert_file]
  • 运行在PO端
$ sudo ./sevtool --pek_cert_import pek_csr.signed.cert oca.cert

8.get_id

  • 可选input参数:

    • —ofolder [folder_path] :Socket0和Socket1的IDs输出目录
  • 输出:

    • (可选)—verbose :Socket0和Socket1的IDs输出到屏幕
    • (可选)—ofolder :Socket0和Socket1的IDs输出到指定目录的文件中(getid_s0_out.txt、getid_s1_out.txt)
  • 运行在PO端
$ sudo ./sevtool --ofolder ./certs --get_id

9.set_self_owned

  • 运行在PO端
$ sudo ./sevtool --ofolder ./certs --set_self_owned

10.set_externally_owned

将平台设置为自有,并一次性完成导出PEK CSR,签名,再导入的过程。

  • 需要input参数:OCA的私钥(.pem格式)
  • 读入文件:[oca_priv_key_file]
  • 运行在PO端
$ sudo ./sevtool --set_externally_owned [oca_priv_key_file]
$ sudo ./sevtool --set_externally_owned ../psp-sev-assets/oca_key_in.pem

11.generate_cek_ask

调用get_id命令并将该ID传递给AMD KDS服务来检索cek_ask

注意:如果该命令在连接到KDS服务时返回错误,请再次尝试该命令

  • 可选input参数:

    • —ofolder [folder_path] :cek_ark.cert输出目录
  • 输出:

    • (可选)—ofolder :针对特定平台(Socket0中的处理器)的cek_ark.cert输出到指定目录的文件中(cek_ask.cert)
  • 运行在PO端
$ sudo ./sevtool --ofolder ./certs --generate_cek_ask

12.get_ask_ark

  • 可选input参数:

    • —ofolder [folder_path] :ask_ark证书输出目录
  • 输出:

    • (可选)—ofolder :指定后将ask_ark证书输出到指定目录的文件中(ask_ark.cert),否则将被导出到与SEV-Tool可执行文件相同的目录
  • 运行在GO端
$ sudo ./sevtool --ofolder ./certs --get_ask_ark

13.export_cert_chain

导出所有的证书(PDH、PEK、OCA、CEK、ASK、ARK),并将它们压缩,以便PO可以将它们发送给GO,GO用来验证证书链。该工具从AMD KDS服务器获取CEK,从SEV开发者网站获取ASK_ARK证书。

  • 可选input参数:

    • —ofolder [folder_path] :证书和压缩文件输出目录
  • 输出:

    • (可选)—ofolder :指定后将证书和压缩文件输出到指定目录的文件中(pdh.cert, pek.cert, oca.cert, cek.cert, ask.cert, ark.cert, certs_export.zip),否则将被导出到与SEV-Tool可执行文件相同的目录
  • 运行在PO端
$ sudo ./sevtool --ofolder ./certs --export_cert_chain

14.calc_measurement

可以输入用于计算HMAC的所有参数,并生成一个输出

摘要参数是传递到LaunchUpdateData和LaunchUpdateVMSA的数据的SHA256 (Naples)或SHA384 (Rome)输出摘要

  • 需要的input参数:(输入参数格式为ascii编码的十六进制bytes)

    API=$(dd if=pek.cert ibs=1 skip=4 count=2 2>/dev/null | xxd -p)
    API_MAJOR=$(echo $API | cut -c1-2)
    API_MINOR=$(echo $API | cut -c3-4)
    TIK=$(xxd -p tmp_tk.bin  | tr -d '\n'  | tail -c 32)
  • 可选input参数:

    • —ofolder [folder_path] :measurement输出目录
  • 输出:

    • (可选)—verbose :measurement将输出到屏幕
    • (可选)—ofolder :测量值将输出到指定目录的文件中(calc_measurement_out.bin、calc_measurement_out.txt)
  • 运行在GO端
$ sudo ./sevtool --calc_measurement [Context] [Api Major] [Api Minor] [Build ID] [Policy] [Digest] [MNonce] [TIK]
$ sudo ./sevtool --ofolder ./certs --calc_measurement 04 00 12 0f 00 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 4fbe0bedbad6c86ae8f68971d103e554 66320db73158a35a255d051758e95ed4
    You have entered 10 arguments
    Command: calc_measurement
    Input Arguments:
      Context: 04
      Api Major: 00
      Api Minor: 12
      Build ID: 0f
      Policy: 00
      Digest: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
      MNonce: 4fbe0bedbad6c86ae8f68971d103e554
      TIK: 66320db73158a35a255d051758e95ed4

    Output Measurement:
    6faab2daae389bcd3405a05d6cafe33c0414f7bedd0bae19ba5f38b7fd1664ea

   Command Successful

#注意:安全考虑TIK不显示

15.validate_cert_chain

将整个证书链导入为单独的证书文件并对其进行验证

注意:使用本命令时应先解压证书压缩文件

  • 验证步骤:

    • 导入证书
    • ARK(self-signed)—验证—>ARK
    • ARK—验证—>ASK
    • ASK—验证—>CEK
    • CEK+OCA—验证—>PEK
    • PEK—验证—>PDH
  • 可选input参数:

    • —ofolder [folder_path] :证书存放目录,若不指定则从与SEV-Tool可执行文件相同的目录中获取
  • 读入文件:ask.cert、ask.cert、cek.cert、oca.cert、pek.cert、pdh.cert
  • 运行于GO端
$ sudo ./sevtool --ofolder ./certs --validate_cert_chain

16.generate_launch_blob

该命令从PO导入PDH证书,构建Launch_Start会话缓冲区(blob)和GODH公钥证书。

步骤:GO首先生成一个DH公私钥对,然后与PDH公钥一起计算share secret和master secret,之后使用master secret生成一个新的TEK和TIK。

  • 需要的input参数:十六进制格式的Guest Proxy
  • 可选input参数:

    • —ofolder [folder_path] :blob文件输出目录
  • 读入文件:pdh.cert
  • 输出:

    • (可选)—ofolder :blob文件和GODH公钥证书将输出到指定目录,同时GODH的公私钥也将导出并只供SEV-Tools使用(launch_blob.bin、godh.cert, (ignore these: godh_pubkey.pem, godh_privkey.pem))
    • 注意:blob文件为二进制,为了给qemu使用,需要手动转换为base64
  • 运行于GO端
$ sudo ./sevtool --ofolder ./certs --generate_launch_blob [guest policy]
$ sudo ./sevtool --ofolder ./certs --generate_launch_blob 39

17.package_secret

该命令读取在pek.cert中包含的API信息,generate_launch_blob命令为TEK生成的文件(tmp_tk.bin),以及calc_measurement_out.txt和经过TEK加密/包装的秘密文件(secret.txt),然后它输出一个文件(packaged_secret.txt),然后将该文件作为常规API流的一部分传递给Launch_Secret

  • 需要的input参数:—ofolder [folder_path] :blob文件和secrets文件存放目录,同时是packaged secret文件的输出目录
  • 读入文件:secret.txt、launch_blob.bin、tmp_tk.bin、calc_measurement_out.bin
  • 输出:

    • (可选)—ofolder :packaged secret文件输出目录(packaged_secret.txt)
  • 运行于GO端
$ sudo ./sevtool --ofolder ./certs --package_secret

18.sign_pek_csr

该命令读取CSR并使用提供的OCA私钥对其签名,创建了oca.cert文件(指定了AMD证书格式的公钥)

  • 需要的input参数:

    • 需要签名的CSR(pek_csr.cert)
    • pem格式的OCA私钥([oca_priv_key].pem)
  • 可选的input参数:

    • —ofolder [folder_path] :签名后的CSR和OCA证书存放目录
  • 输出:

    • oca.cert:属于私钥的公钥证书,格式为AMD证书格式
    • pek_csr.signed.cert:已包含OCA签名的CSR签名,缺少PEK签名
  • 运行于PO端(OCA)
$ sudo ./sevtool --sign_pek_csr [pek_csr.cert] [oca_priv_key]
$ sudo ./sevtool --sign_pek_csr pek_csr.cert oca_priv.pem

19.validate_attestation

该命令导入attestation命令发送的报告(attestation_report.bin)和PEK证书(pek.cert,在使用generate_all_certs命令时生成),验证该报告是否由PEK签名

  • 可选的input参数:

    • —ofolder [folder_path] :attestation报告和pek证书文件的存放目录
  • 读入文件:attestation_report.bin、pek.cert
  • 运行于GO端
$ sudo ./sevtool --ofolder ./certs --validate_attestation

20.validate_guest_report

该命令导入由Attestation guest message生成的attestation报告(guest_report.bin),通过SNP_GUEST_REQUEST与平台当前VCEK (vcek. pem,通过调用export_cert_chain_vcek命令(command22)导出)一起发送,验证该报告是由VCEK签署的。

  • 可选的input参数:

    • —ofolder [folder_path] :attestation报告和vcek证书文件的存放目录
  • 读入文件:guest_report.bin、vcek.pem
  • 运行于GO端
$ sudo ./sevtool --ofolder ./certs --validate_guest_report

21.validate_cert_chain_vcek

该命令将整个证书链导入为单独的pem证书文件并验证

注意:先解压证书文件再调用本命令

  • 步骤:

    • 导入VCEK、ASK和ARK.pem证书
    • ARK(self-signed)—验证—>ARK
    • ARK—验证—>ASK
    • ASK—验证—>VCEK
  • 可选的input参数:

    • —ofolder [folder_path] :证书文件的存放目录
  • 读入文件:vcek.pem、ask.pem、ark.pem
  • 运行于GO端
$ sudo ./sevtool --ofolder ./certs --validate_cert_chain_vcek

22.export_cert_chain_vcek

该命令将所有的证书(VCEK, ASK, ARK)导出为.pem文件,并压缩,用来让GO验证VCEK证书链和来自SNP_GUEST_REQUEST的SNP guest message的认证报告

其中VCEK和ASK_ARK的证书从AMD KDS服务器获得

  • 可选的input参数:

    • —ofolder [folder_path] :证书文件和其压缩包的导出目录
  • 输出:

    • (可选)—ofolder :证书文件和压缩包的输出目录,若不指定则将文件导出到与SEV-Tool可执行文件相同的目录(vcek.der、vcek.pem、cert_chain.pem、ask.pem、ark.pem、certs_export_vcek.zip)
  • 运行于PO端
$ sudo ./sevtool --ofolder ./certs --export_cert_chain_vcek

23.test_all

测试命令,运行后查看输出是否正常

  • 需要的input参数:

    • —ofolder [folder_path] :创建一个测试目录用于存储测试期间生成的文件和数据
    • 注意:测试开始之前会自动清理该目录
$ sudo ./sevtool --ofolder ./tests --test_all
END
本文作者:
文章标题:SEV Tools使用说明
本文地址:http://www.hackerhome.top/index.php/archives/34/
版权说明:若无注明,本文皆由"岁月年华的秘密基地"原创,转载请保留文章出处。
最后修改:2023 年 01 月 20 日 09 : 22 PM
如果觉得我的文章对你有用,请随意赞赏