Application de surveillance sociale: analyse du trafic

Tout a commencĂ© par une arrivĂ©e Ă  Moscou. Comme prĂ©vu, j'ai rĂ©ussi le test PCR requis pour covid, attendu un rĂ©sultat nĂ©gatif, l'ai tĂ©lĂ©chargĂ© aux services de l'État et ... j'ai dĂ©cidĂ© que c'Ă©tait la fin de mes aventures Ă  Moscou. Mais tout s'est avĂ©rĂ© ĂȘtre moins simple. Un mĂ©decin est soudainement venu me voir. Et il a remis un dĂ©cret selon lequel pendant 2 semaines j'Ă©tais obligĂ© de rester Ă  la maison en quarantaine, car une personne infectĂ©e volait avec moi dans l'avion. J'ai beaucoup entendu parler de l'application Social Monitoring et mĂȘme lu un article sur HabrĂ©, oĂč les gens se sont plongĂ©s dans sa version beta. Eh bien, quel genre de chercheur ne serait pas tentĂ© de se plonger dans une application aussi intĂ©ressante?



Je dirai tout de suite que mon objectif n'Ă©tait pas de tromper le systĂšme ou d'Ă©chapper Ă  la quarantaine. J'ai honnĂȘtement passĂ© mes 2 semaines Ă  la maison. D'accord, je suis allĂ© au magasin le plus proche plusieurs fois pour une biĂšre. Le but Ă©tait de voir ce que ce systĂšme sait de nous et Ă  quel point certaines des dĂ©clarations de ses auteurs sont vraies. Au dĂ©but, j'ai commencĂ© Ă  collecter des informations prĂ©liminaires. J'ai dĂ©couvert quelque chose comme ce qui suit:



  1. L'application est écrite sur la base du programme de suivi des camions à ordures. Ce que je n'ai pas trouvé de confirmation sensée, et creuser dans les éléments internes du programme n'a pas non plus confirmé quoi que ce soit de tel.
  2. La version bĂȘta n'Ă©tait en aucun cas protĂ©gĂ©e, elle a Ă©tĂ© dĂ©compilĂ©e et tĂ©lĂ©chargĂ©e sur github. Cependant, il a Ă©tĂ© supprimĂ© du github Ă  la demande du dĂ©tenteur des droits d'auteur.
  3. La version bĂȘta transmettait des images Ă  un serveur en Estonie pour utiliser le service de reconnaissance faciale.
  4. Puis j'ai lu la déclaration du chef du DIT Eduard Lysenko, qui a déclaré ce qui suit: «Le chef du DIT de Moscou a catégoriquement nié l'information selon laquelle l'application transmet des photos à un serveur tiers:« En fait, rien n'est transféré nulle part », a-t-il déclaré. - PremiÚrement, aucune photo n'est transférée en principe. DeuxiÚmement, le code biométrique qui apparaßt, il va exclusivement aux serveurs DIT. " Ici je me demandais déjà comment ces images ne sont pas transmises en principe. Sont-ils convertis en code biométrique directement sur votre smartphone?
  5. La nouvelle version du programme est fortement obscurcie et il est maintenant presque impossible de l'analyser.


Ensuite, j'ai recueilli des rumeurs d'amis et de connaissances:



  1. En fait, pas une photo n'est transmise, mais une sĂ©rie de photos. Ceci est fait pour qu'il soit impossible de prendre une photo de votre photo papier. Ou mĂȘme la vidĂ©o est transmise.
  2. , .


J'ai honnĂȘtement mis l'application "live" sur l'iPhone et je n'avais pas du tout prĂ©vu de m'y mettre. Je n'avais pas d'iPhone sur lequel je pouvais mettre un jailbreak avec moi, mais j'avais un Android rootĂ©. J'ai commencĂ© avec lui. Au fait, sur un Android rootĂ©, l'application ne dĂ©marre pas. Obfusquer le code Java semble drĂŽle. Toutes les variables et noms de fonctions ont Ă©tĂ© renommĂ©s. Mais, en passant par la chaĂźne, nous nous trouvons sur un morceau de code complĂštement lisible. Approximativement comment parcourir une liste de dĂ©sassembleur, seulement Ă  la fin de la surprise. J'aurais passĂ© au moins quelques jours Ă  fouiller dans ce code, mais j'ai soudainement proposĂ© une solution plus simple. Mais que faire si ... ils font confiance au systĂšme d'exploitation pour vĂ©rifier les certificats SSL? Au travail, je dois parfois inverser les protocoles d'Apple, Google, Whatsapp et bien d'autres. Dans presque tous les systĂšmes, les certificats racine sont assemblĂ©s Ă  l'intĂ©rieur du programme, ce qui rend trĂšs difficile l'analyse du trafic.



J'ai mis mitmproxy sur MacBook, un analyseur de trafic trĂšs pratique avec un minimum de paramĂštres. Je tĂ©lĂ©charge leur certificat racine, ajoute un profil Ă  l'iPhone - et c'est tout! Nous voyons tout le trafic du programme en un coup d'Ɠil.



Enregistrement de l'application



Vous devez installer et enregistrer l'application dans les 24 heures suivant le début de la quarantaine. A cette occasion, un SMS arrive. Auparavant, cela n'avait aucun sens de le faire, seul le téléphone ne sera pas trouvé dans la base de données. Voici à quoi ressemble la demande d'inscription:



<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>


