返回

IMA 中带有零模板哈希的 PCR 寄存器重建指南

Linux

IMA 中带有零模板哈希的 PCR 寄存器重建:深入指南

引言

在基于信任度量架构 (IMA) 的系统中,PCR(平台配置寄存器)是用于记录系统配置和完整性信息的特殊寄存器。当对系统进行测量时,测量结果会扩展到相应的 PCR 中,即 PCR = SHA1(PCR || data)。

然而,在某些情况下,测量日志中会出现具有零模板哈希的测量结果(即 0000000000000000000000000000000000000000)。IMA 如何处理这些测量结果,对于正确重建 PCR 寄存器至关重要。

处理方法

对于具有零模板哈希的测量结果,IMA 采用以下处理方法:

  • 跳过零模板哈希测量结果: 这些测量结果不扩展到 PCR 中,因为它没有有意义的信息。
  • 计算 SHA1 模板哈希: 对于具有零模板哈希的测量结果,IMA 手动计算数据的 SHA1 模板哈希。
  • 扩展计算的模板哈希: 使用计算的模板哈希扩展到相应的 PCR 中。

重建步骤

使用提供的处理方法,可以重建带有零模板哈希的 PCR 寄存器:

  1. 收集测量日志: 收集系统中的 IMA 测量日志。
  2. 识别零模板哈希: 确定测量日志中具有零模板哈希的测量结果。
  3. 跳过零模板哈希测量结果: 跳过在第一步中识别的零模板哈希测量结果。
  4. 计算 SHA1 模板哈希: 对于零模板哈希测量结果,手动计算数据的 SHA1 模板哈希。
  5. 扩展 PCR: 使用计算的模板哈希扩展到相应的 PCR 中。
  6. 验证 PCR 值: 使用重建的 PCR 值验证系统完整性。

代码示例

以下代码示例演示了如何使用给定的处理方法重建 PCR 寄存器:

import hashlib

# 加载测量日志
measurements = ["10 4347bff321748edf90d2dc40edaa1b54c7eaaa16 ima-ng sha256:de2e7b1bc7a2aed4e5866d3655d1041206c27caf376ee81bfc4012e8225e0e7c /usr/share/ca-certificates/mozilla/UCA_Global_G2_Root.crt",
               "10 cfa34f58e8319181173d9b9f6345aa3a367702d3 ima-ng sha256:7aa7e87cb29fb7303d8d2402c98b3855b45859640211773c279f0c046e2071c6 /usr/share/ca-certificates/mozilla/E-Tugra_Global_Root_CA_ECC_v3.crt",
               "10 7dd199a752c6484ee8d3c11337dcd8b49f82fa6e ima-ng sha256:05161ad2ac04a0df956ef803e127aa877cc5131e0a727ed8e5de43f02e8868c4 /usr/share/ca-certificates/mozilla/DigiCert_TLS_ECC_P384_Root_G5.crt",
               "10 e9edbe721d1e0c27163c79378a6867a4d4a36ffd ima-ng sha256:2b0b73d3dc775b865bd38a4400bf5020b3c1df3ccb171db98bfcaafed8a49470 /home/verifier/code_examples/cpp-examples/.git/config",
               "10 e5ce41ea6573d2744fb325613c2c8c4ad9b7190b ima-ng sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 /home/verifier/code_examples/cpp-examples/.git/objects/pack/tmp_pack_qM1wJZ",
               "10 0000000000000000000000000000000000000000 ima-ng sha256:0000000000000000000000000000000000000000000000000000000000000000 /home/verifier/code_examples/cpp-examples/.git/objects/pack/tmp_pack_qM1wJZ",
               "10 0000000000000000000000000000000000000000 ima-ng sha256:0000000000000000000000000000000000000000000000000000000000000000 /home/verifier/code_examples/cpp-examples/.git/objects/pack/tmp_pack_qM1wJZ",
               "10 0000000000000000000000000000000000000000 ima-ng sha256:0000000000000000000000000000000000000000000000000000000000000000 /home/verifier/code_examples/cpp-examples/.git/objects/pack/tmp_pack_qM1wJZ",
               "10 bd22836913d6df07e8467fd64c58f02473203884 ima-ng sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 /home/verifier/code_examples/cpp-examples/.git/objects/pack/tmp_idx_3tSjWT",
               "10 65a631f51219253d424893ef413f1064bb347b05 ima-ng sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 /home/verifier/code_examples/cpp-examples/.git/objects/pack/pack-b1d33a47772de5cd9a6ba6149ded5aa281790754.keep"]

# 识别具有零模板哈希的测量结果
zero_hash_measurements = [m for m in measurements if m.endswith("0000000000000000000000000000000000000000")]

# 计算具有零模板哈希的测量结果的 SHA1 模板哈希
sha1_hashes = [hashlib.sha1(m.split(" ")[0].encode()).hexdigest() for m in zero_hash_measurements]

# 使用计算的模板哈希扩展 PCR
for m, h in zip(zero_hash_measurements, sha1_hashes):
    measurements.append(m.replace("00000000000000000