Привет, на связи Денис Генералов, младший системный администратор Cloud4Y. Сегодня хочу поделиться статьёй, которая актуальна в связи с выходом Windows 11 и обязательным требованием вендора о наличии TPM для защиты данных владельцев устройств. Выражаю своё почтение автору статьи: Генри Нурми.
Вступление
Полное шифрование диска — один из краеугольных камней защиты конечных точек. Этот метод эффективен не только для защиты конфиденциальных данных от физической кражи. Он обеспечивает целостность данных, предотвращает атаки, нацеленные на подделку данных. Если было бы возможно скомпрометировать данный метод защиты без серьёзных усилий, это разрушило бы фундаментальную идею защиты конечных узлов.
Со временем были придуманы различные физические атаки на полностью шифрованные диски, такие как атаки холодной загрузки, а также атаки, основанные на сниффинге интерфейса TPM или DMA. Большинство компаний в своей модели угроз не учитывают этот тип атак. Да и какой смысл учитывать, если злоумышленник имеет к устройству неограниченный доступ?
Кроме того, у злоумышленников тоже есть бюджет, который они готовы потратить на проведение атаки. И если она потребует очень большого количества ресурсов, это будет попросту нерентабельно.
В данной статье мы исследуем атаку на основе сниффинга через SPI шину TPM с использованием финансово доступных инструментов. А также воспользуемся инструментом, который извлекает ключ BitLocker из перехваченного SPI трафика.
Предшествующие работы
Доверенный платформенный модуль (TPM) часто используют для защиты ключа шифрования диска. Сам чип TPM защищен от множества видов атак, однако вот незадача, чаще всего данные, передаваемые между CPU и TPM по шине, не шифруются, что делает максимально доступной и простой атаку, реализуемую через сниффинг данных, передаваемых по шине.
Атаки, реализуемые через захват данных, передаваемых к TPM, нельзя назвать новым типом атаки. К примеру, Д. Андзакович демонстрировал атаку, базировавшуюся на сниффинге шины LPC и последующем извлечении ключа BitLocker, а Дж. Бун — атаку, базировавшуюся на использовании промежуточного устройства внутри шины I2C. Однако про исследования на тему перехвата сообщений TPM от шины SPI слышно не было.
Обзор BitLocker
BitLocker — это функция полного шифрования диска Microsoft для Windows, которая была представлена в Windows Vista. Начиная с Windows 10 версии 1511, BitLocker использует алгоритм шифрования AES-XTS для шифрования всего тома. По умолчанию длина ключа составляет 128 бит, но также можно настроить использование 256-битного ключа.
Архитектура BitLocker включает несколько ключей. Ключ шифрования полного тома (FVEK) используется для шифрования тома, защищённого BitLocker. Этот ключ зашифрован главным ключом тома (VMK), а зашифрованный FVEK сохраняется в метаданных тома. Наконец, VMK зашифровывается различными механизмами защиты, а зашифрованный VMK сохраняется в метаданных (аналогично FVEK). По умолчанию для расшифровки VMK требуется воспользоваться только одним из ключей защитного механизма.

Архитектура позволяет легко изменять ключ криптографической системы, если какое-либо из защитных устройств будет скомпрометировано, поскольку для этого необходимо лишь создать новый VMK и повторно зашифровать FVEK с новым VMK. Данный механизм решает проблему повторного шифрования всего тома.
Обзор модуля доверенной платформы
Trusted Platform Module — это криптографический сопроцессор, который реализует определенный набор криптографических операций, безопасное хранилище для ключей и набор регистров конфигурации платформы (PCR). TPM — одно из наиболее используемых средств криптографической защиты BitLocker.
Одним из ключевых преимуществ TPM является возможность раскрыть часть ключа после проверки целостности платформы. Эта проверка достигается путём измерения каждого шага в процессе загрузки и сохранения результатов в PCR. Ключ может быть привязан к определённым значениям PCR, и он может быть выпущен только в том случае, если текущее состояние PCR совпадает с этими исходными значениями. BitLocker использует TPM для запечатывания VMK, и ключ может быть отдан только в том случае, если процесс загрузки не был изменён.
Обычно микросхема TPM представляет собой дискретный модуль на материнской плате, а ЦП обменивается данными с микросхемой TPM через концентратор контроллера платформы (PCH) или южный мост. Спецификация TPM описывает три различных интерфейса связи: LPC, SPI и I2C. Кроме того, для TPM разрешены два разных типа упаковок IC: TSSOP-28 (слева) и QFN-32. Упаковка QFN-32 усложняет атаку сниффинга, так как сложнее подключиться к его контактам.

