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