Как ADB вообще решает, кому доверять:
Начиная с Android 4.2.2 каждое подключение проходит проверку по RSA. При первом запуске демона на хосте adb генерирует пару ключей 2048 бит. Публичный ключ отправляется на устройство, и там появляется диалог "Разрешить отладку по USB?" с отпечатком (SHA-256) этого ключа и чекбоксом "Всегда разрешать с этого компьютера". Если поставить галочку, публичный ключ запоминается на устройстве навсегда, и диалог больше не появляется. Без подтверждения устройство отвечает статусом unauthorized.
Код: Выделить всё
adb devices
List of devices attached
RF8M30XXXXX unauthorizedRSA-ключи: где лежат, какие права, как ротировать:
На хосте ключи хранятся в домашнем каталоге пользователя.
Код: Выделить всё
ls -l ~/.android/adbkey ~/.android/adbkey.pub
-rw------- 1 user user 1675 adbkey
-rw-r--r-- 1 user user 717 adbkey.pubКод: Выделить всё
chmod 600 ~/.android/adbkeyНа самом устройстве авторизованные публичные ключи лежат в /data/misc/adb/adb_keys, по одному на строку. Прочитать файл можно только с root.
Код: Выделить всё
adb shell su -c 'cat /data/misc/adb/adb_keys'
QAAAAB...== user@hostКод: Выделить всё
adb keygen ./ci_adbkeyКод: Выделить всё
export ADB_VENDOR_KEYS=/secure/ci_adbkey
adb kill-server && adb start-serverКод: Выделить всё
rm ~/.android/adbkey ~/.android/adbkey.pub
adb kill-server
adb start-serverЧем опасна включенная отладка на личном устройстве:
USB-отладка снимает часть защит. Если кто-то получил физический доступ к разблокированному телефону с уже авторизованным ключом, он через adb вытащит данные, поставит APK, прочитает буфер обмена. Даже на заблокированном экране сценарий "always allow" опасен: ключ-то уже доверен. Поэтому простое правило: держите "Отладку по USB" выключенной, включайте только на время работы. Сбросить список доверенных компьютеров стоит после визита в сервис или подключения к незнакомому ПК. Подключение к публичной зарядке с передачей данных (так называемый juice jacking) частично гасится тем самым диалогом авторизации, но если вы один раз нажали "всегда разрешать" на чужом порту, защита снята.
Защита от несанкционированного ADB по сети:
Команда adb tcpip переводит демон в режим прослушивания TCP-порта на всех интерфейсах.
Код: Выделить всё
adb tcpip 5555
restarting in TCP mode port: 5555Выключить TCP-режим и вернуться на USB:
Код: Выделить всё
adb usb
restarting in USB modeКод: Выделить всё
adb shell setprop service.adb.tcp.port -1
adb shell stop adbd
adb shell start adbdКод: Выделить всё
adb pair 192.168.1.50:37145
Enter pairing code: 681924
Successfully paired to 192.168.1.50:37145 [guid=adb-...]
adb connect 192.168.1.50:39555ADB для пентеста: легальные векторы:
ADB полезен при анализе защищенности своего приложения или устройства, на которое у вас есть письменное разрешение. В России несанкционированный доступ к чужой информации это статья 272 УК РФ, так что границу "только свое или по договору" не переходите. Что можно делать легально и с пользой для обороны.
Найти экспортируемые компоненты приложения, которые могут быть точкой входа для атаки:
Код: Выделить всё
adb shell dumpsys package com.example.app | grep -A2 -i "exported=true"Код: Выделить всё
adb shell run-as com.example.app ls files/
shared_prefs databases cacheКод: Выделить всё
adb shell dumpsys package com.example.app | grep -i permissionБезопасное хранение и передача файлов:
push и pull по USB идут по кабелю и локальны, но по классическому TCP (tcpip) трафик не шифруется, в одной сети его можно перехватить. Беспроводная отладка Android 11+ шифрует канал TLS, поэтому для сетевых передач предпочитайте именно ее.
Код: Выделить всё
adb pull /data/local/tmp/report.bin ./report.bin
/data/local/tmp/report.bin: 1 file pulled. 12.3 MB/s (524288 bytes in 0.041s)Код: Выделить всё
adb shell rm /data/local/tmp/report.binКод: Выделить всё
adb shell sha256sum /data/local/tmp/report.bin
9f2c... /data/local/tmp/report.bin
sha256sum ./report.bin
9f2c... ./report.binЧастые ошибки:
Видите unauthorized и грешите на кабель, а на экране висит непринятый диалог. Скопировали adbkey на другую машину и удивляетесь, что устройство пускает без вопросов, это и есть перенос доверия. Включили adb tcpip 5555 для удобства и забыли выключить, порт остался слушать после ухода из дома. Передали файл по сети в tcpip-режиме и думаете, что это приватно, нет, шифрования там нет. Держите отладку выключенной по умолчанию, ключи под правами 600, а сетевую отладку только через pair по TLS, и большая часть рисков снимается сама.