Сниффим шину SPI
Последовательный периферийный интерфейс (SPI) — это протокол синхронной последовательной связи, поддерживающий полнодуплексную связь с высокой тактовой частотой. Он использует архитектуру «ведущий-ведомый», при которой ведущее устройство всегда инициирует обмен данными. Шина SPI состоит из четырёх проводников:
SCLK: Serial Clock
MOSI: Master out Slave in (данные от мастера)
MISO: Master in Slave out (данные от ведомого)
SS: Slave select (выбирает активное ведомое устройство)
К одной шине SPI можно подключить несколько подчиненных устройств. Однако в этой ситуации каждому ведомому устройству требуется собственная линия SS, как показано ниже.

Чтобы «прослушать» шину, требуется логический анализатор, который может захватывать четыре сигнала одновременно. Минимальная частота дискретизации зависит от скорости, используемой в шине. Стандарт TPM определяет, что микросхема TPM с интерфейсом SPI должна поддерживать диапазон тактовой частоты 10–24 МГц. Однако в стандарте также указано, что могут поддерживаться более высокие тактовые частоты. Имейте в виду, что мы должны использовать не менее чем в четыре раза более высокую частоту дискретизации, нежели используемая тактовая частота на шине.
Как описано выше, микросхема TPM имеет форм-фактор TSSOP-28 или QFN-32, имеет маленький корпус. Микросхему в корпусе TSSOP можно послушать, взяв сигнал с её ножек. Однако корпус QFN требует пайки к IC, поскольку данный корпус паяется на шарики. Кроме того, материнские платы обычно содержат контрольные точки или порты отладки, подключенные к шине данных TPM, которые также можно использовать для того, чтобы послушать сигнал.
Было бы неплохо, если бы сниффинг-атака могла быть выполнена быстро и без специальных инструментов.
Ноутбук обычно необходимо разобрать, чтобы получить доступ к микросхеме TPM, что не очень практично. Однако прошивка UEFI часто хранится во флэш-чипе на основе SPI, который обычно выполнен в корпусе SOIC-8. К нему очень легко подцепляются обычные зонды. Поскольку к одной шине SPI можно подключить несколько устройств, микросхема флэш-памяти и микросхема TPM, вероятно, используют одну и ту же шину. Кроме того, к микросхеме флэш-памяти обычно можно получить доступ, сняв заднюю крышку или клавиатуру, и поэтому данная микросхема является идеальной целью для прослушивания трафика на шине SPI. Эта тактика исключает необходимость пайки, и атака может быть выполнена вполне себе быстро.
Возьмём ноутбук Dell Latitude E5470, которому несколько лет, на котором установлена Windows 10 с поддержкой BitLocker, а TPM защищает VMK без дополнительного PIN-кода. В этой конкретной модели доступ к TPM и flash можно получить, сняв заднюю крышку, как показано ниже.

Микросхема Nuvoton NPCT650JAOYX TPM 2.0 поставляется с пакетом QFN-32, и, как мы видим, проверить микросхему напрямую невозможно. Мы можем проверить с помощью мультиметра, что контакты синхронизации на обеих микросхемах соединены вместе, подтвердив то, что они используют одну и ту же шину SPI. Как мы видим, корпус SOIC-8 выглядит огромным по сравнению с QFN-32. Микросхема флэш-памяти имеет следующую распиновку, которая определяет размещение датчиков.
* ----------- +
- | СС | -
- | MISO | -
- | SCLK | -
- | GND MOSI | -
+ ----------- +
Как вы помните, каждое SPI-устройство имеет свою выделенную SS-линию, однако в нашем случае ноутбук имеет только два устройства, подключенных к данной шине. Из этого следует, что, SS-линия TPM может быть построена путём взятия отрицания из SS-линии микросхемы флэш-памяти. SS-линию можем просто проигнорировать. Однако в этой ситуации существует возможность декодирования обмена данных между flash-памятью и TPM.
Снимем сигналы SPI с помощью логического анализатора Saleae Logic Pro 8, который способен записывать четыре сигнала с частотой до 100 МГц. Широкий шаг клемм корпуса SOIC-8 позволяет без труда закрепить щупы, а весь процесс захвата займёт не более одной минуты.

