Я уже написал статью《Идеи по устранению неполадок в соответствии с кодексом конфиденциальности[1]》изстатья,Но статья Воляплан не находится в открытом доступе.,Мне всегда кажется, что это немного не так.,На этот раз мы планируем открыть исходный код нескольких традиционных методов обнаружения.,Дайте вам несколько идей для справки.
Для полного набора проверок соответствия конфиденциальности очень важно сочетать динамические и статические. Статические используются для сканирования ситуации вызова всего API конфиденциальности приложения, а динамические используются для проверки наличия несоответствующих вызовов. Прежде чем согласиться на всплывающее окно конфиденциальности во время выполнения, ниже перечислены некоторые общие программы проверки:
Отмеченные ✅ части интеллект-карты реализованы. Позже мы объясним, для каких сценариев подходят эти решения и в чем их преимущества и недостатки.
Реализация всех вышеперечисленных инструментов основана на файле конфигурации конфиденциальности Privacy_api.json, а это означает, что вам нужно поддерживать только один файл конфигурации.
Сканируйте все зависимости в проекте, извлеките все файлы классов из зависимого пакета jar, используйте инструмент ASM для анализа инструкций insn всех методов в файле класса, выясните, вызывается ли API конфиденциальности, и реализуйте фрагмент кода:
// 1、читатьконфиденциальность api Конфигурационный файл
val apiList: List<ApiNode> = Gson().fromJson(configFile.bufferedReader(), type)
// 2. Получите все зависимости проекта.
val resolvableDeps = project.configurations.getByName(configurationName).incoming
resolvableDeps.artifactView { conf ->
conf.attributes { attr ->
attr.attribute(
AndroidArtifacts.ARTIFACT_TYPE,
AndroidArtifacts.ArtifactType.CLASSES_JAR.type
)
}
}
// 3、ASM анализировать Class документ
clazz.methods?.forEach {
it.instructions
.filterIsInstance(MethodInsnNode::class.java)
.forEach Continue@{ node ->
val callClazz = getClassName(node.owner) ?: return@Continue
val callMethod = node.name
checkApiCall(callClazz, callMethod, it.name, clazz, apiList)
}
}
Пример результатов сканирования:
[
"android.location.LocationManager_requestLocationUpdates": [
{
"clazz": "androidx/core/location/LocationManagerCompat$Api31Impl",
"method": "requestLocationUpdates",
"dep": "androidx.core:core:1.9.0"
},
{
"clazz": "androidx/core/location/LocationManagerCompat",
"method": "getCurrentLocation",
"dep": "androidx.core:core:1.9.0"
}
]
]
Поскольку оно основано на сканировании, это означает, что код проекта приложения не может участвовать в сканировании. Это решение подходит для компонентных решений, основанных на проектах оболочки. Как правило, проекты оболочки имеют только один класс приложения, и в него интегрированы другие бизнес-компоненты. зависимым способом упаковки проекта Shell, преимуществом этого решения является то, что по результатам сканирования можно быстро найти ответственного за модуль и внести изменения.
Посмотреть интегрированные решения github из DepCheck плагин README[2] иллюстрировать
NetEase Cloud Music однажды опубликовала статью, основанную на smali сканированиеиз《Статическая проверка соответствия конфиденциальности Android[3]》статья,Идея в том,Воля apk Разархивировать, извлечь dex файл, а затем использовать baksmali Библиотека будет dex Преобразовать в smali файл, а затем проанализировать его построчно smali из ситуации вызова метода, Пример результатов сканирования:
[
"android.location.LocationManager_requestLocationUpdates": [
{
"clazz": "public final Landroidx.core.location.LocationManagerCompat;",
"method": "public static getCurrentLocation(Landroid/location/LocationManager;Ljava/lang/String;Landroidx/core/os/CancellationSignal;Ljava/util/concurrent/Executor;Landroidx/core/util/Consumer;)V"
},
{
"clazz": "public final Landroidx.core.location.LocationManagerCompat;",
"method": "public static requestLocationUpdates(Landroid/location/LocationManager;Ljava/lang/String;Landroidx/core/location/LocationRequestCompat;Landroidx/core/location/LocationListenerCompat;Landroid/os/Looper;)V"
}
]
]
Поскольку он основан на apk сканер, может напрямую контролировать все направления бизнеса из apk сканер, по сравнению с необходимостью интеграции в проектную упаковку инструмента сканирования, нет необходимости интегрировать плагин для каждой бизнес-линии, сканирование более эффективно. Более того, инструмент Нет часто подходит для использования разработчиками, например, когда возвращается тестовая версия, конечный продукт apk Выполните сканирование, чтобы определить, есть ли в текущей версии несоответствующие вызовы. Конечно, исканирование на основе apk также имеет недостатки,Невозможно быстро определить, к какому модулю принадлежит класс, поскольку он зависит от мышления.,То есть лидера модуля быстро найти невозможно.
Реализация планиза с использованием из Java Console Application Инженерные разработки CLI Инструмент, вы можете напрямую выполнить командную строку для анализа результатов, вам нужно только предоставить apk Путь и конфиденциальность api файл конфигурации (но требует локального Java окружающая среда), например:
./ApkCheck /xx/xx/xx.apk /xxx/xx/api.json
См. специальную документацию по использованию. github из ApkCheck из README[4] иллюстрировать。
Lint Основная функция коммунизаций — сохранять конфиденциальность на этапе разработки. api из Случайная регулировка ситуации,Выявляйте проблемы заранее,Реализуйте фрагмент кода:
// 1、читать工程根目录изконфиденциальность Конфигурационный файл
open class BaseDetector : Detector() {
override fun beforeCheckFile(context: Context) {
super.beforeCheckFile(context)
val apiJson = File(context.project.dir.parentFile,API_JSON)
apiNode = Gson().fromJson(apiJson.bufferedReader(),type)
}
}
// 2、исследовать Включает ли вызов методаконфиденциальность api
private class ApiCallUastHandler(val context: JavaContext?) : UElementHandler() {
override fun visitCallExpression(node: UCallExpression) {
if (node.isMethodCall()) {
apiNode.find {
context?.evaluator?.isMemberInClass(node.resolve(), it.clazz) == true
&& it.method.find { m -> m == node.methodName } != null
}?.let {
context?.report(
ISSUE,
node,
context.getLocation(node),
REPORT_MESSAGE
)
}
}
}
}
Результаты проверки следующие:
Вывод отчета:
image.png
специфический Посмотреть интегрированные решения github из LintCheck из README[5] иллюстрировать
сверху изкарта разума,динамичныйисследовать Xposed и transform Инструментарий я не реализовал из-за того, что нашел эти два планиз ROI Очень низкий уровень и его сложно поддерживать в дальнейшем:
Единственным решением для динамического решения является время выполнения AOP Hook.
в предыдущей статье 《Идеи по устранению неполадок, связанных с соблюдением конфиденциальности[7]》Введен в употребление epic[8] осознать AOP крючок, но epic Поддерживает только Android 5.0 ~ 11. Для портативного устройства 12 системаиз Для меня Нет очень неудобно, поэтому я снова поискал следующую категорию epic израмка. Не говорите мне, я действительно нашел это, вот и все. Pine[9],поддерживать Android 4.4 (поддерживает только ART) ~ 14 и использовать thumb-2/arm64 Набор инструкций по устройству, использованию и epic Аналогично, следующее простое из AOP Hook действовать:
Pine.hook(Method, object : MethodHook() {
override fun beforeCall(callFrame: Pine.CallFrame) {
addStackLog(method.declaringClass.name, method.name)
}
override fun afterCall(callFrame: Pine.CallFrame) {}
})
Тогда наша идея реализации может выглядеть так: соблюдение конфиденциальности. api файл конфигурации, а затем вызовите Pine.hook Вот и все. Эффект во время выполнения следующий:
Преимущество этой программы в том, что Android Версия системы имеет относительно полную совместимость и может быть реализована без изменения исходного бизнес-кода. AOP Крюк, недостатком является то, что его можно использовать только для собственных нужд. Крюк, и может только Hook Java Method。
специфический Посмотреть интегрированные решения github из RuntimeCheck из README[10] иллюстрировать。
Не по теме:
на основе Frida план, я впервые познакомился с из camille[12],Но план требует Root, он может мониторить все приложения без вмешательства, но из README и issue Кажется, проблем много. При поиске подобных инструментов существует множество вариантов внедрения. frida-server из пути, нужно пройти adb Воля frida-server push Подойдите к телефону и запустите услугу, ваша кожа головы онемеет, просто слушая ее. Найдено позже frida gadget [13]план,Можно настроить напрямую js Скриптосознать крючок, не нужно frida-server:
Общие этапы реализации:
Эффект от бега следующий:
Долженпланиз优点不нуждаться root, и адаптация модели лучше, Фрида Также поддерживает java/native из крючок, недостатком является то, что это решение можно использовать только для вашего собственного приложения. Hook。
специфический Посмотреть интегрированные решения github FridaCheck из README[17] иллюстрировать。
Для Выше упомянуто несколько планов, я все же предпочитаю основестатическийпланиз apk smali сканированиеина основединамичныйпланиз frida неинвазивный camille[18] Оба метода позволяют реализовать сканирование конфиденциальности, не вторгаясь в проект, и подходят для людей, не являющихся разработчиками.
Справочные ссылки:
[1]
Идеи по устранению неполадок в коде соответствия конфиденциальности: https://juejin.cn/post/7042967031599071269
[2]
Android Статическая проверка соблюдения конфиденциальности: https://musicfe.com/android-privacy/
[3]
VirtualXposed: https://github.com/android-hacker/VirtualXposed
[4]
Идеи по устранению неполадок в коде соответствия конфиденциальности: https://juejin.cn/post/7042967031599071269
[5]
epic: https://github.com/tiann/epic/blob/master/README_cn.md
[6]
Pine: https://github.com/canyie/pine/blob/master/README_cn.md
[7]
изDynamic Java метод перехвата на ART: https://blog.canyie.top/2020/04/27/dynamic-hooking-framework-on-art/
[8]
camille: https://github.com/zhengjim/camille
[9]
frida gadget : https://frida.re/docs/gadget/#script
[10]
frida-gadget.so: https://github.com/frida/frida/releases
[11]
Android Hook технология: https://meik2333.com/posts/android-hook/
[12]
Frida Gadget: https://frida.re/docs/gadget/
[13]
frida Gadget so отказался root инъекция app: https://blog.51cto.com/u_15127527/4546627
[14]
Облачная музыка NetEase Android Статическая проверка соблюдения конфиденциальности: https://musicfe.com/android-privacy/
[15]
Android App Средства обнаружения соблюдения конфиденциальности Camille: https://github.com/zhengjim/camille
[16]
Нет root среда frida из Два способа использования: https://nszdhd1.github.io/2021/06/15/%E9%9D%9Eroot%E7%8E%AF%E5%A2%83%E4%B8%8Bfrida%E7%9A%84%E4%B8%A4%E7%A7%8D%E4%BD%BF%E7%94%A8%E6%96%B9%E5%BC%8F/
[17]
Mobile Security Framework (MobSF): https://github.com/MobSF/Mobile-Security-Framework-MobSF?tab=readme-ov-file#mobile-security-framework-mobsf
[18]
изDynamic Java метод перехвата на ART: https://blog.canyie.top/2020/04/27/dynamic-hooking-framework-on-art/