Rappel

La première partie de cet article a présenté l’environnement CAN, la menace de l’injection de messages malicieux, et comment nous avons réussi à extraire la donnée nécessaire depuis les messages. Dans cette deuxième partie, nous allons utiliser cette donnée pour entraîner des modèles de Machine Learning en conditions normales, et essayer de détecter les attaques d’injection !

Exploration des variables

Un premier aperçu confirme notre intuition sur les interactions que peuvent présenter les variables physiques d’un véhicule. Par exemple, ci-dessous, une matrice où nous avons coloré les corrélations 2 à 2 d’une partie des variables extraites. La couleur rouge signifie une corrélation forte entre variables et à l’opposé le blanc dénote une absence de corrélation.

On peut voir d’importantes corrélations entre certaines variables. Par exemple, et comme attendu, la position de l’accélérateur (throttle) et la mesure de l’accélération (inline acceleration) sont des variables très corrélées. Nous avons également observé que ces corrélations sont stables au cours du temps.

Apprendre la “normalité”

Une manière d’apprendre la normalité d’un système est la suivante :

  • trouver une tâche,
  • entraîner un modèle pour réaliser cette tâche, avec pour entrée, une donnée normale,
  • surveiller la performance du modèle sur une donnée nouvelle,
  • considérer une performance faible sur la nouvelle donnée comme un signe d’anomalie.

Trouver une tâche peut s’avérer complexe. Un critère important est de trouver une tâche suffisamment difficile pour forcer le modèle à apprendre des concepts intéressants sur la donnée en entrée ; des concepts qui pourront être perturbés lors de la présence d’anomalies.

Un premier prototype d’algorithme pour prédire la vitesse de la voiture

Dans notre premier algorithme, la tâche que nous avons choisie est très concrète. Nous cherchons à prédire la vitesse du véhicule.

Nous avons entraîné un modèle de Deep Learning pour prédire la variable de vitesse à partir des autres valeurs de variables (plus précisément, depuis les valeurs passées des autres variables).

Dans notre cas, notre modèle a appris à prédire la vitesse courante de la voiture à partir des valeurs passées des RPM, accélérateur, angle de direction, etc.

Nous avons utilisé une architecture de réseau de neurone profond appelée LSTM (Long Short Term Memory) qui est très populaire et, surtout, très efficace pour “apprendre” sur une donnée séquentielle (comme dans notre cas).

Sur le graphique ci-dessous, vous pouvez voir notre “prédicteur” de vitesse en action sur une donnée nouvelle (un parcours différent qui n’a pas servi à l’entraînement). On peut voir en orange la prédiction et en bleu la “véritable” valeur telle que mesurée sur le bus CAN.

Il semble que l’information contenue dans les RPM et autres variables est suffisante pour prédire la valeur de vitesse avec une précision intéressante. Plus concrètement, on pourrait dire que la phase d’apprentissage du réseau de neurone a abouti à une formule mathématique capable de donner une valeur approximative de vitesse en fonction des RPM, accélérateur, et autres valeurs de variables.

Nous pouvons alors utiliser une métrique de performance sur cette tâche, et la surveiller pour détecter des anomalies. La plus simple est probablement l’erreur absolue entre la prédiction et la valeur réelle mesurée. On peut voir que notre prédicteur de vitesse parvient à prédire la vitesse réelle avec une erreur raisonnable (en rouge) ; la plupart du temps en dessous de 5 mph. Il faut noter que, dans ce projet, notre jeu de donnée était relativement petit (environ 3 heures de conduite). La prédiction devrait être nettement meilleure avec plus de donnée et davantage de variables extraites (quel rapport de vitesse, etc.).

Avec un tel système de détection, si un attaquant (comme celui que nous avons décrit) essaye d’injecter des valeurs faibles de vitesse à un moment où, en réalité, le véhicule se déplace à haute-vitesse, nous verrions une grande différence entre notre prédiction (non affectée par l’injection) et la valeur mesurée (manipulée par l’attaquant). Ci-dessous, une simulation d’une telle attaque (sur un jeu de donnée réel) où, comme attendu, nous pouvons voir un pic d’erreur lors de l’attaque : 