Приложение Logic 2 поддерживает декодирование SPI «из коробки». Единственное, что нужно помнить: линия SS инвертирована. К счастью, параметры декодирования Saleae позволяют нам выбирать, будет линия SS инвертирована, либо нет. На снимке экрана ниже показаны декодированные байтовые потоки MOSI и MISO во время тестового сниффинга.

Ищем иголку в стоге сена
Чтобы продолжать копаться, мы должны понимать, что ищем. На данный момент у нас есть два декодированных байтовых потока, которые представляют только необработанные данные на шине. Байты в потоке MOSI — это трафик от ЦП к TPM, в трафик MISO — наоборот.
В разделе 7.4 «Спецификация профиля TPM клиентской платформы ПК» описывается протокол SPI для микросхемы TPM 2.0. Ключевыми элементами являются транзакции чтения и записи, которые выглядят почти одинаково. Транзакция начинается, когда хост отправляет командный байт, за которым следует трехбайтовый адрес. После этого 1–64 байта данных транзакции отправляются либо ЦП, либо TPM, в зависимости от типа транзакции. Однако TPM может приостановить передачу через операцию состояния ожидания между байтами адреса и данных. Микросхема TPM вставляет состояние ожидания, переводя линию MISO в низкий уровень на последнем бите адреса, и линия переводится в ожидание, пока микросхема TPM не будет готова к приёму или передаче данных. Транзакция чтения показана ниже.

Командный байт кодирует тип транзакции и размер передаваемых данных. Когда старший бит в командном байте равен 1, считывается тип транзакции. В противном случае тип записи. Шесть младших значащих битов декодируют размер передачи от 1 до 64 байтов. Ниже показана вся структура протокола.

Учитывая эту информацию, мы можем подтвердить фиксацию транзакций на TPM. Ниже показана однобайтовая транзакция чтения по адресу 0xD40018, где TPM в результате отправил обратно 0x90.

Logic 2 не может анализировать транзакции SPI TPM по умолчанию. Однако он поддерживает настраиваемые высокоуровневые анализаторы, которые могут дополнительно анализировать декодированный трафик SPI. Я написал анализатор, который декодирует транзакции TPM из потока SPI и показывает их в Logic 2.
Учитывая, что TPM работает в разных регистрах, нас интересуют только регистры TPM_DATA_FIFO_x
. Эти регистры FIFO действуют как буферы между хостом и TPM при обмене данными для хранения команд или ответов. Исходя из этого сброса содержимого регистров FIFO достаточно, чтобы перехватить незапечатанный ключ. Кроме того, BitLocker использует только Locality 0, который ограничивает отслеживаемые регистры TPM_DATA_FIFO_0
, и этот конкретный регистр декодируется по адресу 0xD40024
. Анализируемая транзакция чтения из этого регистра показана ниже.

Остаётся проблема идентификации VMK внутри байтового потока. К счастью, описание BitLocker общедоступно. Запись метаданных VMK имеет формат, аналогичный записи метаданных FVE. Запись VMK состоит из следующих полей:

Эта информация позволяет нам создать шаблон для поиска, соответствующий возможным VMK в потоке байтов. Мы знаем приведённые ниже подробности из документации, о которой говорили ранее:
размер записи: 0x002c - 0x0c (метаданные) + 0x20 (ключ)
тип записи: 0x0000 - Нет, запись является свойством
тип значения: 0x0001 - Ключ
Мы не можем быть до конца уверены в версии и методе шифрования. Следовательно, мы можем использовать указанный выше шаблон для поиска начала записи VMK. Обратите внимание, что в полях заголовка используется прямой порядок байтов.
2c00000001000 [0–1] 000 [0–5] 200000
На скриншоте мы определённо видим указанную выше структуру в потоке TPM_DATA_FIFO_0
. Следующие 32 байта, начинающиеся с 0x17
, представляют собой фактическую VMK.

