Все шифрование является сквозным, если вы не придирчивы к концам.
config TCG_TPM2_HMAC
bool "Use HMAC and encrypted transactions on the TPM bus"
default n
select CRYPTO_ECDH
select CRYPTO_LIB_AESCFB
select CRYPTO_LIB_SHA256
select CRYPTO_LIB_UTILS
help
Setting this causes us to deploy a scheme which uses request
and response HMACs in addition to encryption for
communicating with the TPM to prevent or detect bus snooping
and interposer attacks (see tpm-security.rst). Saying Y
here adds some encryption overhead to all kernel to TPM
transactions.
В прошлом году я наткнулся на функцию ядра Linux под названием TCG_TPM2_HMAC. Он утверждает, что обнаруживает или предотвращает активные и пассивные злоумышленники. Это одна из фраз активации моего спящего агентапоэтому я покопался.
TCG_TPM2_HMAC живет преимущественно в
драйверы/char/tpm/sessions.c
и более подробно обсуждается в
Документация/security/tpm/tpm-security.rst.
Все это звучит очень здорово. Мы должны заботиться о противниках-посредниках. Замечательно использовать функции TPM, которые были изобретены, чтобы помочь нам решить эти проблемы. Давайте нарисуем небольшую картину того, что здесь предпринимается.
В этой модели угроз есть злоумышленник, который может получить доступ к ненадежной шине, по которой во время загрузки отправляется весь трафик TPM. Это можно сделать с помощью
аппаратный взлом или путем взлома другого устройства, управляющего шиной TPM (например, BMC).
TCG_TPM2_HMAC Это функция ядра, и ядро загружается после прошивки платформы и загрузчика, поэтому оно не может ничего сделать с злоумышленниками, подделывающими прошивку и измерения загрузчика. Предположим на данный момент, что прошивке и загрузчику просто неявно доверяют, что они загрузили «правильный» код и успешно выполнили честные измерения всех этапов загрузки, включая ядро. Здесь мы также неявно верим, что TPM будет вести себя правильно. Или, если у вас более новый TPM, не делайте этого!
Кто-то знакомый с
модель СТРАЙД можно легко наблюдать следующие угрозы только по большому красному проводу на картинке выше:
| Атака | Пример |
|---|---|
| Подмена | Злоумышленник выдает себя за TPM или ЦП на другом устройстве. |
| Вмешательство | Злоумышленник удаляет или изменяет измерения, отправленные в TPM. |
| Отказ | Очевидно, что в данном случае это не применимо. |
| Раскрытие информации | Злоумышленник получает раскрытые секреты (например, ключи шифрования диска) |
| Отказ в обслуживании | Злоумышленник сбрасывает измерения, отправленные в TPM |
| Повышение привилегий | Очевидно, что в данном случае это не применимо. |
Злоумышленник может получить или не получить что-либо от манипулирования самим трафиком TPM (если только они не являются своего рода вырождаться которому просто нравится общаться с TPM ради развлечения). Но люди, знакомые с измеряемой загрузкой и аттестацией на основе TPM, должны сразу увидеть ценность для злоумышленника «изменения измерений» или «получения раскрытых секретов».
Давайте на секунду разграничим два типа злоумышленников:
- Пассивные интерпозеры иначе говоря, шпионы могут только читать из шины, но не изменять данные.
- Активные промежуточные устройства может читать и писать в автобус.
Самая лучшая вещь пассивный интерпозер может сделать вот это Информация
Раскрытие информации: прочитать данные из шины. Поскольку измерения обычно не должны быть секретными, (законные) измерения, отправляемые в TPM, не очень интересны. Незапечатанные секреты (которые были запечатаны в соответствии с измерениями в TPM) вполне могут быть! Вот почему
безопасность/ключи/доверенные ключи/trusted_tpm2.c
использует encrypt сессия
используя помощника
tpm_buf_append_hmac_session
что, к сожалению, немного запутано с TCG_TPM2_HMAC функция (но так происходит при разработке программного обеспечения). Все, что действительно нужно сделать здесь в этом случае, это использовать encrypt сеансовый ключ, установленный с использованием EK, как широко обсуждалось многими другими, но также сам.
В оставшейся части этого сообщения в блоге обсуждается активный вставной ящик.
В этом сценарии активный интерпозер обычно хочет сделать одно из двух:
- (Вмешательство, Отказ в обслуживании) Вмешиваться в измерения TPM, выполненные ядром, для ложного подтверждения или отделения «назначенного» кода или состояния от «ненамеренного» кода или состояния.
- (Подмена, Раскрытие информации) Вставьте соединение TPM и отключите решение шифрования сеанса для раскрытия секретов.
TCG_TPM2_HMAC функция будет
установить сеанс аутентификации
соленый (инкапсулированный ключом) в EK каждый раз, когда ядро
продлевает ПЦР
или
получает случайность. Вы можете сказать себе: «Я, это большие накладные расходы (асимметричное шифрование в TPM) для обычных, быстрых операций (расширения PCR, генерация случайных чисел)» и
ты был бы прав. Ого, эта функция дорогая! Хорошо, что это решает реальную проблему, правда?

