Приложение «Социальный мониторинг»: анализ траффика

Началось все с прилета в Москву. Как и положено, я сдал необходимый ПЦР тест на ковид, дождался отрицательного результата, залил его на Госуслуги и… решил, что на этом мои московские приключения закончились. Но все оказалось не так просто. Ко мне внезапно пришел врач. И вручил постановление, что 2 недели я обязан сидеть дома в карантине, так как в самолете со мной летел один зараженный. Про приложение «Социальный мониторинг» я много слышал и даже читал статью на Хабре, где люди покопались в его бета-версии. Ну а какой же исследователь не соблазнится покопаться в таком интересном приложении?

Скажу сразу, моей целью не было обмануть систему или сбежать из карантина. Свои 2 недели я честно просидел дома. Ну хорошо, пару раз выходил в ближайший магазин за пивом. Целью было посмотреть, что о нас знает эта система и насколько правдивы некоторые высказывания ее авторов. Сначала я занялся сбором предварительной информации. Выяснил примерно следующее:

  1. Приложение написано на основе программы трекера мусоровозов. Чему я не нашел вменяемых подтверждений, да и копание во внутренностях программы тоже ничего подобного не подтвердило.
  2. Бета версия была никак не защищена, ее декомпилировали и выложили на github. Впрочем, с гитхаба ее убрали по требованию правообладателя.
  3. Бета версия передавала фотки на сервер в Эстонии для использования сервиса распознавания лиц.
  4. Дальше я прочитал высказывание главы ДИТ Эдуарда Лысенко, который сказал следующее: «Руководитель ДИТ Москвы категорически опроверг информацию, что приложение передаёт фотографии на сторонний сервер: «На самом деле, ничего никуда не передаётся, — заявил он. — Во-первых, не передаются никакие фотографии в принципе. Во-вторых, тот код биометрический, который появляется, он попадает исключительно на сервера ДИТа.» Здесь мне уже стало интересно, как это фотки не передаются в принципе. Неужели они преобразуются в биометрический код прямо на смартфоне?
  5. Новая версия программы сильно обфусцирована и теперь практически невозможно ее анализировать.

Дальше собрал слухи от друзей-знакомых:

  1. На самом деле передается не одна фотка, а серия фоток. Это сделано для того, чтобы было невозможно сфоткать свою бумажную фотку. Или даже видео передается.
  2. Если приложение перестало запрашивать фотки, карантин закончился.

«Живое» приложение я честно поставил на айфон и не планировал в него вообще лезть. Айфона, на который можно поставить jailbreak у меня с собой не было, но зато был рутованный Андроид. С него я и начал. К слову, на рутованном Андроиде приложение не запускается. Обфускация Java кода выглядит забавно. Переименованы все переменные и названия функций. Но, пройдя по цепочке, мы попадаем на вполне читабельный кусок кода. Примерно, как ходить по листингу дизассемблера, только в конце сюрприз. Я бы потратил минимум пару дней, копаясь в этом коде, но внезапно придумалось более простое решение. А что, если… они доверяют ОС проверку SSL сертификатов? По работе мне иногда приходится реверсить протоколы Apple, Google, Whatsapp и многие другие. Почти во всех системах корневые сертификаты прошиты внутри программы, что сильно затрудняет анализ траффика.

Ставлю на Макбук mitmproxy, очень удобный анализатор траффика с минимумом настроек. Скачиваю их корневой сертификат, добавляю на айфон профиль – и вот оно! Весь траффик программы мы видим, как на ладони.

Регистрация приложения


Установить и зарегистрировать приложение нужно в течение суток от начала карантина. По этому поводу приходит SMS-ка. Раньше это делать бессмысленно, просто телефон не найдется в базе. Вот так выглядит запрос на регистрацию:

<b>2020-09-12 17:48:03 POST https://sm-a-a90ae4b5a.mos.ru/api/covid/device/password HTTP/2.0                             
                         ← 200 application/json 82b 156ms
{
    "deviceId": "2FFA9DB6-4900-4973-B1AE-BA5874BEXXXX",
    "phone": "7925xxxyyzz"
}</b>

