Aplicativo de monitoramento social: análise de tráfego

Tudo começou com a chegada a Moscou. Como esperado, passei no teste de PCR exigido para covid, esperei por um resultado negativo, enviei para os Serviços de Estado e ... decidi que era o fim de minhas aventuras em Moscou. Mas tudo acabou não sendo tão simples. Um médico de repente veio até mim. E ele entregou um decreto que por 2 semanas eu era obrigado a ficar em casa em quarentena, já que uma pessoa infectada estava voando comigo no avião. Ouvi muito sobre o aplicativo Social Monitoring e até li um artigo sobre o Habré, onde as pessoas se aprofundaram em sua versão beta. Bem, que tipo de pesquisador não se sentiria tentado a mergulhar em uma aplicação tão interessante?



Direi imediatamente que meu objetivo não era enganar o sistema ou escapar da quarentena. Sinceramente, passei minhas 2 semanas em casa. Ok, fui até a loja mais próxima algumas vezes para tomar uma cerveja. O objetivo era ver o que esse sistema sabe sobre nós e quão verdadeiras são algumas das afirmações de seus autores. No início, comecei a coletar informações preliminares. Eu descobri algo como o seguinte:



  1. O aplicativo é escrito com base no programa rastreador de caminhão de lixo. O que eu não encontrei confirmação sã, e vasculhar o interior do programa também não confirmou nada do tipo.
  2. A versão beta não foi protegida de forma alguma, foi descompilada e carregada no github. No entanto, ele foi removido do github a pedido do detentor dos direitos autorais.
  3. A versão beta transmitiu imagens para um servidor na Estônia para usar o serviço de reconhecimento facial.
  4. Então li a declaração do chefe do DIT Eduard Lysenko, que disse o seguinte: “O chefe do DIT de Moscou negou categoricamente a informação de que o aplicativo transmite fotos a um servidor de terceiros:“ Na verdade, nada é transferido para lugar nenhum ”, disse ele. - Em primeiro lugar, nenhuma foto é transferida em princípio. Em segundo lugar, o código biométrico que aparece, vai exclusivamente para os servidores DIT. " Aqui já estava me perguntando como essas imagens não são transmitidas, em princípio. Eles são convertidos em um código biométrico diretamente no seu smartphone?
  5. A nova versão do programa está bastante ofuscada e agora é quase impossível analisá-la.


Então coletei boatos de amigos e conhecidos:



  1. Na verdade, nenhuma foto é transmitida, mas uma série de fotos. Isso é feito para que seja impossível tirar uma foto de sua foto em papel. Ou até mesmo o vídeo está sendo transmitido.
  2. , .


Sinceramente, coloquei o aplicativo "live" no iPhone e não planejava entrar nele. Eu não tinha um iPhone no qual pudesse fazer o jailbreak, mas tinha um Android com root. Comecei com ele. A propósito, no Android com root, o aplicativo não inicia. Ofuscar o código Java parece engraçado. Todas as variáveis ​​e nomes de funções foram renomeados. Mas, percorrendo a cadeia, nos encontramos em um pedaço de código completamente legível. Aproximadamente como percorrer uma lista de desmontador, apenas no final da surpresa. Eu teria passado pelo menos alguns dias vasculhando esse código, mas de repente descobri uma solução mais simples. Mas e se ... eles confiarem no sistema operacional para verificar os certificados SSL? No trabalho, às vezes tenho que reverter os protocolos da Apple, Google, Whatsapp e muitos outros. Em quase todos os sistemas, os certificados raiz são agrupados dentro do programa, o que torna muito difícil analisar o tráfego.



Coloquei o mitmproxy no MacBook, um analisador de tráfego muito útil com um mínimo de configurações. Eu faço o download do certificado raiz, adiciono um perfil ao iPhone - e é isso! Vemos todo o tráfego do programa de relance.



Registro de aplicativo



Você precisa instalar e registrar o aplicativo dentro de 24 horas a partir do início da quarentena. Nesta ocasião, chega um SMS. Anteriormente, não fazia sentido fazer isso, apenas o telefone não era encontrado no banco de dados. Esta é a aparência da solicitação de registro:



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


