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:
- 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.
- 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.
- A versão beta transmitiu imagens para um servidor na Estônia para usar o serviço de reconhecimento facial.
- 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?
- A nova versão do programa está bastante ofuscada e agora é quase impossível analisá-la.
Então coletei boatos de amigos e conhecidos:
- 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.
- , .
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!