В ответ мы всегда получаем “200 OK” и ничего более. Если телефон есть в базе, придет SMS-ка с кодом, который нужно ввести в приложение. Если телефона в базе нет, просто ничего не придет. В deviceId передается UDID айфона. К этому идентификатору все привязано. Если сломается айфон и мы поднимем новый из бекапа, приложение работать не будет. И будет штраф, с которым непонятно, как разбираться. Здесь и далее приватные данные будут полностью или частично заменяться на “XXYYZZ”.

Передача координат


Дальше я набрался смелости и подключил через mitmproxy «живой» телефон. Каждые минут 5-10, а также при запуске приложения, делается вот такой запрос:

2020-09-12 17:56:32 POST https://sm-a-a90ae4b5a.mos.ru/api/covid/device/60B1A8A1-2AD9-447C-BB25-91YYYYY19C6E/message  
                         HTTP/2.0                                                                                     
                         ← 200 application/json 83b 84ms
                         
[
    {
        "accuracy": 65,
        "battery_level": 68,
        "charge": false,
        "datetime": "2020-09-12T14:56:32Z",
        "device_model": "iPhone 11 Pro",
        "indoorNavigation": {
            "bluetoothDevices": [],
            "wifiDevices": [
                {
                    "name": "wifi-XXX",
                    "rssi": 0
                }
            ]
        },
        "install_datetime": "2020-09-08T07:57:11Z",
        "lat": 55.XXZZZ732239728,
        "locationDatetime": "2020-09-12T14:56:31Z",
        "locationStatus": {
            "gps": true,
            "isPermissionGranted": true,
            "network": true,
            "passive": true
        },
        "lon": 37.YYZZZ270607305,
        "os_version": "iOS 13.7.0",
        "version_ext": "1.7 (127)"
    }
]

Здесь мы опять же видим deviceId, он другой, первый запрос я делал с айпада.

accuracy – точность определения координат, не знаю, в каких единицах
battery_level – уровень заряда батарейки. Интересно, зачем он ДИТ-у?
charge – стоит ли телефон на зарядке. Тоже непонятно, зачем передается.
datetime – текущая дата и время. Возможно используется, чтобы нельзя было «подкрутить» время на устройстве.
device_model – модель телефона. Ну мне не жалко, если об этом узнает ДИТ.
indoorNavigation – довольно интересно. Здесь список известных wifi сетей, по которым можно определить координату. Но при этом не передается BSSID, что делает эту информацию абсолютно бесполезной. По имени сети координаты не определить.
install_datetime – может использоваться для защиты от эмуляции этих запросов. Хотя эту информацию можно при желании получить и довольно несложно.
lat, lon – собственно, координаты
location_status – включен ли GPS и разрешено ли программе пользоваться им в фоне. А если нет, будет штраф.
os_version – версия iOS
version_ext – не разбирался, возможно, версия самого приложения

Передача селфи


Начинается самое интересное. Сниффим траффик в момент передачи сделанного селфи. Итак, где же наши биометрические хеши и видео? А вот что происходит на самом деле:

<b>2020-09-12 18:00:15 POST https://sm-a-a90ae4b5a.mos.ru/api/covid/device/60B1A8A1-2AD9-447C-BB25-91YYYYY9C6E/photo    
                         HTTP/2.0                                                                                     
                         ← 200 application/json 39b 301ms
                Request                                 Response                                  Detail
:authority:       sm-a-a90ae4b5a.mos.ru                                                                               
content-type:     multipart/form-data; boundary=alamofire.boundary.04b478f466f0605d                                   
accept:           */*                                                                                                 
shard:            6                                                                                                   
authorization:    Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTk1NjYzMjl9.iq-noX2tu13tr4ut7sBWpgWl77sELkT
                  kXCdODK9yvL8                                                                                        
֞ostype:           iOS                                                                                                 
accept-language:  en-RU;q=1.0, ru-RU;q=0.9, cs-RU;q=0.8                                                               
accept-encoding:  br;q=1.0, gzip;q=0.9, deflate;q=0.8                                                                 
versionext:       1.7 (127)                                                                                           
content-length:   378238                                                                                              
֘user-agent:                                                                                                           
cookie:           session-cookie=163402e73a984c296450ad1fdcb1815835321af39172a2bef8658e48071941dc73acdb9d1d976170d2ef9
                  70da45f5c87                                                                                         
Multipart form                                                                                                  [m:auto]
҅Form data:

photo: ����..JFIF.....�.�..��.�Exif..MM.*.............................J...........R.(..........�i.........Z.......�.....</b>

Ну все понятно, да? Эта часть защищена чуть сильнее, в запросе еще фигурирует Bearer токен, по которому организована авторизация. Момент получения токена я не отсниффил, возможно, токен приходит при запросе на селфи. Уходит ровно одна фотка. Где же ваш биометрический хеш, господин Лысенко?

Запрос статуса и снятие карантина


Кроме передачи координат приложение еще регулярно делает запрос статуса. Кстати, возможно, что при запросе статуса и приходит запрос сделать селфи. Когда приложение перестало у меня запрашивать селфи, я ради интереса отсниффил запрос статуса:

<b>2020-09-18 13:28:13 GET https://sm-a-a90ae4b5a.mos.ru/api/covid/device/60B1A8A1-2AD9-447C-BB25-91XXXXX19C6E/status    
                        HTTP/2.0                                                                                      
                        ← 200 application/json 317b 181ms

{
    "code": 0,
    "io": "АНДРЕЙ ЕВГЕНЬЕВИЧ М.",
    "last_android_version": "1.1.1",
    "last_ios_version": "1.0",
    "message": "Все отлично! Уведомление о необходимости отправить фотографию придет в СМС-сообщении",
    "quarantine": null,
    "status": "active"
}</b>

Самое интересное в ответе сервера – это “quarantine: null”. Это означает, что карантин закончился. Но приложение вам об этом не говорит. Более того, в message они все еще обещают запрашивать селфи. И статус все равно активный. И координаты… ну конечно же приложение продолжает слать координаты устройства на сервер ДИТ! Поэтому удаляйте приложение сразу же по окончании карантина.

Что можно сделать


Из написанного очевидно, что можно написать скрипт, который будет эмулировать работу приложения и отсылать все нужные данные. Написание затрудняется тем, что в процессе тестирования можно легко схватить штраф. В первую очередь, нужно до конца отсниффить весь процесс регистрации, в том числе, в момент получения SMS-ки с кодом. Разобраться с Bearer аутентификацией и другими мелочами. Вполне возможно, что анализируют EXIF записи фоток. В которых есть точное время, а также могут быть координаты. Поэтому решением будет наделать много разных фоток заранее, а EXIF править уже на ходу перед отсылкой.

Ну и в заключении хочу сказать, что ни в коем случае не призываю кого-либо нарушать карантин, особенно при положительном тесте на коронавирус. Это лишь анализ системы и небольшой камушек в огород ДИТ, которые любят делать странные публичные заявления. Не болейте!

Средняя зарплата в IT

110 000 ₽/мес.
Средняя зарплата по всем IT-специализациям на основании 8 431 анкеты, за 2-ое пол. 2020 года Узнать свою зарплату
Реклама
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее

Комментарии 29

    +14

    Приложение сделано максимально унизительно, к пользователям относятся как к скоту, который надо отслеживать. Интересно, власть имущие вроде Пескова тоже пользуются таким приложением и делают селфи по несколько раз в день?


    Удивительная страна и люди в ней.

      +2
      Интересно, власть имущие вроде Пескова тоже пользуются таким приложением и делают селфи по несколько раз в день?
      Конечно нет.
      +4
      Спасибо за анализ, очень познавательно.
      Жаль, так и остается загадкой за чей счет в это время должен существовать самоизолирующийся, чему ему платить за аренду или квартплату, а так же что есть и что пить.
      Так же остается открытым вопрос на сколько это вообще отвечает правовым нормам подобное вторжение в личную жизнь, тем более с таким «погружением» как селфи по запросу.

      UPD:
      К слову, на рутованном Андроиде приложение не запускается.
      Правильно я понимаю, что в этом случае штраф или дадут девайс в аренду?
        +1
        Насколько я понял, альтернатива установке этой программы одна: положат в обсерватор на время карантина. При установке она спрашивала согласие на обработку персональных данных. То есть ставится это исключительно добровольно. Если нет смартфона, в теории обещают дать в аренду от правительства Москвы. Как это работает, не знаю.
          0
          Надо не забывать что в «согласии на лечение» прописаны согласия на обработку персданных и обязательство установить приложение. Поэтому невнимательное чтение «согласия» чревато обязательством к установке.
          В случае необходимости(я воспользовася) телефон действительно выдают и делают это без лишней волокиты.
            0
            С интернетом?
              0

              Телефон со своей симкой. Соцмониторинг работает через нее без проблем.

            +1
            Нет, вы не обязаны иметь айфон, чтобы быть гражданином. А самоизоляция не подразумевает госпитализации. Вы можете отказаться.
            В этом случае по идее вам должны дать устройство на замену, но насколько известно из интернета, никто этих устройств пока не видел.
              0

              Я видел, знаю ещё минимум двух людей которые видели.
              В этом ключе, всё, на удивление, гладко проходит.

              0
              Я слышал истории, что на самом деле от всего этого наблюдения можно отказаться (и кто-то успешно отказывался и никаких приложений не ставил), просто нужно подписывать или не подписывать правильные бумаги в правильный момент процедуры. А одна неосторожная подпись запускает цепочку, что вы как бы сами согласились (но и принципиально ничего не подписывать тоже нельзя, что-то можно, что-то нельзя). Обязательство сидеть дома, разумеется, никуда не денется.
            +2

            Странная фигня, кого-то на две недели садят на карантин из-за того что в самолете с ковидником летел, а у нас в московском офисе госконторы подтвержденные ковидники в нашем опен-спейсе и мы нормально продолжаем работать дальше.
            По каким критериям вообще решают карантин или нет?

              +3

              Аналогичнно, на работе у родственницы заболел весь департамент, четверо с подтверждённым ковидом. Она одна продолжает работать как ни в чём не бывало без всякого намека на карантин. Обоснование: у нас предприятие непрерывного цикла!

                0

                По прописанным в рекомендациях, рекомендации сначала написали для авиатранспорта, там одни правила, потом для выявленных случаев там другие (условно по результату анализа + список кого нужно отправить на анализ)

                +4
                Почему нигде не сказано, что все требования Московских властей незаконны и не выдерживают проверки судом?
                Так, например, все оспоренные в суде «штрафы» за «нарушение самоизоляции» отменяются.
                Почему не написано, что гражданин вправе отказаться от установки каких бы то ни было государственных приложений на свое собственное устройство?
                Я не хочу раздувать, понятно, что пандемия требует чрезвычайных мер, но почему эти меры настолько противоречат законам?
                  +2
                  понятно, что пандемия требует чрезвычайных мер

                  Как вы это поняли?
                  «Миллионы мух не могут ошибаться?»


                  но почему эти меры настолько противоречат законам?

                  Ну как, почему?
                  Вот бородатый анекдот на эту тему:


                  Заголовок спойлера
                  Приходит Лиса, а к ней Дракончик подкатывает:
                  -О, Рыжая!!! Привет, как жизнь, как дети?
                  Лиса смущенно:
                  -Да… Нормально…
                  -Слушь, Рыжая, приходи ко мне завтра на обед, я тебя съем.
                  За-а-а-писываем…

                  Лиса уходит, еле передвигая ногами: надо-ж! сама всех обманывает,
                  а тут попала…
                  Тут навстречу Заяц чешет:
                  -Что с тобой Рыжая?
                  -Сходи на опушку- узнаешь…

                  Заяц прибегает, Дракончик к нему:
                  -Здоров, Косой!!! как жизнь?
                  -Да, нормально.
                  -Короче, Косой, приходи ко мне завтра на ужин, я тебя съем.
                  За-а-а-писываем…
                  -Э, не Дракончик, я не могу- мне некогда…
                  Дракончик обиженно ворча:
                  -Ну не хочешь-как хочешь… Вы-черкиваем…

                  https://www.anekdot.ru/id/-461500002/

                  +1
                  В Конституции РФ сказано, что гражданин не должен свидетельствовать против себя. Все эти селфи с приложениями как раз подпадают под это определение. Для властей: вам надо — вы и приходите, проверяйте, что я на месте и не нарушаю. Интернета нет, живу в клетке Фарадея, чужие девайсы брать не хочу, свои не дам.
                  Другое дело, что потом муторно будет оспаривать все эти штрафы, все понимают, что незаконно, но «что делать, всем сейчас плохо, сказали штрафовать — штрафуем». И придётся отбиваться в судах, может не в одной инстанции.
                    +2
                    На самом деле будет примерно так: врачи получат решение суда и принудительно поместят на карантин в стационар. Случаи были, читал в новостях. И потом уголовное дело за побег из стационара. То есть или вот так, или играть в социальный мониторинг.
                      0
                      А в стационаре плохо?
                        0
                        Не знаю, не был :) Но подозреваю, что хуже, чем дома пивко попивать :)
                          0
                          Тут ещё более не понятно, а если нет московской прописки, можно ли сказать, что поедешь болеть на малую родину на авто?
                        0
                        Всё не так просто вроде как с принудительной госпитализацией. Есть, конечно, случай раскрученный в СМИ, но там был уже положительный тест вроде бы (не уверен), а СМИ любят раздувать сенсации (прогосударственные «сидите на карантине — иначе будете сидеть в тюрьме», а оппозиционные — «кровавый режим нарушает права человека»). Плюс тогда случаи были единичные, больницы пустые, а государство в панике. Сейчас никто не будет класть в стационар человека в лёгком состоянии и тем более без симптомов. Даже с заведомо положительным тесте, а не просто с подозрением.

                        На фоне этого есть опыт из первых рук от знакомых (самому, к счастью, не довелось лично сталкиваться), что в постановлении есть два варианта как его можно подписать — согласиться на слежку или отказаться и лишь подтвердить, что вас проинформировали о необходимости сидеть дома и ответственности за нарушение. При этом если согласиться единожды вас уже никто спрашивать ни о чём не будет дальше.

                        Разумеется, вряд ли сотрудники вам будут рассказывать о всех вариантах. Это как военкомат, который на словах вас за одну мысль о том, чтобы не служить посадит за уклонение, а на деле у вас есть куча прав на обследования, обжалования и т. д. И они даже реально работают в большинстве случаев.
                        0
                        я не эксперт, но можно это приложение поставить на пк, подкинуть координаты и одно и тоже селфи отсылать?
                          +1
                          Поставить на ПК, конечно же, нельзя, приложение написано только под iOS и Андроид. Отсылать одно и то же селфи, думаю, что тоже вряд ли. Уж сравнивать фотки они умеют. Плюс EXIF запись, о которой я писал в статье. Но при желании можно написать эмулятор приложения. Правда, для этого нужны исследования и эксперименты, которые могут привести к штрафам.
                            +1
                            bluestacks или там не будет работать? Да, и думаю не вручную там сравнивают. Да и простой генератор exif сделать не сложно
                        +1
                        Поговаривают (сам, к счастью, не сталкивался), что постановление, которое приносит врач, можно не подписывать — отказаться. Режим, на котором вас пытаются оставить дома на 2 недели — это всё та же условно-добровольная и никак юридически не зафиксированная «самоизоляция». Стоит понимать, что это не попытка воспринимать всё «в штыки», просто не у всех есть возможность 2 недели сидеть дома. Многим нужно кормить детей, семью, оплачивать кредиты и ипотеки.

                        Со стороны авторов приложения, делать серию фото и снимать видео, не сообщая об этом пользователю, как минимум подло. А по-хорошему — это свинство.

                        Автору поста спасибо за интересный и крайне актуальный материал!
                          +1
                          Энди круто! Удивлен, что ты раньше не писал на Хабр.

                          Ну к «чести» ДИТ они не наврали про сервера, никакой Эстонии, впрочем как и «биометрии» (что было и так понятно, как обрабатывать фотки на стороне тонкого клиента?).
                            0
                            Так, может быть, на сервера в Эстонии уже бекэнд ДИТ шлёт…
                              0
                              Ну, современный мобильник — не такой уж и «тонкий» клиент. Там уже пихают и нейрочипы и графические ускорители, а ими можно чего-нить и пообрабатывать.
                              0
                              Если правильно понял, селфи запрашиваются не так часто, как координаты. Очевидно, что переадресация на второй телефон решает вопрос краткосрочного похода «за пивом». В общем, с логикой и реализацией как-то все как всегда

                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                              Самое читаемое