Étude de cas : la sécurité du GSM



Les téléphones mobiles GSM communiquent avec des stations de base, reliées au réseau d'un opérateur. Chaque téléphone contient une carte à puce, la carte SIM (Subscriber identification Module). La puce est un microcontrôleur assez puissant (beaucoup plus que celui d'une carte bancaire) capable d'effectuer des calculs cryptographiques complexes.

La carte SIM contient une clé secrète de 128 bits, notée Ki. Elle se trouve dans un zone de la carte où il est impossible de la lire. Cette clé est aussi connue du réseau de l'opérateur.

Quand un téléphone demande à être authentifié par une station de base, la station lui envoie un entier aléatoire de 128 bits. La carte calcule un hachage de 32 bits de cet entier combiné avec sa clé secrète (algorithme A3) et le renvoie à la station, qui effectue le même calcul de son côté. Si les résultats coïncident, le téléphone est authentifié, et le même algorithme est de nouveau utilisé de part et d'autre pour calculer une clé de 64 bits (algorithme A8) qui servira à chiffrer la communication entre le mobile et la base. Les deux algorithmes sont implantés simultanément sous une forme appelée comp128.

Ces algorithmes n'étaient pas publics, ils ont été conçus par des sociétés privées d'une manière totalement opaque. Mais comme les constructeurs d'équipements GSM devaient y avoir accès, il ne faut pas s'étonner qu'une étude confidentielle décrivant une partie du code se soit un jour retrouvée sur un site de discussion dédié à la cryptographie. Il n'a pas fallu longtemps pour reconstituer le code complet par rétro-ingénierie, et pour découvrir une faille catastrophique.

On trouvera ici un exposé (en anglais) détaillant cette faille et la manière de l'attaquer. En résumé, les octets i et i+8 du résultat ne dépendent que des octets correspondants de la clé. On peut donc trouver des collisions en variant uniquement ces deux octets (au plus essais), et à partir d'un collision, on retrouve les octets correspondants de la clé en essayant des clés dont tous les octets sont à 0, sauf les deux cherchés.

Une traduction en Python du programme a3a8.c, avec un petit test de cette attaque, est disponible ici . On pourra l'améliorer pour qu'il soit plus rapide et qu'il indique le nombre de tests effectués pour reconstituer la clé. On pourra ensuite le traduire en C. Une étape intermédiaire pourra être d'appeler le programme C depuis Python (il faut pour cela le compiler sous forme d'une bibliothèque partagée, et utiliser le module ctypes, voir a3a8_C.py). Pour évaluer ses performances, on trouvera ici un exécutable windows (gracieusement fourni par un hacker anonyme, utiliser seulement sous Linux ou MacOS avec wine  !!!).

Cette attaque permettait de cloner des cartes SIM. La seule parade trouvée sur le moment a été de limiter à le nombre d'authentifications autorisées pour chaque carte (après, elle se bloque définitivement).

Il est instructif de faire quelques tests avec un lecteur de cartes à puce (il y en a sur la plupart des PC récents, en cas de besoin, l'université en possède quelques uns), une bibliothèque Python comme pyscard ou pycsc) et une carte SIM prépayée (de préférence périmée car ce traitement va certainement la détruire !). L'idéal serait de retrouver une carte de plus de dix ans pour compléter l'attaque. Avec une carte plus récente utilisant le même algorithme, limité à 65536 essais, on pourra tester une attaque améliorée, le programme simscan, diffusé à l'époque par un hacker qui se faisait appeler Dejan Kaljevic sous forme d'un exécutable windows (disponible ici, encore une fois, à n'utiliser que dans un bac à sable !!!).

D'après des tests effectués en 2004 (transparent 15 de l'exposé de Brumley), il semblerait que simscan puisse trouver la clé avec environ 20 000 essais. L'auteur du programme n'a jamais publié son algorithme (écrit directement en assembleur), mais le code a été désassemblé et analysé. Malheureusement, le seul document disponible est un article en chinois, qui semble décrire une amélioration du procédé de Kaljevic. Une traduction de cet article et une implémentation de l'algorithme qu'il propose seraient bienvenues.

L'algorithme A5 (utilisé pour le chiffrement des communications) possède aussi des failles. Voir ici pour une collection de liens sur la sécurité du GSM.