Plusieurs contrôleurs industriels (PLC) de la série Modicon de Schneider Electric sont affectés par une faille qui pourrait permettre aux pirates de contourner leur mécanisme d'authentification et d'exécuter du code malveillant. Ces PLC automatisent les processus industriels dans les usines, les services publics d'énergie, les systèmes CVC (chauffage, ventilation et climatisation) et d'autres installations. Selon les chercheurs de la société de sécurité Armis, qui ont découvert et signalé la vulnérabilité, les attaquants avec un accès réseau pourraient exploiter la faille pour installer des logiciels malveillants qui altèrent le fonctionnement des contrôleurs et masquent ces modifications malveillantes aux postes de travail et aux opérateurs qui les gèrent.
Des attaques contre des contrôleurs industriels ont déjà été observées par le passé via Stuxnet qui avait infecté les automates programmables Siemens utilisés pour contrôler les centrifugeuses d'enrichissement d'uranium de la centrale nucléaire iranienne de Natanz. Et avec le malware Triton, ce sont les contrôleurs de sécurité Triconex d'une usine pétrochimique en Arabie Saoudite qui avaient été touchés. Concernent les présentes failles, Schneider Electric est renseigné et a indiqué que ses modèles Modicon M580 et M340 étaient touchés.
Un contournement de l'authentification qui réactive les défauts passés
Le problème est causé par une commande non documentée dans le protocole utilisé par les postes de travail d'ingénierie pour communiquer avec les automates et y télécharger des programmes à exécuter. Ce protocole, connu sous le nom d'UMAS, est une extension du protocole Modbus conçu à l'origine en 1979 et largement utilisé pour contrôler les automates via des connexions série ou TCP/IP. UMAS implémente des fonctionnalités qui manquaient à Modbus, notamment les mises à jour du firmware, les transferts binaires et l'authentification. Les commandes UMAS qui peuvent modifier la configuration de l'automate ou du programme qui s'exécute dessus nécessitent une authentification. Ceci est réalisé grâce à un mécanisme de hachage du mot de passe couplé à un token d'authentification pour valider toute commande ultérieure. Ceci est similaire à la façon dont les sites web définissent un cookie de session dans le navigateur de l'utilisateur après une authentification et une validation de mot de passe réussies.
Le problème dans le cas des automates M340 et M580 et éventuellement d'autres, est de savoir comment le mot de passe est validé. Lorsqu'un nouveau projet est créé sur le poste de travail d'ingénierie, le logiciel EcoStruxure de Schneider Electric pousse l'utilisateur à créer un mot de passe d'application. Lorsque le fichier de projet est ensuite transféré vers l'automate pour la première fois, le mot de passe est également défini sur l'automate permettant l'authentification. Ensuite, lorsque le logiciel doit envoyer une commande nécessitant une authentification, l'utilisateur s'enregistre et le logiciel vérifie que le hachage du mot de passe correspond bien au hachage du mot de passe stocké sur l'automate.
Des lacunes de protection de mots de passe
L'année dernière, les chercheurs d'Armis ont cependant analysé le firmware des automates M340 et découvert une commande non documentée appelée pu_ReadPhysicalAddress qui ne nécessitait pas d'authentification. Cette commande permettait alors de lire toute la mémoire de l'automate, y compris le hachage du mot de passe. Identifié, ce problème de sécurité a été suivi en tant que CVE-2020-7537 et signalé à Schneider Electric en novembre 2020. Ce dernier l'a corrigé un mois plus tard via une mise à jour.
Les chercheurs ont ensuite analysé la manière dont le logiciel EcoStruxure valide le mot de passe saisi par l'utilisateur et ont examiné le trafic entre le logiciel et l'automate. Cela leur a permis de découvrir une autre commande non documentée appelée MemoryBlockRead, et utilisée dans une étape de pré-authentification. Plus précisément pour lire le hachage du mot de passe de l'automate et le comparer au hachage du mot de passe entré par l'utilisateur. Or l'existence de la commande MemoryBlockRead peut également conduire à un contournement d'authentification, un autre souci suivi en tant que CVE-2021-22779. « Inutile de dire que ce mécanisme est fondamentalement défectueux - le hachage du mot de passe est à la fois transmis via un protocole non crypté et peut également être lu par tout attaquant non authentifié qui implémente simplement la commande de lecture de bloc de mémoire », ont écrit les chercheurs dans un rapport. En clair, un attaquant sur le même réseau qu'un automate vulnérable peut utiliser cette commande pour lire le hachage du mot de passe dans la mémoire de l'automate, puis obtenir le jeton d'authentification permettant l'exécution d'une commande authentifiée.
Exécution de code à distance via des commandes désactivées
Par le passé, Schneider Electric avait déjà désactivé d'autres commandes UMAS non documentées qui pouvaient être utilisées de manière abusive pour effectuer des attaques par déni de service contre les automates Modicon. Deux de ces commandes étaient WritePhysicalAddress (code de fonction 0x29) et PrivateMessage (code de fonction 0x6D) et suivies à l'époque sous les noms CVE-2019-6829 et CVE-2018-7852. Le correctif de Schneider impliquait alors la désactivation complète des commandes lorsqu'un mot de passe d'application était défini sur un automate. Problème : selon les chercheurs d'Armis, ces deux commandes peuvent également conduire à l'exécution de code à distance (RCE) avec gain de privilèges système.
« Bien qu'il soit établi que cette commande peut conduire à un déni de service en modifiant la mémoire avec des données arbitraires, on ne sait pas pourquoi cette vulnérabilité n'a pas été classée comme exécution de code à distance », se sont demandé les chercheurs d'Armis à propos de WritePhysicalAddress dans leur dernier rapport. « La modification de la mémoire dans une adresse contrôlée par un attaquant avec une charge utile contrôlée par un attaquant est probablement le chemin d'exploitation le plus simple vers du RCE. De nombreux pointeurs de fonction, variables de pile ou pointeurs de table C++ résident dans la mémoire et peuvent être modifiés pour perturber leur exécution. L'utilisation de ceux-ci pour ensuite atteindre le code contrôlé par un attaquant peut être effectuée à l'aide de techniques return-oriented programming de type stack overflow. Un exploit similaire a été développé par les chercheurs d'Armis lorsqu'il a été démontré dans un livre blanc de décembre 2020 qu'un exploit utilisant l'URGENT/11 - un ensemble de vul affectant la pile TCP/IP de VxWorks, un OS installé dans plus de 2 milliards de terminaux - avait un impact sur les API Modicon.
Le correctif de Schneider Electric pour WritePhysicalAddress mais aussi PrivateMessage est incomplet car les commandes sont toujours accessibles lorsqu'aucun mot de passe d'application n'est défini sur l'automate, peut-être pour une compatibilité descendante avec des outils plus anciens qui ne prennent pas en charge la nouvelle fonctionnalité d'authentification UMAS. Le problème est que la nouvelle vulnérabilité CVE-2021-22779 trouvée par Armis permet aux attaquants non authentifiés de contourner l'authentification et leur permet ensuite de désactiver complètement l'authentification sur l'automate. Avec à la clé la possibilité d'exploiter des commandes WritePhysicalAddress et PrivateMessage pour exécuter du code arbitraire entraînant une prise de contrôle complète de l'appareil.
Un schéma d'attaque bien huilé
Les chercheurs d'Armis ont pu déterminer un schéma d'attaque possible pour : contournement de l'authentification via la CVE-2021-22779 et réservation de l'automate, téléchargement d'un nouveau fichier de projet sans mot de passe d'application, configuration puis libération de la réservation de l'automate et déconnexion. Enfin, en se reconnectant à l'automate avec la méthode de réservation de base, plus aucun mot de passe n'est alors nécessaire, débouchant sur de l'exécution de code en exploitant l'une des commandes non documentées WritePhysicalAddress, ou PrivateMessage. Cerise sur le gâteau comme étape ultime, le pirate peut utiliser le privilège RCE nouvellement acquis pour télécharger des logiciels malveillants sur l'API afin de la ramener à un état précédemment protégé par mot de passe, a expliqué Ben Seri, vice-président de la recherche d'Armis. Selon les chercheurs, cette chaîne d'attaque peut être automatisée et exécutée rapidement, réduisant ainsi considérablement les chances que quiconque la découvre. Le malware pourrait alors altérer le programme qui s'exécute dessus et renvoyer de fausses données au poste de travail d'ingénierie sans que personne s'en aperçoive.
Schneider Electric prévoit de publier des correctifs pour résoudre le contournement de l'authentification d'ici la fin de l'année. Le problème est que même si l'accès à la commande MemoryBlockRead est supprimé et que cette technique de contournement d'authentification est atténuée, le manque de chiffrement dans le protocole UMAS lui-même peut toujours être exploité en utilisant d'autres techniques. Par exemple, dans un scénario man in the middle (MitM), un attaquant peut être en mesure d'intercepter le trafic entre le poste de travail d'ingénierie et l'automate. Et ce, afin d'intercepter et extraire le jeton d'autorisation ou le forcer.
« Comme il n'y a actuellement aucun moyen pour le protocole de détecter une attaque MitM, le simple fait de transmettre les paquets d'authentification à l'API permettra à [un attaquant] d'obtenir un jeton de réservation dont il peut ensuite abuser pour exécuter l'un des les commandes non documentées qui peuvent être utilisées pour modifier la configuration de l'API, ou déclencher des commandes qui peuvent conduire au RCE », ont prévenu les chercheurs d'Armis. « La correction de ce contournement d'authentification MiTM nécessitera une connexion sécurisée entre le poste de travail d'ingénierie et l'API, capable à la fois de chiffrer la communication mais également d'authentifier les deux parties, en validant que la connexion ne passe pas par un MiTM ».
Commentaire