После извлечения VMK диск можно расшифровать и смонтировать. Последняя версия (0.7.3) Dislocker поддерживает дешифрование тома с помощью VMK. Следовательно, нам не нужно вручную разбирать и расшифровывать ключ FVEK. На скриншоте показана процедура монтирования диска.

Автоматизированный подход
Несмотря на то, что Proof of Concepts великолепны, правильно подобранные инструменты выводят атаку на совершенно новый уровень. А ещё, как мы говорили в начале статьи, дают реальное преимущество, если это можно сделать приложив минимум усилий. По этой причине процесс атаки был максимально автоматизирован. Набор инструментов состоит из следующих частей:
Пользовательский высокочастотный анализатор для поиска записей VMK из транзакций TPM.
Контейнер Docker, который включает в себя все необходимые инструменты для монтирования диска с подстановкой VMK.
Рабочий процесс с инструментарием выглядит следующим образом:
Поснифьте шину SPI и извлеките VMK.
Извлеките диск и подключите его к машине используемой для взлома или загрузите целевое устройство прямо с USB-накопителя, если это возможно.
Расшифруйте и смонтируйте диск.
Ниже показано, как анализатор может извлекать VMK из полученных данных. Затем ключ может передаётся в инструмент монтирования, который расшифровывает содержимое и перенаправляет вас в shell, где вы можете изменить содержимое тома.

