Как определить, работает ли процессор ARM в обычном заблокированном "мире" или в "мире" Secore?

Например, virt-what показывает, если вы работаете внутри аппаратной виртуализации "песочница".

Как определить, что вы работаете в изолированной программной среде ARM "TrustZone"?

3 ответа

TrustZone может отличаться от того, что вы думаете. Существует континуум мод. От "простого API доверенных функций" до "двойных ОС", работающих в каждом мире.

Если бы к данному вопросу было дано больше контекста, это было бы полезно. Это для программно определяющих или для обратного проектирования соображений? Для текущего пользовательского пространства Linux ответ - нет.

Резюме

  • Нет текущей утилиты пользовательского пространства.
  • Анализ на основе времени.
  • Анализ кода.
  • Исключение процессора и SCR,
  • ID_PRF1 биты [7:4].

virt-what не является надежным способом обнаружения, если вы работаете под гипервизором. Это программа, написанная для пользовательского пространства Linux. В основном это сценарии оболочки, которые проверяют /proc/cpuinfo и т. д. procfs - это псевдо-файловая система, которая запускает код в контексте ядра и сообщает в пользовательское пространство. Там нет такого обнаружения TrustZone в основной линии ARM Linux. По замыслу ARM затрудняет обнаружение. Цель проекта - сделать так, чтобы код в обычном мире работал без изменений.

Анализ кода

Чтобы говорить с безопасным миром, нормальному миру нужны SMC инструкции. Если ваше пользовательское пространство имеет доступ к коду ядра или образу vmlinux, вы можете попробовать проанализировать разделы кода для SMC инструкция. Тем не менее, этот код может присутствовать на изображении, но никогда не активен. По крайней мере, это говорит о том, имеет ли ядро Linux некоторую поддержку TrustZone. Вы можете написать модуль ядра, который будет перехватывать любое выполнение SMC инструкция, но есть, вероятно, лучшие решения.

Сроки анализа

Если ОС работает в безопасном мире, некоторый анализ времени покажет, что некоторые циклы ЦП были украдены, если масштабирование частоты не активно. Я думаю, что это не ответ в духе оригинального вопроса. Это основано на знании того, что безопасный мир - это полноценная ОС с таймером (или, по крайней мере, прерываемыми прерываниями).

Исключение процессора и SCR

SCR (Безопасный регистр конфигурации) недоступен в обычном мире. Из руководства ARM Cortex-A5 MPcore (pg4-46),

Ограничения использования SCR:
• доступно только в привилегированных режимах
• доступно только в безопасном состоянии.
Попытка получить доступ к SCR из любого состояния, кроме защищенной привилегированной, приводит к исключению неопределенной инструкции.

ID_PRF1 биты [7:4].

На некоторых сериях Cortex-A инструкция

mrc p15, 0, r0, c0, c1, 1

получит значение, где биты [7: 4] указывают, поддерживает ли CPU расширения безопасности, также известные как TrustZone. Ненулевое значение указывает, что это поддерживается. Многие ранние процессоры могут не поддерживать этот регистр CP15. Итак, это очень похоже на SCR и обработка неопределенной инструкции. Кроме того, он не говорит вам, что код активен в режиме TrustZone.

Резюме

Возможно, что вы могли бы написать модуль ядра, который попытался бы выполнить эту инструкцию и обработать неопределенное исключение. Это обнаружило бы нормальный и безопасный мир. Однако вам придется исключить процессоры, которые вообще не имеют TrustZone.

Если устройство не ARMv6 или лучше, то TrustZone невозможен. У большинства устройств Cortex-A есть CPU TrustZone, но он не активен.

Комбинированный SMC Тест и идентификатор процессора, все еще не достаточно. Некоторые загрузчики работают в безопасном мире и затем переходят в нормальный мир. Так что безопасный активен только во время загрузки.

Теоретически это можно узнать, особенно с большим знанием системы. Там может быть много признаков, таких как ложные прерывания от GIC и т. Д. Однако я не верю, что какой-либо инструмент Linux пространства пользователя существует по состоянию на январь 2014 года. Это типичная война эскалации между писателями вирусов / руткитов и программного обеспечения для обнаружения вредоносных программ, TZ Rootkits

Вы не указали какие-либо подробности процессора (A8, A9, A15?) Или режима выполнения (пользователь / ядро ​​/ монитор), из которого вы хотите определить состояние процессора.

В соответствии с документацией ARM, текущее состояние процессора как защищенного (так называемая песочница TrustZone) или незащищенного можно определить, прочитав Secure Configuration Register и проверка на NS немного.

Чтобы получить доступ к реестру безопасной конфигурации: MRC p15, 0, <Rd>, c1, c1, 0Установленный бит 0 соответствует процессору, находящемуся в незащищенном режиме и наоборот.

Вы можете проверить таблицу данных процессора и найти те регистры, которые ведут себя по-разному в обычном мире и в безопасном мире. Как правило, в безопасном мире, когда вы читаете эти регистры, вы просто получаете ноль. Но получите данные в нормальном мире. А также некоторые регистры, к которым вы можете просто получить доступ в Безопасном мире, если вы находитесь в Безопасном мире, вы можете получить к нему доступ, но в Нормальном мире ваш доступ будет отклонен.

В любом случае, есть много способов различить Нормальный Мир и Безопасный Мир. ПРОЧИТАЙТЕ ДАННЫЕ В ДЕТАЛЯХ.

Другие вопросы по тегам