Aperçu de l'appli SAIP sous le capot.

Posted on lun. 13 juin 2016 in misc

Edit 13/06/16 22:00 : Via le commentaire de Vincent j'ai finalement réussi à déclencher une alerte.
~~Note: Je publie en l'état les informations que j'ai pu récolter, car malheureusement par manque de temps (et de connaissance sur les apps android) je ne vais pas continuer. ~~

L'application SAIP à été lancer par le ministère de l'intérieur pour prévenir les populations de danger à venir, la principale motivation de la création de cette application sont les attentats de 2015.

Pour en savoir plus, l'article de Nextinpact la présente bien : Le gouvernement lance SAIP, l'application officielle « spéciale attentats »

L'application a été crée par deveryware, une entreprise française qui travaille avec le ministère de l'intérieur depuis quelques années, dans les archives d'owni on retrouve un article intéressant sur cette société... Ils fournissent aussi les sondes de géolocalisation pour les services de renseignement...Raison de plus pour être méfiant.

Le ministère insiste bien pour dire qu'aucune donnée de localisation n'est envoyée - ce qui semble être vrai (mais je ne maîtrise pas assez le programme et l'android pour en être certain)-, en effet l'application fonctionne de la façon suivante, elle récupère la liste de toutes les alertes de France, puis localement elle opère le traitement pour savoir s'il faut vous afficher l'écran d'alerte ou pas. Techniquement c'est une bonne solution, en effet aucun traitement côté serveur ce qui diminue le risque de problème potentiel pour cette application qui doit avoir une disponibilité de 100%.

Qu'elles sont les données récupèrable ?

Pas grand chose :

  • les logs sur l'api sont peu bavard, voilà un exemple de ce que l'on peut récupérer côté serveur : 192.168.1.67 - - [11/Jun/2016:14:49:05 +0200] "GET /alert_list.txt HTTP/1.1" 200 1252 "-" "okhttp/3.2.0"
  • L'application utilise les framework de twitter fabric , notamment Crashlytics qui s'occupe de remonter les informations de crash (avec accord ?) je n'ai pas fouillé par là, mais j'ai vu des requêtes DNS vers des noms de domaines correspondant à crashlytics.
  • L'application utilise Google Cloud Messaging pour récuprer les informations de l'api sans pomper toute la batterie.

L'api :

Le fichier des alertes est disponible ici : https://3718fa66e6.optimicdn.com/alert_list.txt
Le format est un json, voici un exemple d'alerte:

{
       "creation_date":1465590469000,
        "alerts":[
                {
                        "id":1,
                        "category": "toxic",
                        "title": "Invasion de zombie",
                        "details" : {
                                "fr" : "Les Zombies arrivent",
                                "en" : "Zombies are coming"
                        },
                        "share_urls": {
                                "fr" : "http://perdu.com/",
                                "en" : "http://perdu.com/"
                        },
                        "area": { 
                                "type" : "circle", 
                                "radius" : 99999,
                                "center": 
                                        { 
                                                "lat": 48.8534 , 
                                                "lon" : 2.3488 
                                        }
                        },
                        "start_time" : 1465590469000,
                        "end_time" : 1497126469000,
                        "broadcast_time" : 1465590469000,
                        "status": "ongoing",
                        "severity": "alert",
                        "file_creation_date" : 1465590469000,
                        "version":  4,
                        "type": "ALERTE",
                        "department_codes" : [ 75 ],
                        "insee_codes" : [ 75101 ]
                }

        ]
}

UPDATE 15/07/16 : Voici le format certain d'une alerte , car l'application à malheuresement dû être utilisé : nice.json

Détaillons les champs et les valeurs que peuvent prendre ces champs:
Les dates correspondent au temps posix en millisecondes.
Pour "details" et "share_url" les langues sont (pour l'instant en tout cas) uniquement "fr" (français) et "en" (anglais). "share_url" correspond à l'url complète de partage sur les réseaux sociaux
area : ça semble être du geojson et il y a 2 possibilité :

  • "type" : "circle" et dans ce cas les autres valeurs sont "radius" et "center" (voir l'exemple ci-dessus)
  • "type" : "polygon" et dans ce cas l'autre valeur est "coordinates" exemple : "area": { "type":"Polygon", "coordinates":[ [ [2.3445591808,48.8539929027],[2.3328522826,48.8593063336],[2.3207813937,48.8630786563],[2.3257548096,48.8695460951],[2.3278774169,48.8698638097],[2.3508345055,48.8633443746],[2.3500884936,48.8619553322],[2.3445591808,48.8539929027] ] ] },

insee_codes : codes insee des communes où l'alerte sera affiché
department_codes : je ne sais pas..

nom valeur possible
category toxic, dam, nuclear, attempt, default
status ongoing , closed
severity alert
version un entier
type alert , text

On réinvente la roue ?

Certains on évoquer, à juste titre, que l'application redéfinie un standard qui existe déjà sur la téléphonie : la diffusion cellulaire . C'est clairement quelque chose qui devrait être utilise depuis longtemps, de plus ça remplie tous les critères et ça ne fonctionne pas que sur les smartphones mais, sur tous les téléphones portables (même le 3310).
Par contre, ça ne peut effectivement pas être utilisé pour une alerte terrorisme, car les fabricants de téléphone implémente cette alerte différemment et certains sonnent lors du déclenchement de cette alerte. (et un téléphone qui sonne lors d'un attentat/prise d'otage ce n'est pas bon)
D'autres points problématique ont été soulevés dans cet article : Intrusive, tardive, opaque : l’app d’urgence SAIP déjà critiquée

Comment j'ai analysé tout ça ? :

2 méthodes :
décompilation d'apk avec dex2jar.sh puis jd-gui
MiTM de l'api avec un dns menteur et une CA auto-signer..

PS : il y a un gros problème avec l'application quand même...je vous laisse réfléchir, relisez bien la dernière ligne...