15 марта 2016 г.

Trusty TEE (Безопасная среда выполнения Trusty)

    Вся статья является переводом вот этой: https://source.android.com/security/trusty/index.html. Как обычно, я предлагаю читать оригинал, так как в своём переводе я могу допустить ошибки. Этот записью планирую начать небольшой набор статей о том, как обеспечивается безопасность в Android, когда все разработки ещё не сломаны конечными производителями аппаратов. И первая статья — о TEE. Потому что даже про FDE нельзя рассказать, пока не усвоится вот это базовое знание.
    По возможности я вставлял поясняющие комментарии и ссылки на Википедию. Также старался избегать перевода терминов, если этот перевод уже не общепринят в русском языке. Потому по всему тексту будет TEE, а не БСВ.

Trusty TEE

    Trusty — это набор программных компонентов, поддерживающих на мобильном устройстве безопасную среду выполнения или, в оригинальной терминологии, — Trusted Execution Environment (TEE).

    Trusty состоит из:
  • Операционной системы (Trusty ОС), работающей на процессоре, поддерживающем TEE
  • Драйверов для ядра Android (Linux), обеспечивающих взаимодействие с приложениями, работающими под Trusty OS
  • Набора библиотек для системного ПО Android, обеспечивающих взаимодействие с доверенными приложениями, выполняемыми внутри Trusty OS, использующего драйверы ядра
Важно: В Trusty и Trusty API вносятся изменения.
Чтобы больше узнать о Trusty API, смотрите описание API. Примечание. Перевод описания возможно и будет, если в нём будут важные куски для понимания всего происходящего.

Использование и примеры

    Для реализации TEE может быть использована любая TEE ОС, а не только Trusty.
 
    Обычно TEE процессор — это отдельный микропроцессор в системе или виртуальный экземпляр основного процессора. TEE процессор изолирован от остальной системы механизмами защиты памяти и операций ввода-вывода, реализованными на аппаратном уровне.
    TEE процессоры стали основой сегодняшних мобильных устройств. Основной процессор устройства считается «не доверенным» и не может получать доступ к определённым областям ОЗУ, аппаратным регистрам и безопасным зонам, в которых хранятся секретные данные (например — криптоключи этого устройства), помещённые туда производителем. Для любых операций, требующих эти секретные данные, ПО обращается к TEE процессору.
    Самый популярный пример всего этого в экосистеме Android — это DRM framework, используемый для защиты контента. ПО, работающее в TEE процессоре, может получать доступ к специфичным для этого устройства ключам, которые нужны для расшифровки защищённого контента. При хорошо организованной защите от программных атак, основной процессор видит только зашифрованный контент.
    Другие примеры использования TEE — это мобильные платёжные системы, защищённый банкинг, полнодисковое шифрование, многофакторная аутентификация, защита от сброса устройства, защита карт памяти, беспроводная трансляция («каст») защищённого контента, безопасная обработка PIN кодов и отпечатков пальцев и даже обнаружение вредоносного ПО.

    Trusty предоставляет API для разработчиков двух классов приложений:
  • Доверенные приложения или сервисы, работающие на TEE процессоре
  • Обычные/не доверенные приложения, которые работают на основном процессоре и используют сервисы, предоставляемые доверенными приложениями
    ПО, работающее на основном процессоре, может использовать Trusty API для подключения к доверенным приложениям и обмениваться с ними различными сообщениями, подобно тому, как работают сетевые сервисы через IP. Используя определённый протокол, приложения определяют формат данных и семантики этих сообщений. Надёжность доставки этих сообщений гарантируется инфраструктурой, лежащей в основе Trusty (в виде драйверов, работающих на основном процессоре). Все сообщения асинхронны.

Доверенные приложения и сервисы

    Доверенные приложения работают как изолированные процессы под ядром ОС Trusty. Каждый процесс работает в песочнице с собственной виртуальной памятью, которая управляется средствами MMU (примечание: см. Википедию (ru)) — фичей TEE процессора. Ядро распланировывает эти процессы на основе приоритетов; цикличность планирования задаётся защищённым синхронизатором тактов. В текущей версии Trusty (примечание: перевод делается, когда последней версией Android является Android 6) все Trusty приложения имеют одинаковый приоритет.
    Приложения для ОС Trusty могут быть написаны на C/C++ (C++ поддерживает с ограничениями) и у них есть доступ к маленькой C библиотеке. В настоящее время функция main() не принимает никаких аргументов. Заглушки системных вызовов, представленные в нативном ассемблерном коде, являются частью этой библиотеки, так что доступ к системным вызовам можно получить по имени.

Поддержка многопоточности

    Все приложения в Trusty однопоточные. Многопоточность в пользовательском пространстве в Trusty на текущий момент не поддерживается.

Структура приложений

    Приложения Trusty инициализируются один раз в процессе загрузки и размещаются в памяти до тех пока, пока TEE процессор не будет сброшен. На данный момент Trusty не поддерживает динамическую загрузку и выгрузку приложений.
    Доверенные приложения написаны как сервисы, управляемые событиями и ожидающие команды от других приложений или от приложений, работающих в основном процессоре. Доверенные приложения могут быть клиентами других доверенных приложений-сервисов. События, описанные в секции о Trusty API (примечание: см. ссылку выше), могут быть доставлены доверенным приложениям ядром Trusty.

Сторонние приложения Trusty

    На данный момент все приложения Trusty разработаны как единый пакет и упакованы вместе с образом ядра Trusty. Образ подписан и его целостность проверяется загрузчиком в процессе загрузки. В текущей версии Trusty разработка сторонних приложений не поддерживается.

    И даже если бы разработка сторонних приложений под ОС Trusty была разрешена, делать это нужно было бы с крайней осторожностью. Каждое новое приложение увеличивает область высоконадёжной вычислительной базы (TCB) системы (примечание: см. Википедию (en)). Доверенные приложения могут получать доступ к защищаемым участкам и с их помощью выполнять различные операции или даже изменять данные.

    Умение разрабатывать новые приложения, которые работают в TEE, открывает много возможностей для инноваций. Тем не менее из-за самой сути TEE, эти приложения не могут быть поставлены без явного подтверждения доверия. Популярным видом подтверждения доверия является цифровая подпись, производителю которой пользователь доверяет.