Набор инструментов для проверки соблюдения конфиденциальности Android
Набор инструментов для проверки соблюдения конфиденциальности Android

Я уже написал статью《Идеи по устранению неполадок в соответствии с кодексом конфиденциальности[1]》изстатья,Но статья Воляплан не находится в открытом доступе.,Мне всегда кажется, что это немного не так.,На этот раз мы планируем открыть исходный код нескольких традиционных методов обнаружения.,Дайте вам несколько идей для справки.

Для полного набора проверок соответствия конфиденциальности очень важно сочетать динамические и статические. Статические используются для сканирования ситуации вызова всего API конфиденциальности приложения, а динамические используются для проверки наличия несоответствующих вызовов. Прежде чем согласиться на всплывающее окно конфиденциальности во время выполнения, ниже перечислены некоторые общие программы проверки:

Отмеченные ✅ части интеллект-карты реализованы. Позже мы объясним, для каких сценариев подходят эти решения и в чем их преимущества и недостатки.

Реализация всех вышеперечисленных инструментов основана на файле конфигурации конфиденциальности Privacy_api.json, а это означает, что вам нужно поддерживать только один файл конфигурации.

1. Статическая проверка

1. Сканирование байт-кода на основе зависимостей проекта.

Сканируйте все зависимости в проекте, извлеките все файлы классов из зависимого пакета jar, используйте инструмент ASM для анализа инструкций insn всех методов в файле класса, выясните, вызывается ли API конфиденциальности, и реализуйте фрагмент кода:

Язык кода:javascript
копировать
// 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)
        }
}

Пример результатов сканирования:

Язык кода:javascript
копировать
[ 
  "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] иллюстрировать

2. сканирование smali на основе apk

NetEase Cloud Music однажды опубликовала статью, основанную на smali сканированиеиз《Статическая проверка соответствия конфиденциальности Android[3]》статья,Идея в том,Воля apk Разархивировать, извлечь dex файл, а затем использовать baksmali Библиотека будет dex Преобразовать в smali файл, а затем проанализировать его построчно smali из ситуации вызова метода, Пример результатов сканирования:

Язык кода:javascript
копировать
[
  "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] иллюстрировать。

3. Проверка на наличие ворса

Lint Основная функция коммунизаций — сохранять конфиденциальность на этапе разработки. api из Случайная регулировка ситуации,Выявляйте проблемы заранее,Реализуйте фрагмент кода:

Язык кода:javascript
копировать
// 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] иллюстрировать

2. Динамический контроль

сверху изкарта разума,динамичныйисследовать Xposed и transform Инструментарий я не реализовал из-за того, что нашел эти два планиз ROI Очень низкий уровень и его сложно поддерживать в дальнейшем:

  1. для Xposed Для плана его необходимо связать с системой Root очень недружелюбен к разработке и тестированию. Тестовая среда слишком узкая, даже если она и есть. основе Нет root из VirtualXposed[6] , есть большие проблемы с совместимостью версий системы, официальная README описывать Поддерживает только 5.0 ~ 10.0 системы, среда тестирования все еще слишком узка. Более того, для только хочет решить вопрос конфиденциальности api Вызов ситуации из UI Честно говоря, Экспоузд план слишком тяжелый
  2. для transfrom С точки зрения инструментов, это вообще невозможный вариант, если вы transform Стадия статического сканирования, которую можно полностью решить, полагаясь на сканирование. Если вы хотите выполнить среду выполнения hook Замена, вам предстоит решить invoke-static и invoke-virtual Из замены обработка этих двух инструкций различна, и вы сказали, что хотите заменить, тогда чем вы ее заменяете? utils вид инструмента? Потом придется писать много шаблонного кода, тогда в будущем конфиденциальность api Если мы хотим добавить больше, стоит ли нам писать код шаблона заново? Дальнейшее обслуживание также слишком сложно.

Единственным решением для динамического решения является время выполнения AOP Hook.

1. Платформа перехватчиков АОП на основе среды выполнения

в предыдущей статье 《Идеи по устранению неполадок, связанных с соблюдением конфиденциальности[7]》Введен в употребление epic[8] осознать AOP крючок, но epic Поддерживает только Android 5.0 ~ 11. Для портативного устройства 12 системаиз Для меня Нет очень неудобно, поэтому я снова поискал следующую категорию epic израмка. Не говорите мне, я действительно нашел это, вот и все. Pine[9],поддерживать Android 4.4 (поддерживает только ART) ~ 14 и использовать thumb-2/arm64 Набор инструкций по устройству, использованию и epic Аналогично, следующее простое из AOP Hook действовать:

Язык кода:javascript
копировать
 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] иллюстрировать。

Не по теме:

  • Pine из Вы можете посмотреть идеи реализации《изDynamic Java перехват метода на ART[11]》,Это статья 2020 Годы написания статей, в теме информация, текущий возраст автора 19 возраст.....

2. Безрутовое решение на базе frida

на основе Frida план, я впервые познакомился с из camille[12],Но план требует Root, он может мониторить все приложения без вмешательства, но из README и issue Кажется, проблем много. При поиске подобных инструментов существует множество вариантов внедрения. frida-server из пути, нужно пройти adb Воля frida-server push Подойдите к телефону и запустите услугу, ваша кожа головы онемеет, просто слушая ее. Найдено позже frida gadget [13]план,Можно настроить напрямую js Скриптосознать крючок, не нужно frida-server:

Общие этапы реализации:

  1. скачать android arm Архитектура из frida-gadget.so[14], потому что Release Есть много продуктов, и вам нужно нажать Assets Развернуть больше
  2. создавать script.js Скриптдокумент,выполнитьконфиденциальность api из hook
  3. Воля frida-gadget.so[15] и script.js напиши местному
  4. создавать frida-gadget.config.so документ,Структура контентаиз path ориентированный script.js в локальном из пути
  5. динамическая нагрузка frida-gadget.so[16] файл,so буду читать frida-gadget.config.so серединаиз path путь, получить script.js файл и выполнить js Скрипт

Эффект от бега следующий:

Долженпланиз优点不нуждаться root, и адаптация модели лучше, Фрида Также поддерживает java/native из крючок, недостатком является то, что это решение можно использовать только для вашего собственного приложения. Hook。

специфический Посмотреть интегрированные решения github FridaCheck из README[17] иллюстрировать。

Подведите итог:

Для Выше упомянуто несколько планов, я все же предпочитаю основестатическийпланиз apk smali сканированиеина основединамичныйпланиз frida неинвазивный camille[18] Оба метода позволяют реализовать сканирование конфиденциальности, не вторгаясь в проект, и подходят для людей, не являющихся разработчиками.

Справочные ссылки:

  • Технология Android Hook[19]
  • Frida Gadget[20]
  • frida Gadget so отказался root инъекция app[21]
  • Облачная музыка NetEase Android конфиденциальность合规статическийисследовать[22]
  • Android App Средства обнаружения соблюдения конфиденциальности Camille[23]
  • Нет root-среды frida из Два способа использования[24]
  • Mobile Security Framework (MobSF)[25]
  • изDynamic Java перехват метода на ART[26]

Ссылки

[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/

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose