Идея безопасного мир, чтобы сохранить код выполнения там маленькие и как можно проще, - абсолютный минимум для выполнения своих обязанностей (как правило, управления доступом к некоторому ресурсу, как ключи шифрования или аппаратное обеспечение или облегчение некоторых защищенных функций, таких как шифрование/дешифрование).
Поскольку количество кода в безопасном мире невелико, его можно легко проверять и уменьшена площадь поверхности для появления ошибок. Однако он не означает, что безопасный мир автоматически «защищен». Если в коде безопасного мира есть уязвимость, его можно использовать так же, как и любую другую уязвимость безопасности.
Сравните это с кодом, выполняющимся в нормальном мире. Например, ядро Linux намного сложнее и сложнее проверять. Существует множество примеров уязвимостей и эксплойтов ядра, которые позволяют вредоносному коду захватить ядро.
Чтобы проиллюстрировать этот момент, предположим, что у вас есть система, в которой пользователи могут платить деньги через транзакционную систему с запросом-ответом. Когда они хотят совершить транзакцию, устройство должно ждать, пока пользователь нажмет физическую кнопку, прежде чем подписывать транзакцию криптографическим ключом и разрешает оплату.
Но что, если какой-то вредоносный код использовал ошибку ядра и может запускать произвольный код в режиме ядра? Обычно это означает полное поражение. Вредоносная программа может обойти все механизмы управления и зачитать ключи подписи. Теперь вредоносное ПО может производить платежи любому желающему, даже не требуя, чтобы пользователь нажал кнопку.
Что делать, если есть возможность подписания транзакций без ядра Linux, зная фактический ключ? Войдите в систему безопасного мира.
У нас может быть небольшая безопасная операционная система с единственной целью подписания транзакций и хранения ключа подписи. Однако он откажется подписывать транзакцию, если пользователь не нажмет специальную кнопку. Это очень маленькая ОС (в килобайтах), и вы наняли людей для ее аудита. Во всех смыслах и целях нет ошибок или уязвимостей безопасности в безопасной мировой ОС.
Когда нормальная мировая ОС (например, Linux) должна подписать транзакцию, она делает вызов SMC для передачи управления в безопасный мир (заметим, что нормальному миру не разрешается вообще изменять/читать безопасный мир) с транзакцией, которую он хочет подписать. Безопасная мировая ОС будет ждать нажатия кнопки от пользователя, подписать транзакцию, а затем передать управление в нормальный мир.
Теперь представьте ту же ситуацию, когда вредоносная программа заняла ядро Linux. Теперь злоумышленник не может прочитать ключ подписи, поскольку он находится в безопасном мире. Вредоносная программа не может подписывать транзакции без согласия пользователя, так как безопасная мировая ОС откажется подписывать транзакцию, если пользователь не нажмет кнопку.
Этот вид использования предназначен для безопасного мира. Вся идея заключается в аппаратном обеспечении разделения между безопасным и нормальным миром. Из нормального мира, нет никакого способа, чтобы непосредственно tamper с безопасным миром, потому что оборудование гарантирует это.
Я не работал с TrustZone, в частности, но я думаю, что когда бы безопасная мировая ОС не загрузилась, нет никакого способа напрямую ее модифицировать. Я не думаю, что разработчики приложений должны иметь возможность «добавлять» службы в безопасную мировую ОС, поскольку это победит ее цель. Я не видел никаких поставщиков, позволяющих третьим лицам добавлять код в свою безопасную глобальную ОС.
Чтобы ответить на ваш последний вопрос, я уже ответил на него в answer here. Исключения SMC - это то, как вы запрашиваете сервис из безопасной мировой операционной системы - это в основном системные вызовы, но для безопасной мировой ОС. Что может получить злонамеренный код, передав управление безопасному миру?
- Вы не можете изменить/читать безопасный мир от нормального мира
- При передаче управления в безопасном мире, вы теряете контроль в нормальном мире
Пример, который вы дали, помогает в прояснении сценария. Он ответил на многие мои вопросы. Спасибо :) – DigitalPerson