Em resposta, sempre obtemos “200 OK” e nada mais. Caso o telefone esteja no banco de dados, você receberá um SMS com um código que deverá ser inserido no aplicativo. Se não houver telefone no banco de dados, nada virá. O deviceId contém o UDID do iPhone. Tudo está vinculado a este identificador. Se o iPhone quebrar e pegarmos um novo no backup, o aplicativo não funcionará. E haverá uma multa, com a qual não está claro como lidar. Doravante, os dados privados serão total ou parcialmente substituídos por “XXYYZZ”.



Transmissão coordenada



Então, criei coragem e conectei um telefone "ao vivo" por meio de mitmproxy. A cada 5 a 10 minutos, assim como ao iniciar o aplicativo, é feita a seguinte solicitação:



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


Aqui vemos novamente deviceId, é diferente, a primeira solicitação que fiz do iPad.



precisão - a precisão de determinar as coordenadas, não sei em quais unidades

battery_level - o nível de carga da bateria. Eu me pergunto por que ele é DIT?

carregar - se o telefone está carregando. Também não está claro por que é transmitido.

datetime - a data e hora atuais. Talvez seja usado de forma que seja impossível "apertar" a hora no dispositivo.

device_model - modelo do telefone. Bem, não lamento se o DIT descobrir sobre isso.

indoorNavigation é muito interessante. Aqui está uma lista de redes wi-fi conhecidas pelas quais você pode determinar a coordenada. No entanto, o BSSID não é transmitido, o que torna essas informações totalmente inúteis. As coordenadas não podem ser determinadas pelo nome da rede.

install_datetime - pode ser usado para proteger contra a emulação dessas solicitações. Embora esta informação possa ser obtida se desejar e seja bastante simples.

lat, lon - na verdade, coordenadas

location_status - se o GPS está habilitado e se o programa tem permissão para usá-lo em segundo plano. Caso contrário, haverá multa.

os_version - versão iOS

version_ext - não entendi, talvez a versão do próprio aplicativo



Transferência de selfie



A diversão começa. Fareje o tráfego no momento de transferir a selfie tirada. Então, onde estão nossos hashes e vídeos biométricos? Aqui está o que realmente acontece:



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


Bem, está tudo claro, certo? Essa parte é protegida um pouco mais forte, a solicitação também contém o token do portador, pelo qual a autorização é organizada. No momento em que recebi o token, não cheirei, talvez o token venha ao solicitar uma selfie. Exatamente uma foto sai. Onde está seu hash biométrico, Sr. Lysenko?



Solicitação de status e liberação de quarentena



Além de enviar coordenadas, o aplicativo também faz uma solicitação de status regularmente. Aliás, é possível que quando você solicita um status, apareça um pedido para tirar uma selfie. Quando o aplicativo parou de me pedir uma selfie, cheirei a solicitação de status por uma questão de interesse:



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


O mais interessante sobre a resposta do servidor é “quarentena: nulo”. Isso significa que a quarentena terminou. Mas o aplicativo não informa isso. Além disso, na mensagem, eles ainda prometem solicitar selfies. E o status ainda está ativo. E as coordenadas ... bem, é claro que o aplicativo continua a enviar as coordenadas do dispositivo para o servidor DIT! Portanto, desinstale o aplicativo imediatamente após o término da quarentena.



O que pode ser feito



Pelo que foi escrito, é óbvio que você pode escrever um script que emulará o funcionamento do aplicativo e enviará todos os dados necessários. A escrita é dificultada pelo fato de que é fácil perceber uma penalidade durante o teste. Em primeiro lugar, é preciso farejar todo o processo de registro até o fim, inclusive na hora de receber um SMS com um código. Lide com a autenticação do portador e outras curiosidades. É possível que eles analisem gravações EXIF ​​de fotos. Em que existe uma hora exata, bem como coordenadas. Portanto, a solução seria fazer muitas fotos diferentes com antecedência e editar EXIF ​​imediatamente antes de enviar.



Bem, para concluir, quero dizer que em nenhum caso exorto ninguém a violar a quarentena, especialmente com um teste positivo para coronavírus. Esta é apenas uma análise do sistema e uma pequena pedra no jardim do DIT, que gosta de fazer declarações públicas estranhas. Não fique doente!



All Articles