«Социальный мониторинг». Счёт 1:0 в нашу пользу
Введение
Приложение вышло → увидели тихий ужас → начали писать отрицательные отзывы → разобрали по полочкам → приложение удалили (отправили на доработку).
Всем привет, в данной статье, когда всё миновало, я хочу рассказать Вам о двух ключевых стадиях из перечисленных выше.
Что за приложение можно почитать тут.
А про оправдания и отправку на доработку тут.
Под катом мы посмотрим с Вами что же такого увидели в самом начале разбора приложения и пробежимся полностью по интересным моментам из кода. Насладимся дырявостью приложения и ни в какую не будем принимать «посмотрите за какие мы сроки это сделали».
Предыстория
Для меня началось всё в Telegram канале «IT и COPM». Далеко не сразу увидел пост с ссылкой на приложение в Play Market«e и apk«шку ниже. Только спустя минут 30, от количества постов в этом канале, я решил почитать. На тот момент ребята уже декомпилировали приложение и активно смотрели куда отправляются данные. Выдернули некоторые эндпоинты, хосты, токен, начали постить скриншоты кусков кода. Приложив apk«шку попросили кого-нибудь опубликовать декомплированный код на GitHub — спустя полтора часа он был выложен. Тут подключился я…
Основная часть
Бэк
В самом начале хочется сказать, что внутри приложения был токен для работы с API сервиса распознавания лиц Identix.one. Данные ребята работают так, что сначала им нужно загрузить базу пользователей с фотографиями и данными, а только потом можно отправлять фотографии на распознавание.
Токен был в приложении, работа с API этого сервиса через клиента, а не свой бэк. Таким образом любой пользователь, выдрав токен, мог начать загружать любые фотографии граждан РФ и получать о них информацию. Звучит прекрасно.
Посмотрев тарифы этого сервиса я понял, что это вообще для камер видеонаблюдения. За каждую камеру надо заплатить неплохую сумму и был удивлен, сколько же пришлось заплатить за это разработчикам приложения.
Зайдя в раздел документации по API мне показалось интересным получение загруженной базы пользователей и другие вещи. Поэтому я решил выполнить запрос и проверить токен. К счастью, или сожалению, токен был инвалидирован, о чем я сразу же сообщил владельцу канала «IT и COPM» через Twitter.
Начал я своё изучение с бэка, так как планировал найти что-нибудь интересное там (sql inj, например). У нас уже были хосты и ссылка для входа в админку. В админку и пошёл. Посмотрев на запросы сразу стало ясно, что это какой-то Atmosphere Framework. Увидев дикую жопу в запросах, как он помечает какая кнопка была нажата, какой флаг в форме поставлен, я приуныл. Не хотел копаться в этом и максимум что сделал — вбил в гугл «Atmosphere Framework CVE». Бегло посмотрев заголовки ничего интересного не увидел кроме XSS и пошёл дальше. А дальше я пошёл на другие известные нам эндпоинты.
Такими эндпоинтами оказались ручки для начала и окончания вашей работы. Которая бы характеризовала диапазон времени, проведенный на работе. Тут уже не обошлось без кода. Я открыл проект, погрепал до нужного места и начал изучать параметры. Среди них оказались deviceEUI, idxid, latitude и longitude. Если с последними двумя понятно сразу, то с первыми — нет. Потратив N количество минут для успешного выполнения запроса, так и остановился на Access denied.
Потом, для понимания объекта исследования, я решил скачать приложение себе. Скачать скачал, а вот авторизоваться уже не удалось… Бэк к тому времени они положили (но я об этом ещё не знал).
Открыв код проекта не на GitHub«e, а полноценно в идеи я начал искать новые эндпоинты. Нашел! Название соответствующее: /api/covid/Device…
Начал инвестигировать уже в эти ручки. Я долго не понимал как же проходит авторизация, где там заголовок с токеном или ещё чего. А потом до меня дошло… Её нет! Удостоверившись в этом, разобрав обработку и формирование запросов сделал своё заключение по бэкенд части и отправил опять в Twitter.
Заключение по бэкенд части: регистрация проходит отправкой информации о вашем девайсе (телефоне). Туда входит адрес, номер телефона, ФИО и т.д. Сразу после регистрации с вас требуют фотку и загружают уже её к «вам в профиль». На самом деле для того, чтобы указать чья эта фотка, указывается доп параметр в запросе — IMEI. Он находится в поле deviceId модели Device, которую мы отправили при первом шаге регистрации. Нет никакой валидации того, что IMEI принадлежит Вам. Стоит отправить чужой — и вы успешно выполните запрос, якобы с другого устройства. Примечательным является то, что среди эндпоинтов присутствует /api/covid/Device/password, однако обработка ответа выглядит следующим образом:
После регистрации устройства API возвращает authCode, но, к сожалению, данный код сохраняется в поле объекта и лежит там, пылится. Не участвует в формировании других запросов.
Таким образом, не имея аутентификации, любой пользователь, зная IMEI человека (или подобрав/перебрав его) мог отправить ложную геопозицию, загрузить фотографию, отправить статус о начале рабочего дня и прочее.
Я бы с удовольствием поигрался с такой веселой реализацией, но, увы, всё было отключено.
С этого времени я начал полностью упарываться в код и описывать то, что вижу, в своём Telegram канале. Получился бред полнейший без какой-либо связи между абзацами, однако после этого поста у меня нашлись силы (уже было 2–3 ночи) переписать его и сделать читаемым.
Разбор приложения
Здесь сразу стоит отметить, что приложение к этому времени уже не работало. Поэтому я не имел представления о том, что оно может наглядно. Изучал всё вслепую и по коду, который был далеко не весь! Все мы знаем что такое декомпиляция, но того, что было, хватило сделать определённые выводы.
Приложение хранит информацию о вашем устройстве, ФИО, номере телефона, адресе. Существуют непонятные поля, например comments. А есть интересные — врач.
Для распознания лиц используется сервис identix (тот самый параметр из части с бэком). Он позволяет по загруженной фотографии вернуть возраст, пол человека и другую информацию. Там же находится уникальный идентификатор человека, который используется внутри приложения.
Для навигации используются два типа устройств: блютуз, вайфай. У обоих есть название и RSSI (качество сигнала, говорящее о расстоянии до точки).
Вашу геопозицию получают благодаря Google и GPS модулю.
Среди различных типов хранимой информации присутствует локация. Удивительно, но в ней огромное количество полей. В том числе уровень заряда батареи, количество шагов (несмотря на отдельную модель для этого) и прочее.
В настройках можно задавать интервал телеметрии. Как сбора, так и отправки. Не уверен насчет возможность изменять данные параметры.
Уникальный идентификатор бывает трёх разных типов:
- IMEI устройства.
- ID устройства (не изучал).
- MAC адрес WiFi.
Таким образом, то, что я вверху писал про передачу и подбор IMEI является упрощением, для понимания. На самом деле это один из трёх идентификаторов.
Ваш ID зависит от того, какой версии у вас стоит SDK. Проще говоря, есть ли возможность получить тот, или иной тип уникального идентификатора. Разработчики приложения сами путаются в них и не могут сойтись в одном названии.
Единственное место, где вставлю код в статье.
if (Build.VERSION.SDK_INT >= 29) {
return getMac(context);
}
return getImei(context);
А внутри получения getImei вот такой иф:
if (Build.VERSION.SDK_INT >= 26) {
str = telephonyManager.getImei();
} else {
str = telephonyManager.getDeviceId();
}
Приложение также может получить номер сим-карты, но только тоже в хитрых кейсах. Есть возможность — возьмёт.
QR код генерируется с текстом ID, который может быть трёх типов. Эту тему, как и с сервисом распознавания лиц, обмусолили кому не лень. Не заостряю внимание.
Интересной возможность приложения являются пуш уведомления вам на устройства. Разработчики удаленно могут послать команды и они будут выполнены у вас. Одна из команд называется OPEN_CAMERA. Другая — SERVER_ADDRESS_KEY — тут, вероятнее всего, по аналогии с Telegram. Когда его блокировали, он рассылал всем пользователям новые IP адреса и мы продолжали использовать мессенджер. Помимо этого нам удаленно могут задать интервал отправки и сбора телеметрии. Вот тут про возможные push уведомления.
Можно конечно ещё рассказать про аватарку, как её можно вращать, как они её локально сохраняют, как они её нормализуют. Можно рассказать про желание сделать автообновление приложения, но что-то не успели, про возможность переходить в звонилку по номеру, ведение списка контактов (самая примитивная записная книжка имя — номер), про то, что на минималках взаимодействуют с количеством активных файвай точек вокруг, но это всё скуууучнооо.
Заключение
Знаете, я не буду говорить какие они плохие, я не буду говорить какие они молодцы. Каждый сделает вывод для себя сам. Критические недоработки, уязвимости и шпионские штучки я Вам изложил. Лишь могу сказать, что, несмотря на поставленные сроки, ни в коем случае нельзя допускать разработку заведомо уязвимого приложения.
Не могу не отметить сплочённость народа. Все начали делиться своими находками, проявлять активность, а кто не мог в это — ставили 1 в отзывах. 4207 единиц было мной зафиксировано максимально и отсутствие (на взгляд) других оценок.
То самое бредовое сообщение с набросками и оригинал заключения по бэку есть в моём Telegram канале, а он есть среди ссылок в профиле.
Последнее, что хочу Вам показать, дык это функция «нелегального» получения MAC адреса из их кода и такая же на stackoverflow (спасибо ntoskrnl):
там ещё пытаются воспользоваться особенностью Android для получения mac-адреса обходным путём. Не через пермишен ACCESS_WIFI_STATE, а через базовый INTERNET
— NTen (@nteuxinus) April 3, 2020
Но! Найдите 10 отличий между их кодом и ответом со stackoverflow)
Немножко шумит декомпилированный котлин, но суть понятна pic.twitter.com/1GeGwtB3Hq
И как всегда, спасибо, что дочитали аж до сюда!
P.S. Любой человек может допустить ошибку и я не исключение. Возможно, что-то не так увидел, возможно не совсем понял реализацию. Сейчас придут и скажут, что при регистрации запоминается IP и выполнять запросы другому человеку нельзя, а?! А я отвечу, что бред и тогда сам владелец при переподключении к мобильной сети потеряет доступ… В общем Вы поняли, комментарии открыты!