loader

Kit cyber - Chapitre 11 : Injection de code malveillant

Second chapitre du parcours injection de code du kit cyber

Dans le chapitre précédent, la carte micro:bit serveur jouait le rôle de calculatrice à distance : elle recevait un texte contenant un calcul, l’exécutait, puis renvoyait le résultat. Tant que l’on envoie des messages « sages » comme 2+3 ou 4*(5+6), tout semble bien se passer.
Mais que se passe-t-il si, dans ce message, on ajoute autre chose qu’une simple opération ? Par exemple, un texte qui contient un calcul et une instruction supplémentaire pour la carte serveur : afficher une icône, modifier une variable, faire clignoter la matrice de LED…
Dans cette activité, nous allons justement observer cela : en ajoutant des instructions au message de calcul, la carte serveur obéit non seulement au calcul demandé, mais aussi aux ordres cachés dans le texte. Le message ne sert plus seulement à faire un calcul, il permet de prendre la main sur le programme à distance. Cela peut sembler amusant, mais si n’importe qui peut envoyer des instructions supplémentaires à un programme qui les exécute sans vérifier, jusqu’où peut-on aller ?

Il existe une fonction qui prend du texte et le transforme en instructions. Quand le texte se limite à une expression comme 2+3, tout va bien : le programme calcule le résultat et le renvoie.
En revanche, si le texte contient plusieurs instructions – par exemple un calcul plus une commande pour afficher quelque chose ou changer l’état de la carte – cette fonction va tout exécuter, sans se poser de questions.
Dans ce chapitre, nous allons donc envoyer à la carte serveur des messages qui contiennent à la fois un calcul (pour rester dans le scénario de la calculatrice) et des instructions supplémentaires qui modifient le comportement de la micro:bit. On parle alors d’injection de code malveillant. En théorie, ces instructions pourraient être inoffensives ; mais en pratique, ce type de faille est souvent utilisé pour récupérer des informations confidentielles ou pour détourner un programme afin de lancer d’autres attaques.

En reprenant le code du chapitre précédent, il va suffire d’ajouter des instructions supplémentaires pour passer d’un message honnête à malveillant.
Pour ajouter des instructions au message envoyé, il ne faut pas oublier que la chaîne de caractères doit respecter la syntaxe de Python : chaque instruction doit être séparée par un retour à la ligne et éventuellement des tabulations lors d’instructions imbriquées (conditions, boucles, etc.).

Bloc création d

Nous proposons d’ajouter dans le message une instruction qui affiche une icône de tête de mort sur la matrice de LED de la carte serveur, pour symboliser l’infection par du code malveillant. L’instruction Python correspondante est : display.show(Image.SKULL)
Tu peux bien sûr essayer d’autres actions (envoyer un autre message radio, piloter un actionneur, etc.), voire ajouter des boucles ou des conditions pour exécuter un petit programme sur la carte serveur. Attention toutefois : la taille d’un message radio est limitée.


Si tu es bloqué :
  • Assure-toi que tu construis ce texte avec le bloc créer le texte en mettant bien les trois morceaux séparés (calcul / saut de ligne / instruction)
  • Si rien ne se passe sur la carte serveur, vérifie que son programme est bien celui du chapitre 10 (avec exec("resultat = " + value)) et que les deux cartes sont sur le même canal radio.

Téléverse le programme du chapitre 10 sur la carte serveur, puis le nouveau programme sur la carte client, en vérifiant qu’elles partagent la même configuration radio. Au démarrage, la carte client envoie un calcul contenant aussi l’instruction d’affichage. Observe la carte serveur : elle doit calculer le résultat et afficher la tête de mort sur sa matrice de LED.
Modifie ensuite le message envoyé par la carte client (autre calcul, autre instruction d’affichage, par exemple une autre icône) et vérifie que tu parviens à changer à distance le comportement de la carte serveur uniquement en modifiant le texte du message.

Dans ce chapitre, nous avons transformé notre simple calculatrice à distance en un véritable laboratoire d’injection de code : en modifiant uniquement le message envoyé par la carte cliente, nous avons réussi à faire exécuter à la carte serveur non seulement un calcul, mais aussi des instructions cachées qui changent son comportement (comme l’affichage de la tête de mort sur la matrice de LED). Cela montre qu’un programme qui exécute directement le texte qu’il reçoit peut être manipulé très facilement.

Nous avons ainsi mis un mot sur ce phénomène : injection de code malveillant. Même si, en classe, nos instructions restent surtout ludiques, le même mécanisme peut, dans la réalité, servir à voler des informations, détourner un service ou préparer d’autres attaques. Notre micro:bit nous a permis d’observer, à petite échelle, pourquoi il est dangereux de faire aveuglément confiance aux données reçues. Dans la suite du parcours, nous verrons comment limiter ces risques en contrôlant mieux ce que l’on accepte d’exécuter.

Pour aller plus loin : 
  • Se renseigner sur des attaques comme l’injection SQL ou l’exécution de code à distance (RCE), qui exploitent exactement la même idée dans des sites web ou des applications en ligne.

Licence d'utilisation

Licence Creative Commons

Cette ressource est mise à disposition selon les termes de la Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 2.0 France