Как можно реплицировать расширение значения PCR, например. ша1сум?

это несколько связано с сообщением в: Выполните ИЛИ на двух хеш-выходах ша1сум

У меня есть примерный набор измерений 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 || данные), т. е. «объединить старое значение PCR с данными, хешировать объединенную строку и сохранить хэш в ПЦР». Кроме того, в нескольких документах и ​​презентациях, которые я нашел, упоминается, что данные — это хэш загружаемого программного обеспечения.

Однако, когда я выполняю такую ​​операцию, как echo H(PCR)||H(data) | sha1sum, я не получаю правильное результирующее значение. То есть при вычислении (используя приведенные выше хэши): echo 1ca03ef9cca98b0a04e5b01dabe1ff825ff0280a0ea26e75253dc2fda7e4210980537d035e2fb9f8 | sha1sum, результирующее значение НЕ 7f36b991f8ae94141753bcb2cf78936476d82f1d.

Правильно ли я понимаю операцию TPM_Extend? если да, то почему полученный хеш отличается от хэша в образце файла измерений?

Спасибо! / п


person nico    schedule 15.04.2012    source источник
comment
Вам нужна дополнительная информация, кроме моего ответа?   -  person Scolytus    schedule 02.05.2012
comment
Итак, учитывая, что значения в файле не являются содержимым PCR10, что на самом деле хранится в реестре? вычисляется ли хэш из значений измерений, хранящихся в файле?   -  person nico    schedule 10.05.2012
comment
Я не уверен на 100%, так как я нахожусь за границей и у меня нет подходящей системы, но это должна быть «цепочка» всех хэшей. Например, SHA-1(SHA-1(0...0 | 1ca03ef9cca98b0a04e5b01dabe1ff825ff0280a) | 7f36b991f8ae94141753bcb2cf78936476d82f1d) ..... Не стесняйтесь открывать новый вопрос об этом (поскольку это другой вопрос), и я попытаюсь исследовать что дальше...   -  person Scolytus    schedule 13.05.2012


Ответы (1)


Чтобы ответить на ваш самый первый вопрос: ваше понимание операции расширения более или менее правильно. Но у вас есть 2 проблемы:

  1. Вы неверно истолковываете то, что скопировали сюда
  2. Вы не можете вычислять хеши, как в оболочке

Вывод журнала, который вы здесь предоставили, взят из IMA Linux. Согласно документации, первый хеш равен 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

\xXX в строке printf преобразует шестнадцатеричный код XX в один байт двоичного вывода.

Это приведет к выводу d14f958b2804cc930f2f5226494bd60ee5174cfa, и это нормально.

person Scolytus    schedule 19.04.2012
comment
Привет, большое спасибо Сколит! Да, у меня было совершенно неправильное понимание ценностей; как обычно, просмотр исходников — лучшее средство :) Для справки (и для тех, кто может столкнуться с этой проблемой), заполнение 0 происходит здесь: lxr.free-electrons.com/source/security/integrity/ima/ima.h#L47 - person nico; 10.05.2012