Diré de inmediato que mi objetivo no era engañar al sistema ni escapar de la cuarentena. Honestamente, pasé mis 2 semanas en casa. Bien, fui a la tienda más cercana un par de veces a tomar una cerveza. El objetivo era ver qué sabe este sistema sobre nosotros y qué tan ciertas son algunas de las declaraciones de sus autores. Al principio comencé a recopilar información preliminar. Descubrí algo como lo siguiente:
- La aplicación está escrita en base al programa de seguimiento de camiones de basura. Lo que no encontré una confirmación sensata, y profundizar en los aspectos internos del programa tampoco confirmó nada por el estilo.
- La versión beta no estaba protegida de ninguna manera, fue descompilada y cargada en github. Sin embargo, se eliminó del github a petición del titular de los derechos de autor.
- La versión beta transmitía imágenes a un servidor en Estonia para utilizar el servicio de reconocimiento facial.
- Luego leí la declaración del jefe de DIT Eduard Lysenko, quien dijo lo siguiente: “El jefe de DIT de Moscú negó categóricamente la información de que la aplicación transmite fotos a un servidor de terceros:“ De hecho, no se transfiere nada a ningún lado ”, dijo. - En primer lugar, en principio no se transfieren fotos. En segundo lugar, el código biométrico que aparece, va exclusivamente a los servidores DIT ”. Aquí ya me preguntaba cómo estas imágenes no se transmiten en principio. ¿Se convierten en un código biométrico directamente en su teléfono inteligente?
- La nueva versión del programa está muy confusa y ahora es casi imposible analizarla.
Luego recopilé rumores de amigos y conocidos:
- De hecho, no se transmite una foto, sino una serie de fotos. Esto se hace para que sea imposible tomar una foto de su foto en papel. O incluso se está transmitiendo el video.
- , .
Honestamente, puse la aplicación "en vivo" en el iPhone y no tenía intención de entrar en ella. No tenía un iPhone en el que pudiera poner un jailbreak conmigo, pero tenía un Android rooteado. Empecé con él. Por cierto, en Android rooteado, la aplicación no se inicia. Ofuscar el código Java parece divertido. Se ha cambiado el nombre de todas las variables y funciones. Pero, al pasar por la cadena, nos encontramos con un código completamente legible. Aproximadamente cómo recorrer una lista de desensambladores, solo al final de la sorpresa. Habría pasado al menos un par de días investigando este código, pero de repente se me ocurrió una solución más simple. Pero, ¿y si ... confían en el sistema operativo para verificar los certificados SSL? En el trabajo, a veces tengo que revertir los protocolos de Apple, Google, Whatsapp y muchos otros. En casi todos los sistemas, los certificados raíz se unen dentro del programa, lo que dificulta el análisis del tráfico.
Puse mitmproxy en MacBook, un analizador de tráfico muy útil con un mínimo de configuraciones. Descargo su certificado raíz, agrego un perfil al iPhone, ¡y eso es todo! Vemos todo el tráfico del programa de un vistazo.
Registro de solicitud
Debe instalar y registrar la aplicación dentro de las 24 horas posteriores al inicio de la cuarentena. En esta ocasión, llega un SMS. Anteriormente, no tenía sentido hacer esto, solo el teléfono no se encontrará en la base de datos. Así es como se ve la solicitud 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>
En respuesta, siempre obtenemos "200 OK" y nada más. Si el teléfono está en la base de datos, recibirá un SMS con un código que debe ingresar en la aplicación. Si no hay ningún teléfono en la base de datos, no vendrá nada. El deviceId contiene el UDID del iPhone. Todo está ligado a este identificador. Si el iPhone se rompe y recogemos uno nuevo de la copia de seguridad, la aplicación no funcionará. Y habrá una multa, con la que no está claro cómo lidiar. En adelante, los datos privados serán reemplazados total o parcialmente por “XXYYZZ”.
Coordinar la transmisión
Luego me armé de valor y conecté un teléfono "en vivo" a través de mitmproxy. Cada 5-10 minutos, así como al iniciar la aplicación, se realiza la siguiente solicitud:
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)"
}
]
Aquí vemos de nuevo deviceId, es diferente, la primera solicitud que hice desde el iPad.
precisión: la precisión de la determinación de las coordenadas, no sé en qué unidades
battery_level: el nivel de carga de la batería. Me pregunto por qué es DIT.
cargar: si el teléfono se está cargando. Tampoco está claro por qué se transmite.
datetime: la fecha y hora actuales. Quizás se usa para que sea imposible "ajustar" el tiempo en el dispositivo.
device_model: modelo de teléfono. Bueno, no lamento si el DIT se entera de esto.
indoorNavigation es bastante interesante. Aquí hay una lista de redes wifi conocidas mediante las cuales puede determinar las coordenadas. Sin embargo, el BSSID no se transmite, lo que hace que esta información sea completamente inútil. Las coordenadas no se pueden determinar por el nombre de la red.
install_datetime: se puede usar para proteger contra la emulación de estas solicitudes. Aunque esta información se puede obtener si se desea y es bastante sencilla.
lat, lon - en realidad, coordenadas
location_status - si el GPS está habilitado y si el programa puede usarlo en segundo plano. Si no, habrá una multa.
os_version - versión de iOS
version_ext - no entendí, quizás la versión de la aplicación en sí
Transferencia de selfie
Empieza la diversión. Huele el tráfico en el momento de transferir la selfie tomada. Entonces, ¿dónde están nuestros hashes y videos biométricos? Y esto es lo que realmente sucede:
<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>
Bueno, todo está claro, ¿no? Esta parte está protegida un poco más fuerte, la solicitud también contiene el token de Portador, por el cual se organiza la autorización. En el momento en que recibí el token no olfateé, quizás el token venga al solicitar una selfie. Sale exactamente una foto. ¿Dónde está su hachís biométrico, Sr. Lysenko?
Solicitud de estado y liberación de cuarentena
Además de enviar coordenadas, la aplicación también realiza periódicamente una solicitud de estado. Por cierto, es posible que cuando solicitas un estado, venga una solicitud para hacerte una selfie. Cuando la aplicación dejó de pedirme una selfie, olí la solicitud de estado por interés:
<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>
Lo más interesante en la respuesta del servidor es "cuarentena: nulo". Esto significa que la cuarentena ha terminado. Pero la aplicación no te dice eso. Además, en el mensaje, todavía prometen solicitar selfies. Y el estado sigue activo. Y las coordenadas ... bueno, ¡por supuesto que la aplicación sigue enviando las coordenadas del dispositivo al servidor DIT! Por lo tanto, desinstale la aplicación inmediatamente después de que finalice la cuarentena.
Qué se puede hacer
Por lo que se ha escrito, es obvio que se puede escribir un script que emulará el funcionamiento de la aplicación y enviará todos los datos necesarios. La escritura se dificulta por el hecho de que es fácil recibir una penalización durante la prueba. En primer lugar, debe olfatear todo el proceso de registro hasta el final, incluso en el momento de recibir un SMS con un código. Trate la autenticación de portador y otras trivialidades. Es posible que analicen grabaciones EXIF de fotos. En el que hay una hora exacta, así como coordenadas. Por lo tanto, la solución sería hacer muchas fotos diferentes por adelantado y editar EXIF sobre la marcha antes de enviarlas.
Bueno, en conclusión, quiero decir que en ningún caso insto a nadie a violar la cuarentena, especialmente con una prueba positiva para coronavirus. Esto es solo un análisis del sistema y un pequeño guijarro en el jardín de DIT, a quienes les gusta hacer extrañas declaraciones públicas. ¡No te enfermes!