En rĂ©ponse, nous obtenons toujours «200 OK» et rien de plus. Si le tĂ©lĂ©phone est dans la base de donnĂ©es, vous recevrez un SMS avec un code qui doit ĂȘtre entrĂ© dans l'application. S'il n'y a pas de tĂ©lĂ©phone dans la base de donnĂ©es, rien ne viendra. Le deviceId contient l'UDID de l'iPhone. Tout est liĂ© Ă  cet identifiant. Si l'iPhone se casse et que nous en prenons un nouveau dans la sauvegarde, l'application ne fonctionnera pas. Et il y aura une amende, avec laquelle on ne sait pas comment traiter. Ci-aprĂšs, les donnĂ©es privĂ©es seront totalement ou partiellement remplacĂ©es par «XXYYZZ».



Transmission de coordonnées



Ensuite, j'ai repris courage et j'ai connecté un téléphone "live" via mitmproxy. Toutes les 5 à 10 minutes, ainsi qu'au démarrage de l'application, la demande suivante est faite:



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)"
    }
]


Ici, nous voyons Ă  nouveau deviceId, c'est diffĂ©rent, la premiĂšre requĂȘte que j'ai faite depuis l'iPad.



précision - la précision de la détermination des coordonnées, je ne sais pas dans quelles unités

battery_level - le niveau de charge de la batterie. Je me demande pourquoi il est DIT?

charge - si le téléphone est en cours de chargement. On ne sait pas non plus pourquoi il est transmis.

datetime - la date et l'heure actuelles. Peut-ĂȘtre est-il utilisĂ© pour qu'il soit impossible de "resserrer" l'heure sur l'appareil.

device_model - modÚle de téléphone. Eh bien, je ne suis pas désolé si DIT le découvre.

La navigation intĂ©rieure est assez intĂ©ressante. Voici une liste de rĂ©seaux wifi connus grĂące auxquels vous pouvez dĂ©terminer les coordonnĂ©es. Cependant, le BSSID n'est pas transmis, ce qui rend ces informations totalement inutiles. Les coordonnĂ©es ne peuvent pas ĂȘtre dĂ©terminĂ©es par le nom du rĂ©seau.

install_datetime - Peut ĂȘtre utilisĂ© pour se protĂ©ger contre l'Ă©mulation de ces demandes. Bien que cette information puisse ĂȘtre obtenue si vous le souhaitez et est assez simple.

lat, lon - en fait,

les coordonnées location_status - si le GPS est activé et si le programme est autorisé à l'utiliser en arriÚre-plan. Sinon, il y aura une amende.

os_version - version iOS

version_ext - n'a pas compris, peut-ĂȘtre la version de l'application elle-mĂȘme



Transfert de selfie



Le plaisir commence. Reniflez le trafic au moment du transfert du selfie pris. Alors, oĂč sont nos hashes biomĂ©triques et nos vidĂ©os? Et voici ce qui se passe rĂ©ellement:



<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>


Eh bien, tout est clair, non? Cette partie est protĂ©gĂ©e un peu plus fort, la requĂȘte contient Ă©galement le token Bearer, par lequel l'autorisation est organisĂ©e. Je n'ai pas reniflĂ© le moment de la rĂ©ception du jeton, peut-ĂȘtre que le jeton vient lors d'une demande de selfie. Exactement une photo part. OĂč est votre hachage biomĂ©trique, M. Lysenko?



Demande de statut et mise en quarantaine



En plus d'envoyer des coordonnĂ©es, l'application fait Ă©galement rĂ©guliĂšrement une demande de statut. En passant, il est possible que lorsque vous demandez un statut, une demande de prise de selfie vienne. Lorsque l'application a cessĂ© de me demander un selfie, j'ai reniflĂ© la demande de statut par souci d'intĂ©rĂȘt:



<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>


La chose la plus intéressante à propos de la réponse du serveur est «quarantaine: null». Cela signifie que la quarantaine est terminée. Mais l'application ne vous le dit pas. De plus, dans le message, ils promettent toujours de demander des selfies. Et le statut est toujours actif. Et les coordonnées ... eh bien, bien sûr, l'application continue d'envoyer les coordonnées de l'appareil au serveur DIT! Par conséquent, désinstallez l'application immédiatement aprÚs la fin de la quarantaine.



Ce qui peut ĂȘtre fait



Il est Ă©vident d'aprĂšs ce qui a Ă©tĂ© Ă©crit que vous pouvez Ă©crire un script qui Ă©mulera le fonctionnement de l'application et enverra toutes les donnĂ©es nĂ©cessaires. L'Ă©criture est rendue difficile par le fait qu'il est facile de percevoir une pĂ©nalitĂ© lors des tests. Tout d'abord, vous devez renifler tout le processus d'inscription jusqu'Ă  la fin, y compris au moment de la rĂ©ception d'un SMS avec un code. Traitez l'authentification du porteur et d'autres questions. Il est possible qu'ils analysent des enregistrements EXIF ​​de photos. Dans lequel il y a une heure exacte, ainsi que des coordonnĂ©es. Par consĂ©quent, la solution serait de faire de nombreuses photos diffĂ©rentes Ă  l'avance, et d'Ă©diter EXIF ​​à la volĂ©e avant l'envoi.



Eh bien, en conclusion, je tiens à dire qu'en aucun cas je n'exhorte quiconque à violer la quarantaine, en particulier avec un test positif pour le coronavirus. Ceci est juste une analyse du systÚme et un petit caillou dans le jardin DIT, qui aiment faire d'étranges déclarations publiques. Ne sois pas malade!



All Articles