Безопасность мобильных приложений
Мобильное приложение работает во враждебной среде — на устройстве пользователя, которое может быть скомпрометировано, инструментировано и полностью подконтрольно атакующему. Отсюда два сквозных правила: итоговый артефакт (собранный APK/IPA) может отличаться от того, что вы написали, а любой вердикт, вычисленный на клиенте, атакующий подделает. Всё остальное — следствия.
Главные ловушки начинаются там, где разработчик доверяет клиенту: манифест собирается из всех зависимостей, поэтому одна библиотека вновь включает cleartext; кэш скриншотов при сворачивании приложения утекает экран с паролем; OAuth в WebView отдаёт токены хостящему коду; а проверку на root/jailbreak DBI-утилита вроде Frida перехватывает и заставляет вернуть «чисто». Разбор — в слоях ниже.
Карта темы
- Основы безопасности мобильного приложения — cleartext через merge манифестов зависимостей, кэш скриншотов и OAuth в WebView.
- Детект компрометации устройства — почему клиентская проверка на root/jailbreak ненадёжна и как усложнить её обход.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
| Проверять только свой манифест, забыв про merge зависимостей | Библиотека вновь включает cleartext, и трафик идёт по http |
Считать итоговый APK побайтово равным исходнику | Финальный конфиг отличается — проверять нужно собранный артефакт |
| Не защищать экран ввода секрета от кэша скриншотов | При сворачивании приложения снимок с паролем утекает в превью задач |
Проводить OAuth через WebView вместо системного браузера | Хостящий код видит токены и куки авторизации |
| Доверять клиентскому вердикту детекта root/jailbreak | DBI-утилита перехватывает проверку и возвращает «чисто» |
| Кидать видимый эксепшен при детекте | Показываете атакующему точное место проверки для обхода |
Значение для собеседований
Тему спрашивают, чтобы проверить понимание границы доверия «клиент против сервера». Кандидат, который говорит «финальный артефакт и клиентский вердикт нельзя считать авторитетными, критичные решения — на сервере», сразу отделяется от того, кто верит в неизменность манифеста и надёжность локальной проверки на root.
Что обычно проверяют:
- Почему
cleartextможет идти вопреки вашемуusesCleartextTraffic=falseи где искать причину. - Чем
OAuthвWebViewопаснее системного браузера и как утекает экран через кэш скриншотов. - Почему клиентский детект компрометации ненадёжен и как его усложнить.
- Как DBI-утилита переопределяет проверку (например,
evaluatePolicy) и обходит биометрию.
Типичный неверный ответ: «раз мой манифест запрещает cleartext, а функция проверки на root вернула false, устройство чистое». На деле итоговый манифест собирается из зависимостей, а булев результат локальной проверки тривиально подделывается инструментированием.