Безопасность
Защита пользовательских данных и системы, которая их хранит, — на клиенте, который вам не подконтролен, в сети, которая вам не принадлежит, и на сервере, до которого дотянется кто угодно.
Почему это важно. Провал в безопасности не ухудшает продукт, а обрывает разговор — с пользователями, с партнёрами, с регуляторами. И самые частые провалы вовсе не экзотические: ключ внутри сборки, проверка только в интерфейсе, токен в логе.
Что нужно понимать
- Что здесь на самом деле стоит защищать и от кого
- Что видит и что может изменить атакующий, у которого установлено приложение, — а видит и может он всё
- Где именно применяется каждое правило и способен ли клиент его обойти
- Что хранится на устройстве и чем это обернётся, если устройство потеряют
- Что вы будете делать в первый час после утечки
Основные темы
Клиенту нельзя доверять
- Всё, что попало в сборку, можно прочитать: строки, ключи, адреса, логику
- Устройства с root и jailbreak, эмуляторы, модифицированные сборки
- Обфускация как помеха, а не как защита
- Валидация на клиенте — ради удобства, на сервере — ради безопасности
Хранение на устройстве
- Keychain и Keystore для секретов, а не shared preferences
- Что переживает удаление приложения, а что уезжает в облачную резервную копию
- Кеши и скриншоты как канал утечки
- Биометрическая защита и то, что она в действительности подтверждает
Передача по сети
- TLS везде, проверка сертификата не отключена
- Pinning: что он даёт и во что обходится в эксплуатации, когда сертификат меняется
- Токены — не в URL, не в логах, не в отчётах о падениях
На сервере
- Авторизация на каждом запросе, по умолчанию — запрет
- Инъекции, и параметризованные запросы как исчерпывающий ответ
- Ограничение частоты запросов и защита от злоупотреблений
- Зависимости с известными уязвимостями, проверяемые автоматически
- Секреты — в менеджере секретов, с ротацией, и никогда в репозитории
Приватность и обязательства
- Собирать меньше — самая надёжная защита
- Согласие, сроки хранения и удаление как продуктовые требования
- Декларации приватности в сторах, соответствующие тому, что делает приложение
- Реакция на инцидент: кого извещаем и как быстро
Уровни
| Уровень | Как это выглядит |
|---|---|
| Junior | Использует HTTPS, хранит токены в защищённом хранилище, не коммитит секреты. |
| Middle | Проверяет авторизацию на сервере, разводит секреты по окружениям, вовремя обновляет зависимости, не допускает утечки данных в логи. |
| Senior | Строит модель угроз для функциональности, проектирует в расчёте на враждебный клиент, минимизирует сбор данных и имеет план реакции на инцидент, который люди отрабатывали на практике. |
Практика
Для начала
-
Прочитайте собственную сборку Извлеките строки из release-сборки и найдите то, чего там быть не должно.
-
Перенесите секрет Найдите в shared preferences что-нибудь чувствительное и перенесите в защищённое хранилище.
-
Просканируйте зависимости Запустите проверку на уязвимости и разберитесь с тем, что она нашла.
Глубже
-
Обойдите собственный клиент Обратитесь к своему API напрямую, минуя приложение, и посмотрите, что оно вам позволит сделать.
-
Постройте модель угроз Возьмите одну функцию, перечислите, что стал бы пробовать атакующий, и закройте дыры.
-
Собирайте меньше Найдите данные, которые вы собираете и не используете, и перестаньте их собирать.
Проверьте себя
- Что можно узнать, декомпилировав ваше приложение?
- Какие правила проверяются только в интерфейсе?
- Какие чувствительные данные лежат на устройстве и как они защищены?
- Где хранятся ваши секреты в каждом окружении и кто может их прочитать?
- Когда вы в последний раз обновляли зависимость ради исправления уязвимости?
- Что вы будете делать в первый час после того, как обнаружите утечку?
Ресурсы
- OWASP Mobile Top 10 — ранжированный список того, что в мобильных приложениях ломается на практике. Правильное место для старта, потому что порядок в нём отражает реальную частоту.
- OWASP Mobile Application Security Testing Guide — версия для погружения: конкретные проверки хранения, криптографии, сети и взаимодействия с платформой — для обеих платформ.
- OWASP Cheat Sheet Series — короткие и предметные рекомендации по каждой теме. Первыми стоит прочитать про аутентификацию, хранение паролей и загрузку файлов.
- Obfuscating Dart code — что обфускация во Flutter делает, чего не делает и как она уживается с расшифровкой стектрейсов после падений.
- Android and iOS security documentation — рекомендации по хранению и передаче данных для каждой платформы; именно с ними сверяются при аудите безопасности.