Android: доступ к скрытым методам и обнаружение root

Содержание статьи

Сегодня в выпуске: обход защиты на доступ к скрытым методам, обнаружение прав root в обход Magisk Hide, рассказ о том, как Google вычисляет зловредные приложения в Google Play, разрушение мифов о техниках оптимизации производительности приложений, руководство по защите коммуникационных каналов приложений, примеры использования функций-расширений в Kotlin. А также подборка инструментов пентестера и библиотек разработчика.

Почитать

Как обойти защиту на доступ к скрытым методам

Developers: It’s super easy to bypass Android’s hidden API restrictions — детальный рассказ, как обойти защиту на доступ к скрытым методам в Android 9 и выше.

Как и любая другая ОС, Android предоставляет разработчикам доступ к обширному API, который позволяет вызывать те или иные функции ОС. Этот API включает в себя ряд скрытых, но иногда очень полезных функций, например возможность развернуть строку состояния. Вызвать эти функции напрямую не получится, так как их просто нет в SDK. Но можно использовать модифицированный SDK (сложно) или рефлексию (очень просто).

Рефлексия позволяет дотянуться до любых методов и полей классов, что, конечно же, можно использовать для не совсем легальной деятельности. Поэтому, начиная с Android 9, Google создала черный список методов и полей, недоступных для вызова с помощью рефлексии. Если приложение попробует их вызвать, то либо будет принудительно остановлено, либо получит предупреждение (в случае с методами из серого списка).

Но есть в этой защите одна проблема — она основана на проверке имени вызывающего процесса. А это значит, что, если мы не будем вызывать метод напрямую, а попросим саму систему сделать это за нас, проверка даст добро (не может же она запрещать саму себя).

Итак, стандартный способ вызова скрытого метода с помощью рефлексии (не работает, приложение завершается):

val someHiddenClass = Class.forName("android.some.hidden.Class")
val someHiddenMethod = someHiddenClass.getMethod("someHiddenMethod", String::class.java) someHiddenMethod.invoke(null, "some important string")

Новый способ вызова скрытого метода с помощью двойной рефлексии (работает, потому что вызывает метод не наше приложение, а сама система):

val forName = Class::class.java.getMethod("forName", String::class.java)
val getMethod = Class::class.java.getMethod("getMethod", String::class.java, arrayOf<Class<*>>()::class.java)
val someHiddenClass = forName.invoke(null, "android.some.hidden.Class") as Class<*>
val someHiddenMethod = getMethod.invoke(someHiddenClass, "someHiddenMethod", String::class.java) someHiddenMethod.invoke(null, "some important string")

Но и это еще не все: с помощью этого трюка мы можем вызывать очень интересный скрытый метод setHiddenApiExemptions, который позволяет (бам!) добавить нужные нам методы в исключения и вызывать их с помощью простой рефлексии.

Следующий код прикажет системе добавить в исключения вообще все скрытые методы:

val forName = Class::class.java.getDeclaredMethod("forName", String::class.java)
val getDeclaredMethod = Class::class.java.getDeclaredMethod("getDeclaredMethod", String::class.java, arrayOf<Class<*>>()::class.java) val vmRuntimeClass = forName.invoke(null, "dalvik.system.VMRuntime") as Class<*>
val getRuntime = getDeclaredMethod.invoke(vmRuntimeClass, "getRuntime", null) as Method
val setHiddenApiExemptions = getDeclaredMethod.invoke(vmRuntimeClass, "setHiddenApiExemptions", arrayOf(arrayOf<String>()::class.java)) as Method val vmRuntime = getRuntime.invoke(null) setHiddenApiExemptions.invoke(vmRuntime, arrayOf("L"))

Стоит отметить, что Google в курсе этой проблемы. Они отклонили баг-репорт о возможности вызова скрытых методов под предлогом, что это защита от дураков, а не security-фича.

Как обнаружить Magisk

Detecting Magisk Hide — статья о том, как обнаружить присутствие Magisk (и, как следствие, прав root) на устройстве.

Magisk — известный, а в последнее время единственный инструмент systemless-рутинга устройств. Он позволяет получить права root без изменения системного раздела, а также применить различные системные твики. Одна из широко используемых возможностей Magisk — функция Magisk Hide, которая позволяет полностью скрыть сам Magisk и наличие прав root на устройстве от выбранных приложений.

Принцип работы Magisk основан на подключении поверх файловой системы системного раздела другой файловой системы (оверлея), содержащей бинарный файл su (необходимый для получения прав root) и нужные для его работы компоненты. Подключение происходит на ранних этапах загрузки, но, если активирован Magisk Hide, он отключает оверлей для выбранных приложений. Другими словами, обычные приложения будут видеть содержимое оверлея, а те, что указаны в настройках Magisk Hide, — нет. С их точки зрения смартфон будет не рутован.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее

Читать новость в источнике Xakep

0