如何复制 PCR 值的扩展,例如沙1苏姆?
Posted
技术标签:
【中文标题】如何复制 PCR 值的扩展,例如沙1苏姆?【英文标题】:How can a the extension of the PCR value be replicated with e.g. sha1sum? 【发布时间】:2012-04-27 03:38:51 【问题描述】:这与以下帖子有些相关: Perform OR on two hash outputs of sha1sum
我有一组 TPM 测量样本,例如以下:
10 1ca03ef9cca98b0a04e5b01dabe1ff825ff0280a ima 0ea26e75253dc2fda7e4210980537d035e2fb9f8 boot_aggregate
10 7f36b991f8ae94141753bcb2cf78936476d82f1d ima d0eee5a3d35f0a6912b5c6e51d00a360e859a668 /init
10 8bc0209c604fd4d3b54b6089eac786a4e0cb1fbf ima cc57839b8e5c4c58612daaf6fff48abd4bac1bd7 /init
10 d30b96ced261df085c800968fe34abe5fa0e3f4d ima 1712b5017baec2d24c8165dfc1b98168cdf6aa25 ld-linux-x86-64.so.2
根据TPM规范,也就是上面帖子中提到的,PCR扩展操作是:PCR := SHA1(PCR || data),即“将PCR的旧值与数据连接,对连接后的字符串进行hash并将散列存储在 PCR 中”。此外,我发现的规范多篇论文和演示文稿提到数据是要加载的软件的哈希值。
但是,当我执行echo H(PCR)||H(data) | sha1sum
之类的操作时,我没有获得正确的结果值。即,当计算(使用上述哈希):echo 1ca03ef9cca98b0a04e5b01dabe1ff825ff0280a0ea26e75253dc2fda7e4210980537d035e2fb9f8 | sha1sum
,结果值不是7f36b991f8ae94141753bcb2cf78936476d82f1d
。
我对 TPM_Extend 操作的理解是否正确?如果是这样,为什么生成的哈希值与样本测量文件中的不同?
谢谢! /n
【问题讨论】:
除了我的回答,您还需要更多信息吗? 好的,既然文件中的值不是PCR10的内容,那么注册表中实际存储的是什么?是根据存储在文件中的测量值计算出的哈希值吗? 我不是 100% 确定,因为我在国外,没有合适的系统,但它应该是所有哈希的“链”。所以像 SHA-1(SHA-1(0...0 | 1ca03ef9cca98b0a04e5b01dabe1ff825ff0280a) | 7f36b991f8ae94141753bcb2cf78936476d82f1d) ..... 随意提出一个新问题(因为这是一个不同的问题),我会尝试调查进一步... 【参考方案1】:回答您的第一个问题:您对扩展操作的理解或多或少是正确的。但是你有两个问题:
-
您误解了您在此处复制的内容
您无法像在 shell 上那样计算哈希
您在此处提供的日志输出来自 Linux 的 IMA。根据
documentation 第一个哈希是template-hash
并定义为
template-hash: SHA1(filedata-hash | filename-hint)
filedata-hash: SHA1(filedata)
所以对于第一行:SHA1(0ea26e75253dc2fda7e4210980537d035e2fb9f8 | "boot_aggregate")
结果为1ca03ef9cca98b0a04e5b01dabe1ff825ff0280a
。
请注意,文件名提示的长度为 256 字节 - 在末尾填充 0。 (为从内核源代码中挖掘此内容点赞;))
所以要明确一点:在您的日志中没有 PCR 值。
我用 Ruby 写了一些东西来验证我的发现:
require 'digest/sha1'
filedata_hash = ["0ea26e75253dc2fda7e4210980537d035e2fb9f8"].pack('H*')
filename_hint = "boot_aggregate".ljust(256, "\x00")
puts Digest::SHA1.hexdigest(filedata_hash + filename_hint)
现在开始你的命令:
您在这里使用它的方式是将哈希解释为 ASCII 字符串。
另请注意, echo 将在输出中添加一个额外的换行符。
字符序列1ca03ef9cca98b0a04e5b01dabe1ff825ff0280a
是十六进制
160 位二进制数据的编码 - SHA1 哈希值。所以基本上你是对的,
您必须连接这两个值并计算结果的 SHA1
320位数据。
所以正确的命令行命令应该是这样的
printf "\x1c\xa0\x3e\xf9\xcc\xa9\x8b\x0a\x04\xe5\xb0\x1d\xab\xe1\xff\x82\x5f\xf0\x28\x0a\x0e\xa2\x6e\x75\x25\x3d\xc2\xfd\xa7\xe4\x21\x09\x80\x53\x7d\x03\x5e\x2f\xb9\xf8" | sha1sum
printf 字符串中的\xXX
会将十六进制代码XX
转换为一个字节
二进制输出。
这将导致d14f958b2804cc930f2f5226494bd60ee5174cfa
的输出,
没关系。
【讨论】:
嗨,非常感谢 Scolytus!是的,我对价值观的理解完全错误;像往常一样,查看源代码是最好的补救措施 :) 作为记录(以及其他可能遇到此问题的人),0 填充发生在这里:lxr.free-electrons.com/source/security/integrity/ima/ima.h#L47以上是关于如何复制 PCR 值的扩展,例如沙1苏姆?的主要内容,如果未能解决你的问题,请参考以下文章