Защита мобильного приложения от атаки "человек посередине"
Мы работаем над мобильным приложением, которое взаимодействует с бэкэндом через REST API через SSL. Мобильное устройство выполняет проверку сертификата по вызову API (используя стандартные библиотеки в мобильных платформах). Если мы попытаемся подключить мобильное устройство через прокси (например, Charles), мы увидим весь трафик, но он зашифрован - как и ожидалось. Однако, если я включу SSL-прокси, сгенерирую корневой сертификат и установлю этот сертификат на моем устройстве, я все данные буду видеть в виде открытого текста через Чарльза - снова, как и ожидалось.
Вопрос в том, как это предотвратить? Основная цель, конечно, состоит в том, чтобы предоставлять данные ТОЛЬКО, если устройство вызывает разрешенный сервер с действительным сертификатом для этого сервера.
2 ответа
Единственный способ предотвратить подобное, если злоумышленник имеет такой уровень доступа к устройству, - это использовать SSL-печать большого пальца. Вы бы инициировали соединение с сервером. Получите сертификат SSL и сравните его с жестко закодированным значением в коде приложения. Если это не совпадает, прервите соединение и не отправляйте данные.
Проблема с этим, однако, заключается в накладных расходах при обновлении SSL. Вам необходимо выпустить обновление приложения с новым значением отпечатка. Это также остановит людей, использующих приложение, пока они не обновятся до последней версии.
Единственный способ предотвратить это - закрепление сертификата, но если злоумышленник сможет установить корневой сертификат до того, как вы впервые подключитесь к своему API, вы все равно можете использовать MiM.