Cela fait un long moment que j’ai envie de remettre les pieds dans les attaques physiques sur les microcontrôleurs et les cartes à puce. J’avais vaguement vu ces notions en cours dans mon cursus d’ingénieur, mais il ne m’en reste que quelques souvenirs et je n’avais pas suffisamment de bagage (ni l’envie de m’y plonger réellement) à l’époque.
Sauf que c’est un domaine qui me semble à la fois utile et manié par les grands sorciers de la cybersécurité. Ça me donne envie d’y plonger.
Le ChipWhisperer permet de pratiquer deux familles d’attaques physiques :
Analyse de canaux auxiliaires (side-channel) : on observe ce que le composant laisse fuir pendant son exécution — consommation de courant, rayonnement électromagnétique — pour en déduire des secrets comme une clé cryptographique, sans jamais toucher au code.
Injection de fautes (fault injection) : on perturbe volontairement le composant pendant son exécution — en glitchant l’alimentation ou l’horloge — pour le faire sauter des instructions ou prendre de mauvaises décisions.
C’est pourquoi j’ai acheté un kit ChipWhisperer-Husky. C’est du matériel qui commence à coûter un peu cher, mais je pourrai le réutiliser dans un cadre professionnel plus tard. Le kit est composé de :
un module ChipWhisperer-Husky ;
une baseboard CW313 à brancher sur la carte cible ;
un microcontrôleur ATSAM4S2AA (une cible pour nos analyses et attaques).
Cet article couvre la mise en place de l’environnement : installation de la toolchain, configuration Linux et lancement des labs fournis par NewAE. L’analyse des traces et les attaques proprement dites (side-channel et injection de fautes) feront l’objet des articles suivants.
Partons à la découverte de ce kit.
Installation
Avant de pouvoir piloter le Husky, il faut préparer un peu la machine. Pas d’inquiétude : on procède par étapes, et chaque commande est expliquée. Les exemples ci-dessous sont donnés pour Fedora (commande dnf) ; sur une distribution à base de Debian/Ubuntu, remplacez simplement dnf install par apt install (les noms de paquets peuvent légèrement varier).
1. Installer les outils nécessaires
On commence par installer les outils dont on aura besoin : git pour récupérer le code, les compilateurs AVR et ARM pour construire le firmware des cibles, et Python pour piloter le matériel.
On clone ensuite le dépôt officiel de NewAE (le fabricant) et on se place dans le dossier :
git clone https://github.com/newaetech/chipwhisperer
cd chipwhisperer
3. Créer un environnement Python isolé
Plutôt que d’installer la bibliothèque directement sur le système, on crée un environnement virtuel : un dossier autonome qui garde les dépendances du projet à l’écart du reste. Une fois activé, votre invite affiche (cwvenv) en début de ligne ; pour en sortir plus tard, tapez deactivate.
Sous Linux, un utilisateur normal n’a pas le droit d’accéder à un périphérique USB par défaut. Sans cette étape, le Husky sera bien branché mais la bibliothèque renverra une erreur de permission. On installe donc les règles udev fournies par NewAE, puis on ajoute notre utilisateur aux bons groupes :
sudo cp 50-newae.rules /etc/udev/rules.d/50-newae.rules
sudo udevadm control --reload-rules
sudo groupadd -fr chipwhisperer # les systemd récents exigent un compte système pour udev
sudo usermod -aG chipwhisperer $USER
sudo usermod -aG plugdev $USER
Les changements de groupe ne prennent effet qu’à la prochaine ouverture de session : déconnectez-vous puis reconnectez-vous (ou redémarrez), et débranchez/rebranchez le Husky.
5. Installer la bibliothèque et les notebooks
Enfin, on récupère les notebooks Jupyter (stockés dans un sous-module git séparé), puis on installe la bibliothèque chipwhisperer en mode « éditable » (-e, pratique si vous comptez bidouiller le code) ainsi que les dépendances des notebooks :
Veillez à utiliser ChipWhisperer ≥ 6.0.0. Avec une version plus ancienne
(la 5.6.1 par exemple), print(scope) plante sur le Husky avec
AttributeError: 'NoneType' object has no attribute 'clock' : un bug
d’affichage du composant trace/LA. La connexion fonctionne malgré tout, mais
autant prendre une version à jour. Si votre venv contient déjà une vieille
version, forcez la mise à jour :
python -m pip install --upgrade chipwhisperer
Notez que ChipWhisperer 6.0.0 épingle numpy<=1.26.4. Si pandas est présent
dans le même environnement, pip signalera un conflit de dépendances :
rétrogradez-le (pip install 'pandas<2.3') ou gardez un venv dédié à
ChipWhisperer.
À ce stade, tout est en place : le matériel est reconnu et la bibliothèque est prête à l’emploi.
6. Lancer le serveur Jupyter
Jupyter, c’est quoi ? C’est un outil qui permet d’écrire et d’exécuter du code Python directement dans le navigateur, sous forme de notebooks : des documents qui alternent du texte explicatif et des « cellules » de code que l’on lance une par une, en voyant le résultat (texte, courbes, graphiques) s’afficher juste en dessous. C’est l’environnement idéal pour expérimenter pas à pas, et c’est précisément ce que NewAE fournit pour apprendre à se servir du ChipWhisperer : une série de notebooks pédagogiques prêts à l’emploi.
Il ne reste plus qu’à démarrer l’environnement de notebooks. Depuis le dossier chipwhisperer, avec l’environnement virtuel activé :
jupyter notebook
Au démarrage, Jupyter affiche dans le terminal une URL contenant un token d’authentification, par exemple :
Ce token sert simplement à éviter que n’importe qui d’autre accède à votre serveur. Une page s’ouvre en général automatiquement dans le navigateur ; si ce n’est pas le cas, copiez-collez cette URL (token inclus) dans votre navigateur pour accéder aux ressources Jupyter.
Une fois la page ouverte, branchez le Husky, ouvrez le dossier jupyter et lancez le premier notebook de la série pour faire vos premières captures.
Vérifier que le Husky est bien détecté
Avant de se lancer dans quoi que ce soit de compliqué, on va faire un petit « hello world » : confirmer que la bibliothèque arrive bien à parler au matériel. C’est l’étape qui rassure et qui permet, en cas de souci, de savoir tout de suite si le problème vient du branchement plutôt que du reste.
Créez un nouveau notebook (ou utilisez une cellule vide), et exécutez ce code :
cw.scope() détecte automatiquement le ChipWhisperer branché en USB et ouvre la connexion. Si tout se passe bien, print(scope) affiche un résumé de l’état du Husky : son numéro de série, la version du firmware, la configuration de l’horloge, des entrées/sorties, etc.
Si vous obtenez plutôt une erreur :
No ChipWhisperer found : le Husky n’est pas vu du tout. Vérifiez le câble USB et que la carte est bien alimentée. La commande lsusb doit faire apparaître un périphérique NewAE.
erreur de permission (USB ... permission denied) : les règles udev de l’étape 4 ne sont pas (encore) actives. Assurez-vous de vous être reconnecté à votre session après les avoir installées, et d’avoir débranché/rebranché le Husky.
Quand vous en avez terminé, il est de bon ton de libérer le matériel pour qu’un autre notebook puisse le réutiliser :
scope.dis()
Une fois ce test passé, on sait que la chaîne logicielle et le matériel communiquent : on peut passer aux choses sérieuses.
Les labs NewAE
NewAE met à disposition une collection de notebooks pédagogiques sur GitHub, organisés en cours progressifs. C’est le point d’entrée officiel pour apprendre à se servir du ChipWhisperer, du montage matériel jusqu’à l’attaque.
Side-Channel Analysis 101 : analyse de consommation, attaques DPA/CPA
fault101/
Fault Injection 101 : glitch voltage et clock
sca201/ / fault201/
Niveaux avancés
Pour commencer, le lab sca101/Lab 2_1A est une bonne entrée en matière : il guide pas à pas sur une première attaque par analyse de puissance.
Adapter les variables à votre matériel
Chaque notebook démarre par un bloc de configuration où l’on déclare son matériel. Les labs utilisent souvent par défaut une CW-Lite avec cible STM32 ; il faut adapter pour le Husky avec la cible SAM4S :
SCOPETYPE='OPENADC'# OpenADC = Husky/Lite/Pro (opposé à 'CWNANO')PLATFORM='CW308_SAM4S'# cible SAM4S sur baseboard CW308/CW313
Les labs affichent parfois PLATFORM = 'CWLITEARM' en exemple : c’est la cible par défaut pour la CW-Lite. Pour notre Husky + SAM4S, utilisez CW308_SAM4S.
Un exemple de power analysis
Pour vérifier que tout fonctionne, on peut ouvrir le lab courses/sca101/Lab 2_1A - Instruction Power Differences (HARDWARE).ipynb. En l’adaptant aux variables de notre matériel, on obtient une première trace de consommation de la cible SAM4S :
La trace révèle déjà une structure : deux blocs d’activité distincts, séparés par une courte transition. Identifier ce qu’ils représentent, c’est précisément l’objet du prochain article.
Conclusion
La prise en main du kit et des outils ChipWhisperer est simple, et les cours fournis par NewAE semblent suffisamment complets pour débuter dans les attaques physiques. Le kit est excellent et se suffit à lui-même dans un cadre d’apprentissage.
Écrire du shellcode x64 Linux de zéro : syscalls, suppression des octets nuls, ouverture d'un shell et astuces pour l'exploitation en conditions réelles