Un système de détection d’anomalie plus complet pourrait aussi prédire et surveiller les autres variables que la vitesse. Une prédiction pourrait être faite pour chaque variable présentant un intérêt et les erreurs de prédiction individuelles pourrait être surveillées afin de détecter des anomalies (nous y reviendrons).

Ce système de détection d’anomalie paraît plutôt robuste lorsqu’il s’agit de détecter la l’attaque dont nous avons parlé. Si un attaquant souhaite injecter furtivement une valeur de vitesse spécifique pour réaliser son attaque, il doit également manipuler toutes les variables avec lesquelles la vitesse est corrélée, et le faire :

  • en temps réel,
  • d’une manière “physiquement” cohérente (dans les limites de ce qu’a pu apprendre le modèle).

Aller plus loin, apprendre depuis la donnée brute

Une addition intéressante à ce projet a été la création d’un autre prototype de détection, assez prometteur, qui permet de s’affranchir de la phase manuelle de reverse-engineering (nécessaire pour extraire les valeurs intéressantes depuis les messages CAN).

Pour alimenter notre premier algorithme, nous avons besoin de savoir où et comment les variables sont stockées dans les messages et de les extraire. Cette étape demande d’importantes connaissances sur le domaine (spécificités des constructeurs/modèles) ou bien un travail minutieux et chronophage de reverse-engineering.

Cette fois-ci, nous avons créé un système de détection d’anomalie “générique” qui apprend depuis les octets (donnée brute) sans connaissance préalable sur où et comment les variables sont stockées.

A la place de prédicteur de variables, nous entraînons des prédicteurs d’octets.

Ci-dessus, un exemple avec la prédiction du second octet des messages de type CAN ID – 0F3 (transportant l’accélération). Nous avons alors un grand nombre de ces prédicteurs, et comme attendu, il n’est pas possible de tout prédire (certains octets restent imprévisibles).

Nous gardons alors uniquement les octets les plus intéressants, en se basant sur les performances individuelles de prédiction. Si la prédiction d’un octet est généralement bonne, surveiller son erreur devient particulièrement intéressant. En conséquence, nous associons à chaque octet un poids qui est inversement proportionnel à son erreur de prédiction habituelle (dans des conditions normales).

Pour créer un score consolidé d’anomalie, nous calculons la moyenne pondérée des erreurs de prédiction individuelles.

Ci-dessous, un exemple dans lequel nous montrons ce score d’anomalie sur différents jeux de donnée (4 parcours différents de 10 minutes). Dans le 4eme, nous avons simulé une injection où 3 octets choisis aléatoirement ont été manipulés (mis à leur minimum connu).

On peut voir que la prédiction est nettement moins bonne lors de l’attaque qu’habituellement. Voilà pour ce deuxième algorithme !

Conclusion et perspectives

Dans le cadre de ce projet, nous avons montré qu’il est possible d’apprendre la normalité d’un processus physique en identifiant les interactions entre des variables clefs, et en utilisant les déviations de ce modèle comme un indicateur pour détecter des attaques simples d’injection.

Nous avons également développé un prototype particulier de détection d’anomalie “générique” avec lequel nous apprenons depuis les octets bruts sans avoir à connaître les choix d’encodage des variables sur le réseau.

Depuis l’année dernière, nous avons continué à travailler sur le sujet afin, notamment d’appliquer ces idées dans le monde des ICS, IoT et réseaux plus traditionnels, en testant de nouvelles choses, et en adaptant certaines idées issues de ce projet.

Nous sommes convaincus que le suivi des variables via des algorithmes de Machine Learning est une voie intéressante pour protéger les systèmes cyber-physique comme les ICS/SCADA et nous sommes impatients de partager plus d’information à ce sujet.