Вы можете найти этот инструмент на GitHub.
Надежда всё же есть
Вместо того, чтоб использовать только TPM, для усложнения проведения атаки следует использовать дополнительные опции, такие как:
TPM с PIN-кодом
TPM с ключом запуска
TPM с ключом запуска и PIN-кодом
В режиме TPM с PIN-кодом TPM требует дополнительного PIN-кода, прежде чем VMK будет распечатан. Следует отметить, что ключ можно перехватить даже при использовании PIN-кода. Однако злоумышленник должен иметь возможность прослушивать шину в тот же момент, когда вводится PIN-код.
Если непривилегированные пользователи получат доступ к любым используемым ключам или средствам защиты BitLocker, они смогут выполнить локальное повышение привилегий (LPE), изменив содержимое тома. Эта атака позволяет инсайдерам легко использовать LPE. Стоит отметить, что тот же LPE применяется, если пользователи знали свои ключи восстановления.
Ключ запуска добавляет дополнительный уровень, на котором VMK может быть расшифрован, только если представлены и TPM, и ключ запуска. Ключ запуска может храниться на съёмном устройстве, например, на USB-накопителе.
TPM 2.0 поддерживает так называемое шифрование параметров, при котором зашифровывается первый параметр в команде или ответе TPM. Однако BitLocker на данный момент не поддерживает эту функцию, и Дж. Бун в своём исследовании показал, что у неё есть свои недостатки.
Выводы
Мы продемонстрировали, что ключ BitLocker может быть легко извлечён из трафика SPI без дорогостоящих инструментов. Атака требует физического доступа к целевой машине только в течение нескольких минут, если использовать автоматизированные инструменты.
Что ещё интересного есть в блоге Cloud4Y
→ Изучаем своё железо: сброс паролей BIOS на ноутбуках
→ Как я случайно заблокировал 10 000 телефонов в Южной Америке
→ Клавиатуры, которые постигла неудача
→ Самый большой космический телескоп Уэбб должен изменить наши представления о космосе
Подписывайтесь на наш Telegram-канал, чтобы не пропустить очередную статью. Пишем не чаще двух раз в неделю и только по делу.
Комментарии (23)
event1
09.11.2021 18:30+1TPM поддерживает шифрование с использованием сессий. Странно, что bitlocker не использует эту возможность.
Можно ещё декодировать протокол более высокого уровня ("TPM Library" в четырёх частях) и забирать ответ на нужную команду, вместо поиска по всему массиву данных.
Hint
09.11.2021 19:44Подскажите, влияет ли как-нибудь на защиту включенная гибернация с учетом того, что включен PIN при загрузке. Где-то читал, что гибернация позволяет проводить какие-то другие типы атак на BitLocker.
v1000
09.11.2021 22:28+2Особенно забавно, как в свое время Майкрософт аргументировала невозможность апгрейда оперативной памяти в их планшетных компьютерах, тем что тогда память можно вытащить и охладить жидким азотом, чтобы достать данные из памяти, в том числе и ключи от битлокера.
А для этого, оказывается, даже и азот не нужен.
johnfound
09.11.2021 23:12Использовать BitLocker, это все равно в гостинице ожидать, что ключ от вашей комнате есть только у вас.
gameplayer55055
09.11.2021 23:22-2И зачем тогда тпм виндовсу 11?
Я думаю, что только для того чтобы выкинуть все старые компы на помойку, и чтобы работали только новые с ней.
Далеко не все пользуются битлокером и сканерами отпечатков, а если его ещё и легко взломать то это просто пустая трата кремния, ещё и в такие трудные времена. Можно и без тпм все хорошо зашифровать.
dartraiden
10.11.2021 21:10если его ещё и легко взломать
«Легко» зависит от квалификации атакующего и от длительности его физического доступа. Меры безопасности, которые применяет, скажем, условный владелец крупнейшей даркнет-биржи, будут излишними для Васи Пупкина, за которым охотятся не ведущие спецслужбы мира, а товарищ майор, обнаруживший голую задницу Васи на фоне храма в васином инстаграме.
Нашем гипотетическому Васе не нужно бежать быстрее медведя, ему нужно бежать лишь быстрее самых медленных.Можно и без тпм все хорошо зашифровать.
Окей, расскажите, пожалуйста, как зашифровать накопитель при условии, что компьютером с Windows пользуются несколько человек, каждый со своей учёткой, и нежелательно, чтобы все они знали пароль от зашифрованного накопителя? Поскольку утекший от одного пользователя пароль сразу даёт атакующему возможность загрузиться с внешнего накопителя, расшифровать диск и получить доступ к данным всех пользователей. А пользователи бывают всякие, одного чуть возьми на понт — он всё и выложит, подставив всех остальных.
С TPM (причём, не важно, будет ли использоваться BitLocker или какое-то иное средство, умеющие работать с TPM, например VeraCrypt) задача решается очень просто и красиво: ключ шифрования хранится в TPM, накопитель прозрачно расшифровывается им при запуске, а Windows отвечает за авторизацию пользователей в системе. Таким образом, пользователь «сдаст» лишь себя самого, а вот вытащить ключ из TPM будет посложнее, чем расколоть ламера.
Кроме того, если компьютером пользуется лишь один человек, никто не мешает использовать связку TPM+пароль для расшифровки накопителя. Опишу свой сетап: для расшифровки накопителя требуется связка TPM+пользовательский пароль, при этом, задействованы регистры TPM:
— исполняемый код базового системного ПО (непосредственно код прошивки)
— данные базового системного ПО (настройки прошивки)
— расширенный или подключённый исполняемый код (прошивка подключённых устройств)
— диспетчер загрузки
если хоть что-то из перечисленного меняется (кто-то подменил прошивку, изменил её настройки, пытается загрузиться, подключив некое новое устройство, пытается загрузиться с внешнего накопителя, а не с системного), то я имею возможность сразу об этом узнать, так как не смогу расшифровать накопитель своим паролем. Это сигнал «тут что-то не так, как обычно».
Добиться такого лишь с обычным паролем… ну, удачи, вы даже не сможете быть уверены, что зловред, получивший права суперпользователя, не перезаписал вам прошивку.Nnnnoooo
07.12.2021 03:48Такой вопрос, а в таком случае насколько велик шанс полностью потерять доступ к разделу просто из-за бага прошивки или софта системы? Сейчас уже встречаются "умные" дрова, которые сами лезут обновлять биос, или меняют настройки биоса.
dartraiden
07.12.2021 10:30В случае с BitLocker или LUKS (Linux) можно добавить для себя бэкдор в виде пароля, который расшифрует накопитель, даже без наличия TPM. Разумеется, такой пароль должен быть не 123456, в случае BitLocker, например, он 42-символьный.
Кроме того, никто не отменял резервное копирование. Накопитель может выйти_из_строя/быть_украден/что-то_ещё вообще без всякого шифрования.
На худой конец, если у вас такое умное устройство, что само обновляет биос, то просто не привязывайтесь к регистру, отвечающему за содержимое прошивки.Nnnnoooo
08.12.2021 04:05На худой конец, если у вас такое умное устройство, что само обновляет биос,
Ну это интел и у них похоже в последнее время дрова и софт индусы пишут (в плохом смысле) :(
emaxx
07.12.2021 04:39Окей, расскажите, пожалуйста, как зашифровать накопитель при условии, что компьютером с Windows пользуются несколько человек, каждый со своей учёткой, и нежелательно, чтобы все они знали пароль от зашифрованного накопителя? Поскольку утекший от одного пользователя пароль сразу даёт атакующему возможность загрузиться с внешнего накопителя, расшифровать диск и получить доступ к данным всех пользователей.
Не совсем понятна проблема - почему не выделить каждому пользователю по отдельному разделу ФС, который шифруется паролем этого пользователя? Тут единственная проблема не в шифровании самом по себе, а в атаках брутфорсом - если пароль недостаточно длинный/случайный, то N часов/дней может быть достаточно для его взлома; TPM тут может помочь как "замедлитель" атаки брутфорсом. Однако принципиально в шифровании данных per-user никакой проблемы нет и в отсутствии TPM.
emaxx
10.11.2021 00:44Мда, теперь понятно, что salted sessions - это не просто наворот "для галочки" (как я по наивности предполагал - ну, вернее, защита от сферических коней в вакууме), а реальная защита от вполне реальных атак...
inemiten
10.11.2021 09:03Очередное подтверждение старого правила о том, что секреты не должны покидать секретного хранилища. Если бы все данные дешифровывались исключительно в TPM, то и уязвимости бы не было. Проблема только в скорости шифрования/дешифровки отдельным сопроцессором на медленной шине. Скорее всего, в будущем, сопроцессор TPM перенесется в CPU, как это когда-то было с математическим сопроцессором.
Zelgadiss
10.11.2021 15:20Эм, разве сейчас современные Intel/AMD не содержат в себе TPM? У меня отдельно нет на материнке TPM чипа, и дискретный модуль не вставлен. Тем не менее, в BIOS можно включить AMD TPM модуль.
dartraiden
10.11.2021 21:06+1Да, в чипсетах уже довольно давно (года с 2015-2016) есть софтовая реализация TPM на базе ядра безопасности (AMD PSP / Intel ME).
czz
10.11.2021 21:54TPM — он в любом случае медленный, даже если находится на чипе. Сам стандарт не рассчитан на скоростную потоковую передачу данных.
А в целом шифровальный сопроцессор со встроенным secure enclave — это реальность. На компах Apple он был в виде сопроцессора T2, а теперь встроен в процессор М1.
emaxx
11.11.2021 00:17Не обязательно - достаточно использовать шифрование при передаче данных. Все протоколы и средства для этого есть, Microsoft лишь не применила их...
icelord2
10.11.2021 16:09,> Однако корпус QFN требует пайки к IC, поскольку данный корпус паяется на шарики
с BGA не путаете? QFN это контактные площадки по периметру, и они открыты к подключению
icelord2
10.11.2021 16:12и qfn hook connector'ы стоят не таких космических денег, даже паять ничего не надо.
JohnnySmart
Действительно, к QFN надо подпаиваться, но этот корпус не на шариках, на шариках BGA, а вот туда подцепить я намноооого сложнее
kunix
Практика показывает, что когда один говорит "намного сложнее", кто-то другой, должным образом мотивированный, просто берет и делает.
vorphalack
с бга может быть сложнее не оставить следов
dartraiden
Вот только не факт, что затраты на мотивацию (профессионалы хотят солидные суммы, чтобы у них возникла мотивация делать для вас такую работу) окупятся профитом от получения неавторизованного доступа.