Например, virt-what
показывает, работаете ли вы внутри «песочницы» аппаратной виртуализации.
Как определить, работаете ли вы в песочнице ARM «TrustZone»?
Например, virt-what
показывает, работаете ли вы внутри «песочницы» аппаратной виртуализации.
Как определить, работаете ли вы в песочнице ARM «TrustZone»?
TrustZone может отличаться от того, что вы думаете. Существует континуум режимов. От «простого API доверенных функций» до «двойных ОС», работающих в каждом мире.
Если бы в вопросе было больше контекста, это было бы полезно. Это для программного определения или для обратного проектирования? Для текущего пользовательского пространства Linux ответ нет.
SCR
.ID_PRF1
бит [7:4].virt-what
не является надежным способом узнать, работаете ли вы под -визор. Это программа, написанная для пользовательского пространства Linux. В основном это скрипты оболочки, которые проверяют /proc/cpuinfo
и т. д. procfs – это псевдофайловая система, которая запускает код в контексте ядра и отправляет отчеты в пространство пользователя. В основной ветке ARM linux такое обнаружение TrustZone отсутствует. По замыслу ARM его трудно обнаружить. Замысел разработчиков состоит в том, чтобы код в обычном мире работал без изменений.
Чтобы общаться с безопасным миром, нормальному миру нужны SMC
инструкций. Если у вашего пользовательского пространства есть доступ к коду ядра или образу vmlinux, вы можете попытаться проанализировать разделы кода на наличие файла SMC
. Однако этот код может присутствовать на изображении, но никогда не активен. По крайней мере, это говорит о том, поддерживает ли ядро Linux некоторую поддержку TrustZone. Вы можете написать модуль ядра, который будет перехватывать любое выполнение инструкции SMC
, но, вероятно, есть лучшие решения.
Если ОС работает в защищенном мире, некоторый временной анализ покажет, что некоторые циклы ЦП были украдены, если масштабирование частоты не активно. Я думаю, что это не ответ в духе исходного вопроса. Это зависит от знания того, что безопасный мир — это полнофункциональная ОС с таймером (или, по крайней мере, с упреждающими прерываниями).
SCR
(Регистр безопасной конфигурации) недоступен в обычном мире. Из руководства ARM Cortex-A5 MPcore (стр. 4-46),
Ограничения использования SCR:
• доступен только в привилегированных режимах
• доступен только в безопасном состоянии.
Попытка доступа к SCR из любого состояния, кроме безопасного привилегированный приводит к исключению инструкции Undefined.
ID_PRF1
бит [7:4].В некоторых сериях Cortex-A инструкция,
mrc p15, 0, r0, c0, c1, 1
получит значение, где биты [7:4] указывают, поддерживает ли ЦП расширения безопасности, также известные как TrustZone. Ненулевое значение указывает на то, что оно поддерживается. Многие ранние процессоры могут не поддерживать этот регистр CP15. Таким образом, это очень похоже на SCR
и обрабатывает неопределенную инструкцию. Кроме того, он не сообщает вам, что код активен в режиме TrustZone.
Возможно, вы могли бы написать модуль ядра, который попробует эту инструкцию и обработает неопределенное исключение. Это позволит определить обычный мир в сравнении с безопасным миром. Однако вам придется исключить процессоры, у которых вообще нет TrustZone.
Если устройство не ARMv6 или лучше, то TrustZone невозможен. Многие устройства Cortex-A имеют TrustZone в ЦП, но она не активна.
Комбинированного теста SMC
и идентификатора ЦП по-прежнему недостаточно. Некоторые загрузчики работают в защищенном мире, а затем переходят в обычный мир. Поэтому secure активен только во время загрузки.
Теоретически это возможно знать, особенно при большем знании системы. Может быть много признаков, таких как ложные прерывания от GIC и т. д. Однако я не верю, что по состоянию на январь 2014 года существует какой-либо инструмент Linux для пользовательского пространства. типичная война эскалации между авторами вирусов / руткитов и программным обеспечением для обнаружения вредоносных программ. >руткиты TZ
Вы не указали никаких сведений о процессоре (A8, A9, A15?) или режиме выполнения (пользователь/ядро/монитор), из которого вы хотите определить состояние процессора.
Согласно документации ARM, текущее состояние процессора как безопасное (он же песочница TrustZone) или небезопасное можно определить, прочитав Secure Configuration Register
и проверив бит NS
.
Чтобы получить доступ к регистру безопасной конфигурации: MRC p15, 0, <Rd>, c1, c1, 0
Установленный бит 0 соответствует нахождению процессора в незащищенном режиме и наоборот.
Вы можете проверить таблицу данных процессора и найти те регистры, которые ведут себя по-разному в нормальном мире и в безопасном мире. Как правило, в Secure World, когда вы читаете эти регистры, вы просто получаете нуль. Но получить данные в обычном мире. А также некоторые регистры, к которым вы можете просто получить доступ в Безопасном мире, если вы находитесь в Безопасном мире, вы можете получить к ним доступ, но в Обычном мире ваш доступ будет отклонен.
В любом случае, есть много способов отличить нормальный мир от безопасного мира. ПРОСТО ПРОЧТИТЕ ПОДРОБНО ТЕХНИЧЕСКОЕ ОПИСАНИЕ.