John Wu (разработчик Magisk, популярного приложения для получения и управления правами суперпользователя в Android) обнаружил, что компания Huawei использовала собственные недокументированные API, чтобы дать пользователям возможность установить сервисы Google на недавно вышедшие смартфоны серии Mate 30.
В результате санкций со стороны США, смартфоны Mate 30 вышли без поддержки приложений и сервисов Google. Очень быстро был обнаружен способ обойти ограничение — достаточно скачать и установить приложение с сайта lzplay.net, после чего следовать содержащимся в нём инструкциям. Это давало доступ ко всем сервисам Google, включая Google Pay.
Джон разобрал приложение с помощью APKTool и обнаружил странные разрешения в AndroidManifest.xml:
<uses-permission android:name="com.huawei.permission.sec.MDM_APP_MANAGEMENT"/>
<uses-permission android:name="com.huawei.permission.sec.MDM_INSTALL_SYS_APP"/>
<uses-permission android:name="com.huawei.permission.sec.MDM_INSTALL_UNDETACHABLE_APP"/>
<uses-permission android:name="com.huawei.systemmanager.permission.ACCESS_INTERFACE"/>
Поиски привели его к документации, относящейся к чему-то под названием Huawei Security Authorization SDK. Оказалось, что Huawei встраивает в Android свой собственный набор API для управления устройствами (MDM, предназначается для корпораций, которым требуется защищать данные на устройствах сотрудников). Android уже имеет в своём составе такие инструменты: API Device Administration и Android Enterprise. Сравнение их с предлагаемыми Huawei показыват, что решение китайской корпорации позволяет более гибко управлять подконтрольными устройствами, но, в целом, все описанные возможности характерны для MDM и не вызывают подозрений.
Однако, внимательные читатели могли заметить, что два разрешения из числа используемых LZPlay не документированы:
<uses-permission android:name="com.huawei.permission.sec.MDM_INSTALL_SYS_APP"/>
<uses-permission android:name="com.huawei.permission.sec.MDM_INSTALL_UNDETACHABLE_APP"/>
Таким образом, в сборках Android, поставляемых Huawei, есть две недокументированные возможности, позволяющие любому доверенному приложению устанавливать системные приложения и неотключаемые приложения. Опытные пользователи Android, конечно, знают, как при разблокированном загрузчике через кастомное рекавери «прошить приложение в системный раздел», чтобы дать ему больше прав. Но наш случай совсем иной:
- загрузчик заблокирован и включён режим Android Verified Boot.
- Huawei использует для разделов system/vendor/product сжатую файловую систему EROFS, позволяющую только чтение.
Это означает, что системный фреймворк в операционной системе Huawei содержит «бэкдор», который позволяет доверенному приложению пометить обычное приложение как системное, несмотря на то, что это приложение отсутствует в /system.
Согласно документации, сторонние разработчики/компании должны подписать юридические соглашения и отправить их в Huawei, чтобы получить доступ к SDK. Для каждого проекта разработчик отправляет отдельный запрос и обоснование, а также список разрешений, которые он хочет получить. Кроме того, каждый бинарный файл APK изучается специалистами Huawei, только после этого он будет подписан специальным ключом Huawei.
Очевидно, что Huawei осведомлена о приложении LZPlay и явно одобряет его существование. Разработчик этого приложения каким-то образом узнал об этих недокументированных API, подписал юридические соглашения, прошёл все этапы проверки и получил в конце концов подпись Huawei. Единственная цель приложения — установить сервисы Google на устройство, не прошедшее сертификацию Google.
Даже если закрыть глаза на то, что такое поведение явно нарушает все мыслимые условия использования сервисов Google, подобный бэкдор всё равно не должен существовать — хотя бы с точки зрения безопасности. Системные приложения имеют расширенные права лишь по одной причине: они размещены в криптографически верифицированном разделе, доступном только для чтения. Несмотря на то, что сертификат, позволяющий превратить обычное приложение в системное, хранится у доверенной (если вы, конечно, доверяете Huawei) стороны, а также требуется, чтобы пользователь разрешил приложению быть администратором устройства, если приложение размещено в доступном для записи разделе (userdata), оно не должно рассматриваться как системное.
Анализ приложения LZPay затруднён, в связи с тем, что оно обфусцировано/зашифровано с помощью ПО китайского разработчика QiHoo Jiagu. Кроме того, самое интересное — системный фреймворк, а он доступен только на устройствах Huawei, которые у Джона Ву нет. Возможно, если его поковырять, найдутся и другие недокументированные возможности…
Вскоре после публикации статьи, сайт LZPlay был закрыт без объяснения причин. Незамедлительно последовал и ответ Google: смартфоны Mate 30 перестали проходить проверку SafetyNet, что делает невозможным использование Google Pay.
Автор: dartraiden