
Tout courant électrique émet un champ magnétique … dont celui qui alimente les processeurs. Cet article montre comment on peut, assez facilement, exploiter le champ magnétique émis par l’alimentation d’un processeur pour émettre des données. Ce canal caché a notamment été utilisé lors du CTF ph0wn pour un des challenges...
1. Une courte introduction aux champs magnétiques
Un champ magnétique est un espace autour d’un matériau magnétique ou d’une charge électrique en mouvement dans lequel une force magnétique agit. On utilise en général un ensemble de vecteurs pour représenter un champ magnétique : leur direction indique celle de la force magnétique, et leur longueur indique la force du champ présent à l’origine du vecteur.
Un peu de physique et d’histoire avant d’arriver à des aspects plus informatiques, reliés à ces champs magnétiques. La loi d'Ampère (ou Théorème d'Ampère) est un principe fondamental de l'électromagnétisme qui relie le champ magnétique circulant dans une boucle fermée au courant électrique passant par cette boucle. Formulée par André-Marie Ampère dans les années 1820, elle fournit un moyen de calculer le champ magnétique produit par un courant électrique.
L'intégrale de ligne du champ magnétique (B) autour de toute boucle fermée est égale à la perméabilité du vide (μ0) multipliée par l’intensité du courant électrique total (I) traversant la boucle. Mathématiquement, elle exprime ainsi :
Cette équation indique que le champ magnétique circulant autour d'un fil conducteur parcouru par un courant peut être déterminé par la quantité de courant dans le fil et la forme du chemin encerclant le fil et la forme du chemin encerclant le fil. Cette loi peut être appliquée dans le cas d’une bobine (dont une des applications très courantes est le moteur électrique), mais aussi à un fil électrique. Par exemple, le champ magnétique (B) à une distance (r) d'un conducteur droit long portant un courant (I) est donné par :
Cela montre que le champ magnétique autour d'un fil droit long diminue inversement avec la distance par rapport au fil (voir Fig. 1).
En informatique, les champs électromagnétiques ont de nombreuses applications, dont les bonnes vieilles bandes magnétiques, mais aussi les disquettes, les disques durs à plateaux, les premières RAM, etc.
2. Champs magnétiques émis par un ordinateur
Un processeur étant un ensemble de pistes traversées par des courants électriques, il émet donc, selon la loi d’Ampère, des champs magnétiques dont la force dépend de l’intensité, et de la consommation électrique. Cette consommation électrique d’un processeur dépend des calculs qu’il effectue.
Un processeur multicœur consommera d’autant plus d’énergies que son nombre de cœurs qui effectue des calculs est élevé. Ainsi, le champ magnétique émis par l’alimentation d’un processeur dépend des calculs que ce dernier effectue. Bien entendu, le processeur lui-même émet un champ magnétique, mais il est probable que sa composante résultante soit plus ou moins nulle, car ses lignes électriques se dirigent dans tous les sens. Alors qu’en ce qui concerne son alimentation elle-même, la résultante est non nulle puisque du courant circule de la source (l’alimentation du PC vers le processeur). Aussi, un processeur consomme d’autant plus d’énergie que ses lignes électriques sont utilisées. Notamment, chaque cœur de calcul consommant de l’énergie dépendant des calculs qu’il effectue, plus des cœurs sont utilisés en parallèle, plus l’intensité d’alimentation du processeur est importante, et donc plus le champ magnétique sur la ligne d’alimentation du processeur est important. Ces champs magnétiques s’appliquent évidemment aussi à l’alimentation d’autres composants, notamment la mémoire, les SSD, les cartes graphiques, etc.
3. Mise en pratique
Cette section explique comment relever le champ magnétique de votre processeur : la technique utilisée a été proposée par [ODINI]. Cela fonctionne sur la plupart des ordinateurs portables sur lesquels nous avons essayé. Pour savoir si le champ magnétique mesuré correspond bien à celui du processeur, soit il faut connaître approximativement la ligne d’alimentation du processeur, soit on peut repérer cette ligne d’alimentation en variant l‘intensité des calculs et en identifiant un champ magnétique se modifiant selon l’intensité de ces calculs.
3.1 Mesure du champ
La plupart des téléphones mobiles proposent une application de type « boussole » qui utilise un capteur de champ magnétique. L’utilisation de la boussole est toutefois insuffisante : plusieurs applications mobiles, dont « Physics Toolbox » [Physics], permettent d’observer des valeurs numériques brutes mesurées par les capteurs d’un téléphone mobile, et notamment les valeurs mesurées par le capteur de champ magnétique. L’application Physics permet d’afficher ce champ magnétique en 3D, ainsi selon 3 axes x/y/z. Cette application permet en outre d’enregistrer des traces de l’évolution de ces valeurs en fonction du temps, et d’afficher les courbes correspondantes.
Une fois l’application lancée, « magnétomètre » sélectionné, il ne reste plus qu’à placer le téléphone mobile au-dessus du clavier (quelques centimètres maximums au-dessus) et de rechercher la position opportune permettant de mesurer le champ magnétique du processeur. Essayez de lancer des processus de calculs intensifs, puis de les arrêter, puis de les relancer, ainsi de suite : vous devriez voir des variations du champ magnétique si votre téléphone est bien placé.
3.2 Émettre un champ
À ce stade, j’imagine que vous avez presque tous essayé de mesurer le champ magnétique émis par votre ordinateur portable. Mais comment en tirer quelque chose ? Dans le cas général, pas grand-chose, cela va apparaître comme du bruit, mais difficile d’en déduire immédiatement ce que votre ordinateur fait : cela nécessite des analyses plus poussées. Certaines attaques par ces canaux cachées ont été montrées, y compris sur le champ magnétique émis par le processeur lui-même ou d’autres types d’attaques distantes [1].
Utilisons à présent le champ magnétique du processeur pour émettre volontairement des données vers un téléphone mobile. Comme ce champ magnétique dépend notamment du nombre de cœurs en cours de calcul, nous pouvons écrire un code C qui active « n » cœurs pour émettre un « 1 », n/2 (ou une autre valeur inférieure à « n ») cœurs pour un « 0 » et qui n’effectue aucun calcul pour avoir un motif entre symboles. Le code C suivant (qui est un extrait du code global, et simplifié pour la lisibilité) prend sur la ligne de commandes une chaîne de caractères, calcule son train binaire (ASCII) puis lance des calculs en fonction de ce train binaire. Le code complet est disponible ici [2]. L’idée est ainsi de lancer plus de threads de calculs pour le symbole « 1 » que pour le symbole « 0 », et aucun thread pour l’intersymbole. Ce code a fonctionné pour des architectures avec hyperthreading, ce qui veut dire que soit les threads ont été répartis sur des cœurs différents, soit la consommation d’énergie est de toute façon impactée si deux threads peuvent être exécutés sur le même cœur.
4. Challenge pour Ph0wn
Ph0wn est un CTF qui a lieu annuellement à Sophia-Antipolis. Ph0wn est un peu différent des autres CTF, dans la mesure où les challenges se font principalement sur des objets connectés divers, comme par exemple en novembre 2023 : une communication avec un (vrai !) satellite géostationnaire, un hydrabus (https://hydrabus.com/), etc. Dans tous les cas, le but est, comme pour les autres CTF, d’identifier un flag. Dans le cas de ce challenge, les participants sont informés que le flag commence par « ph » suivi d’un espace.
Le challenge appelé « Magnéto » est ainsi décrit aux utilisateurs : « Magneto has contaminated my computer with his Nokia 3120... but maybe he sent a magnetic message on it? Retrieve it, and become a real X-Pico! ».
Un ordinateur portable est en accès « libre » (photo), mais interdiction d’y toucher bien sûr :-) alors que faire ? Comme je viens de vous parler de champ magnétique, il s’agit évidemment d’exploiter le champ magnétique émis de l’ordinateur portable. Il faut donc repérer une zone particulière de l’ordinateur qui émet un champ magnétique notable et qui change au cours du temps, enregistrer ce champ, puis le décoder : là est le secret.
Pour résoudre le challenge, on a enregistré une trace en CSV à cinq colonnes : temps, magnétique-x, magnétique-y, magnétique-z et champ magnétique global « magnétique-xyz ». En observant les différentes valeurs, le champ magnétique en z est celui qui évolue avec des schémas répétitifs. En traçant sa courbe (voir Figure 3), on peut en déduire les intervalles de valeur de champ magnétique pour un « 1 », pour un « 0 » et pour un intersymbole.
Il ne reste plus qu’à écrire un code pour reconstruire la chaîne de caractères transmise. Pas de grandes difficultés si ce n’est que les pics hauts ou moyens ont une longueur un peu variable, et que certaines valeurs anormales doivent être exclues. Le code Java ci-dessous permet de réaliser ce décodage du champ magnétique en CSV. Les attributs statiques d’Analyzer comportent la valeur minimale du symbole 1 (ONE_MIN_VALUE), la valeur du symbole de séparation (SEPARATOR_MAX_VALUE), la durée de l’intersymbole (TIME_BETWEEN_2_VALUES), et le nombre minimal de valeurs de « 1 » que l’on doit avoir entre deux séparateurs pour choisir si cela est vraiment un « 1 » ou pas (MIN_NUMBER_OF_ONE). Par exemple, supposons que l’on soit en intersymbole. Avant d’avoir l’intersymbole suivant, on va compter le nombre de valeurs supérieures à ONE_MIN_VALUE. si ce nombre est supérieur à MIN_NUMBER_OF_ONE alors on sélectionne un « 1 », sinon un « 0 ». Puis on recommence après l’intersymbole suivant, etc.
En utilisant le code de décodage CSV fourni ainsi que la trace relevée, on obtenait finalement le string : « 744#99744422266663366# ».
Cela ne ressemble pas vraiment à un flag ?! Ah oui, on nous parlait en énoncé d’un Nokia 3120… Sans doute Magneto a-t-il envoyé un message de type SMS en utilisant le clavier numérique de son Nokia… Donc « 7 » veut dire « p », « 44 » veut dire h, etc. On en déduit le flag de ce challenge : ph xpicomen.
Conclusion
Nous attendons avec impatience vos différents codes pour communiquer entre votre ordinateur et votre téléphone à plus haut débit que notre code !
Remerciements
Tous mes remerciements vont à Philippe Jaillon (École des Mines de Saint-Étienne) qui m’a initié à ces canaux cachés, et à Axelle Apvrille (Fortinet) et Bastien Sultan (Télécom Paris) qui ont patiemment testé mon challenge.
Références
[ODINI] M. Guri, B. Zadov and Y. Elovici, "ODINI: Escaping Sensitive Data From Faraday-Caged, Air-Gapped Computers via Magnetic Fields," in IEEE Transactions on Information Forensics and Security, vol. 15, pp. 1190-1203, 2020, doi: 10.1109/TIFS.2019.2938404
[Physics] Physics Toolbox, application mobile. Android :
https://play.google.com/store/apps/details?id=com.chrystianvieyra.physicstoolboxsuite
[1] Genkin D, Pipman I, Tromer E (2015). "Get your hands off my laptop: Physical side-channel key-extraction attacks on PCs". Journal of Cryptographic Engineering. 5 (2): 95–112. doi:10.1007/s13389-015-0100-7
[2] Code C pour transmission d’informations par champ magnétique :
https://perso.telecom-paristech.fr/apvrille/docs/magnetic.c