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

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

Как определить, работаете ли вы в песочнице ARM «TrustZone»?


person Vi.    schedule 19.01.2014    source источник
comment
Вы хотите пометить это тегом linux или linux-kernel? Теперь это похоже на вопрос о системном коде процессора ARM. Вы можете получить разную информацию в зависимости (или, по крайней мере, больше понимания)?   -  person artless noise    schedule 21.01.2014
comment
TrustZone меньше похож на виртуализацию и больше на SMM, если поможет аналогия с x86. Если вы вообще используете Linux (кроме некоторых плат разработчиков, и загрузчик не переключает состояния для вас), вы выполняете в незащищенном состоянии.   -  person unixsmurf    schedule 21.01.2014


Ответы (3)


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

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

person artless noise    schedule 20.01.2014
comment
Многие устройства Cortex-A имеют TrustZone в процессоре, но он не активен. -› Он надежно не активен, или может быть какое-то шпионское ПО, установленное поставщиком, работает в неактивной TrustZone, сканируя сигнатуры и допуская внезапное выполнение кода? Позволяют ли дешевые платы SoC, такие как Raspberry Pi или Cubieboard, обычно устанавливать мой собственный загрузчик, используя безопасный режим (для защиты моих собственных данных с помощью моих программ), или есть какой-то скрытый коварный предварительный загрузчик просто для уменьшить функциональность моего устройства (если не хуже)? - person Vi.; 21.01.2014
comment
Если у процессора ARM есть TrustZone, это означает, что там есть какое-то оборудование; вам все еще нужно дополнительное оборудование, чтобы сделать его полезным. Даже когда все оборудование присутствует, вам все равно нужен «драйвер» (имеется в виду программное обеспечение для включения этого режима). См. технический документ о зоне доверия (может быть, требуется регистрация?). Я полагаю, что некоторые поставщики переводят загрузчик SOC ROM в нормальный мир, чтобы эти чипы не могли обмануть защищенных клиентов. Безопасная загрузка необходима для полноценной работы TrustZone. - person artless noise; 21.01.2014

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

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

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

person vPraetor    schedule 19.01.2014
comment
Должен ли он быть доступен только из ядра ОС или из любого процесса? - person Vi.; 19.01.2014
comment
Насколько я знаю, ни один из регистров сопроцессора недоступен из пользовательского пространства. Вы должны попробовать это из ядра. - person vPraetor; 20.01.2014
comment
Регистр безопасной конфигурации также недоступен из ядра в нормальном режиме и вызовет исключение неопределенной инструкции. Тем не менее, это также единственный портативный метод обнаружения. - person unixsmurf; 21.01.2014
comment
@artlessnoise: я прочитал вопрос совсем по-другому - он касается проверки того, где вы в данный момент выполняете свой код. Ошибка говорит вам, что вы не находитесь в безопасном режиме. В любом случае, нет никакого способа определить из незащищенного режима выполнения, что что-то упреждает вас и выполняется в безопасном мире, кроме исчезновения времени. - person unixsmurf; 25.01.2014

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

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

person Cobain    schedule 23.02.2016