Каждый раз, когда необходим сеанс (например, каждый раз, когда ядру необходимо продлить PCR), TCG_TPM2_HMAC Функциональный ключ инкапсулирует новый сеансовый ключ с так называемым «нулевым первичным ключом», который представляет собой ключ ECDH P256, полученный из нулевой иерархии (что означает, что он меняется при каждой загрузке). Он использует этот сеансовый ключ для защиты команды TPM путем шифрования входных и выходных данных и добавления HMAC для обнаружения несанкционированного доступа. Большой.
Одна проблема: откуда ядро узнает, каким должен быть нулевой первичный ключ? Читать
эта тема
чтобы не узнать.
Ядро принимает нулевой первичный ключ по номиналу и сохраняет его имя (хэш) в /sys/class/tpm/tpm0/null_name и надеется, что пользовательское пространство будет
подтвердите ключ позже, используя EK.
Это меняет цепочку доверия для измеряемой загрузки: ядро отвечает за измерение пользовательского пространства, поэтому «плохое», «злонамеренное» или «непреднамеренное» пользовательское пространство не может выдавать себя за «хорошее», «хорошее» или «предназначенное» пользовательское пространство.
Это означает, что все, что должен сделать злоумышленник, осуществляющий активное вмешательство, чтобы победить
TCG_TPM2_HMAC является:
- Замените или захватите компонент пользовательского пространства, отвечающий за проверку нулевого первичного ключа. Назовите это «Компонент X».
- Включите установление сеанса HMAC, создав поддельный нулевой первичный ключ (например, в программном обеспечении) и притворившись TPM, отвечающим на запросы.
- Перехват
TPM2_PCR_Extendкоманды, заменяя измерения по желанию (например, замените «хеш вредоносного Компонента X» на «хеш хорошего Компонента X»). - Вредоносный компонент X игнорирует «неправильное» имя нулевого первичного ключа в
/sys/class/tpm/tpm0/null_name.
Вы можете решить эту проблему путем фальсификации модели угроз: просто объявите, что активный злоумышленник не может вмешиваться в пользовательское пространство, которое в большинстве случаев хранится на физическом носителе на расстоянии менее 12 дюймов от TPM. Обратите внимание, что полное шифрование диска с использованием TPM не может спасти вас здесь, потому что, если загрузочная система может получить ключ, то же самое может сделать и физический противник. Если на данный момент вы все еще думаете, что у вас есть защищенное от несанкционированного доступа пользовательское пространство, спросите себя, зачем вам еще нужно ядро для его измерения.
Добавление удаленной аттестации здесь также не поможет, потому что, хотя удаленная система может точечно подтвердить «нулевой первичный ключ», она не имеет возможности узнать, какой ключ использовалось ядром при выполнении измерений.
TPM2_TCG_HMAC снова был отключен по умолчанию
в августе 2025 года
начиная с версии 6.18.
Какие уроки мы можем извлечь из всего этого?
-
Прикладная криптография не может решить проблему безопасности. Он может конвертировать только
проблема безопасности превратилась в проблему управления ключами.Следствие: если вы на самом деле не решаете проблему управления ключами, ваша криптография носит чисто декоративный характер. Это не только бесполезно, но и активно вредно, поскольку дает пользователям ложное чувство безопасности, заставляя их игнорировать другие меры предосторожности, которые они в противном случае приняли бы.
-
Цепочки доверия направлены. Не переворачивайте их.
Следствие:

Знаешь, что такое цепочка доверия? Это цепочка, которую я возьму и буду бить тебя, пока ты не поймешь, кто кому здесь доверяет.
-
Необъяснимые функции безопасности — всего лишь маркетинговые материалы.
Следствие: Хотя протоколы аттестации могут быть довольно запутанными, они всегда должны сводиться к одному или более из «X проверяет Y против Z», и всегда должна быть возможность объяснить, почему каждому из X, Y и Z доверяют. Объяснения могут привести к появлению большего количества кортежей X, Y, Z, и это нормально, но не сдавайтесь, если на ваши вопросы нет ответа.
Следствие 2. Когда кто-то приходит с подробными вопросами о чем-то, за что вы несете ответственность, не принимайте это на свой счет. Вместо этого укрепите доверие, приняв участие в добросовестном обсуждении. Либо вы будете правы и ваши ответы будут оценены по достоинству, либо вы узнаете о пробеле в вашей системе, который можно исправить.
Активные физические нарушители являются вполне реальной частью законных моделей угроз. Для решения этих проблем вам нужен встроенный корень доверия в вашем процессоре. Проверить Калиптракоторый обеспечивает
ТКИ КОСТИ
API внутри самого SoC как интегрированного корня доверия. Его можно использовать отдельно или в сочетании с дискретным TPM.
Мнения, высказанные здесь, являются моими собственными и не отражают официальную позицию какого-либо моего работодателя(ов), прошлого или настоящего.
2026-01-05 08:29:00
1767607138
#Декоративная #криптография #Личный #блог #Криса #Феннера
Продолжение темы
