En 2019, nous avons trouvé un magasin sur Internet qui distribue des logiciels pour les machines industrielles lourdes. Nous avons téléchargé certaines de ces applications et les avons rétro-conçues pour comprendre leur fonctionnement. Leur code a été écrit dans l'un des langages de programmation propriétaires utilisés pour automatiser les robots industriels qui assemblent les voitures et emballent les aliments sur des convoyeurs. Une vulnérabilité a été découverte dans l'une de ces applications, ce qui a commencé nos recherches sur Rogue Automation: Vulnerable and Malicious Code in Industrial Programming .
Après avoir examiné les détails techniques et les faiblesses de huit des environnements de programmation industriels les plus populaires (ABB, Comau, Denso, Fanuc, Kawasaki, Kuka, Mitsubishi et Universal Robots), nous avons constaté que ces langages peuvent être utilisés pour créer des logiciels malveillants de vers qui passeront d'un robot vulnérable à un autre, obéissant aux commandes à distance de leurs opérateurs.
Les lacunes constatées sont le résultat d'un choix de conception effectué il y a plusieurs décennies. Ces solutions ont défini la technologie, les méthodes et les outils qui sont encore utilisés aujourd'hui pour la programmation des équipements industriels. Considérez les implications de ce choix dans le contexte des cybermenaces modernes.
Voler des données à un robot
Nous avons trouvé un cas réel de serveur Web vulnérable implémenté en tant qu'application à exécuter sur un robot industriel. Le serveur Web, écrit en ABB Rapid, contenait une vulnérabilité de traversée qui permettait à un attaquant de se connecter au robot via le réseau et de copier tous les fichiers du contrôleur de robot, y compris les journaux. Ces fichiers contiennent très probablement diverses données confidentielles et savoir-faire, de sorte qu'ils peuvent être vendus de manière rentable sur les marchés souterrains.
Si un attaquant parvient à pirater un ordinateur sur le même réseau que le robot, il pourra se connecter au serveur Web du contrôleur déguisé en agent, demander un fichier d'intérêt et le récupérer sans autorisation, car le programme répond à toutes les demandes de l'agent.
Un fragment du code d'application vulnérable. Source (ci-après, sauf indication contraire): Trend Micro
Line 493 appelle la fonction sendFile pour envoyer le fichier demandé au client. La chaîne pageString n'est filtrée d'aucune façon, elle peut donc contenir "... /" ou un autre chemin. Cela vous permet de parcourir le système de fichiers et de télécharger presque tous les fichiers.
Schéma d'exploitation des vulnérabilités Le
commentaire laissé par le développeur du serveur Web vulnérable dans le code est remarquable dans ce cas. Il savait que le code qu'il avait écrit était vulnérable, mais n'a rien fait pour résoudre le problème, car il supposait que toutes les requêtes proviendraient du navigateur "correct", ce qui validerait les données d'entrée et n'autoriserait pas une chaîne comme ".. . \\ ... \\ ":
,
L'exploitation de certaines vulnérabilités peut avoir des conséquences dans le monde physique, par exemple nuire aux produits finis ou même aux personnes qui les entourent.
Dans le projet open-source pour les robots industriels Kuka, nous avons découvert une vulnérabilité qui permet de modifier la trajectoire d'une pièce en mouvement. Le programme reçoit un flux de coordonnées sur le réseau et les transfère à l'actionneur, qui effectue les mouvements spécifiés. Pour cela, une classe spéciale de procédures est utilisée - les serveurs d'automatisation de mouvement. Il s'agit d'une interface standard qui permet aux OEM de robots industriels de fournir un moyen cohérent de contrôler le mouvement de leurs produits.
Le code vulnérable du serveur d'automatisation du trafic ne contient aucun contrôle de la légitimité des données qui lui sont transférées
Le code du serveur ne vérifie en aucun cas la provenance de la partie suivante des coordonnées du mouvement du robot; il ne prévoit pas d'authentification interne. La seule défense est de vérifier l'adresse MAC et l'adresse IP de l'expéditeur, qui peuvent être facilement usurpées par un intrus qui a pénétré le réseau.
Sur notre banc de laboratoire, nous nous sommes assurés qu'en utilisant le spoofing, il est possible de falsifier le trafic entre un robot et un poste de travail d'ingénierie. Un attaquant pouvait envoyer des coordonnées arbitraires, et le robot les exécutait simplement, ce qui dans une production réelle conduirait à un accident.
En injectant des paquets réseau avec des coordonnées incorrectes dans le trafic, nous avons pu pousser le manipulateur hors de la zone de sécurité plusieurs fois et frapper l'objet physique avec la «main» du robot. En conséquence, le "bras" avec lequel le robot ramasse des objets est tombé: Le bras tombé
du robot est le résultat de l'introduction de coordonnées dangereuses dans la circulation
Malware dynamique
Ce type d'attaque suppose que le robot exécute un programme écrit par un intégrateur système réputé fiable. En réalité, tout programme créé par un intégrateur est considéré comme fiable et déployé sans contrôle de sécurité du code.
En compromettant un intégrateur ou en remplaçant un programme dans un stockage réseau vulnérable, vous pouvez injecter de manière invisible du code malveillant dans un réseau d'entreprise: ajoutez un chargeur de démarrage qui télécharge le module dont l'attaquant a besoin et l'exécute dans le cadre d'un cycle de production standard.
Téléchargeur de logiciels malveillants écrit dans un langage de programmation pour les robots industriels
Pour tester ce concept, nous avons écrit un compte-gouttes dans un langage de programmation pour robots industriels et nous nous sommes assurés qu'un programme externe peut être utilisé pour charger le code dans la commande du robot et l'exécuter. Une fois contrôlé, un tel programme peut effectuer d'autres actions malveillantes en collectant des informations sur l'infrastructure réseau, en volant des fichiers et des informations d'identification.
Vulnérabilité RCE inhabituelle
L'une de nos découvertes était un programme tout à fait respectable qui lance des fonctions d'exécution dont les noms sont reçus sur le réseau. Pour les exécuter, il utilise le chargement de code dynamique, mais il ne s'intéresse pas à ce qu'il lance exactement: le programme ne prévoit pas de vérification de l'intégrité des bibliothèques chargées.
Logique vulnérable d'une application "respectable"
Fragment de code qui implémente une logique vulnérable.
Bien que le programme lui-mĂŞme ne contienne pas de fonctions malveillantes, un attaquant peut l'utiliser pour Ă©mettre des commandes au robot au bon moment, affectant le monde physique.
Couronne de création - Ver malveillant
Pour démontrer la gravité des problèmes détectés, nous avons développé un programme avec la fonction d'auto-propagation et de mise à jour automatique, le chargement dynamique du code depuis le serveur de contrôle et la possibilité de le contrôler à distance. Le programme d'analyse peut également effectuer une analyse du réseau, transférer des fichiers arbitraires vers le serveur de commande et de contrôle, maintenir une liste de périphériques infectés et agir comme un robot.
La logique du programme PoC qui simule le travail d'un vrai malware
Formation d'une liste de fichiers trouvés et envoi vers le serveur de contrôle
Source de problèmes
Après avoir analysé huit langages de programmation populaires pour l'automatisation industrielle développés au cours des dernières décennies, nous sommes arrivés à la conclusion que la principale raison des vulnérabilités identifiées et potentielles est que ces langages contiennent des moyens d'accès de bas niveau aux ressources système. Bien que ces outils ne soient pas dangereux en eux-mêmes, les attaquants peuvent les utiliser à d'autres fins que celles pour lesquelles ils ont été conçus, affectant de manière critique la sécurité du robot, de son opérateur et des systèmes connectés. Par exemple, ils peuvent être utilisés pour déplacer le manipulateur vers le haut, soulever la pièce, abaisser le manipulateur et libérer la pièce.
Ce riche ensemble de fonctions sophistiquées donne aux ingénieurs de procédés la liberté de développer des applications dans lesquelles ils peuvent récupérer des données du réseau, lire et écrire des fichiers. Cependant, comme les plates-formes ne fournissent pas un accès sécurisé à ces fonctionnalités avancées, les attaquants peuvent les utiliser pour écrire des modules malveillants.
Un autre problème avec les langages obsolètes pour l'automatisation industrielle (Industrial Robots Programming Language, IRPL), hérité avec l'équipement, est qu'ils ne disposent pas d'outils pour vérifier le code pour les modèles non sécurisés, similaires aux outils pour C, C ++, C #, Java. PHP et Python.
Chaque OEM crée ses propres langages et environnement dans lesquels les programmes cibles seront exécutés. Certains d'entre eux sont basés sur des systèmes d'exploitation temps réel (RTOS), mais dans l'ensemble, il n'y a pas de standardisation. La sémantique de chaque IRPL est également unique et peut différer considérablement de la sémantique des langages de programmation à usage général. Certaines fonctionnalités, telles que la manipulation de chaînes ou les opérations cryptographiques, sont soit absentes de l'IRPL, soit moins avancées que dans les langages traditionnels.
Les principales sources de vulnérabilités dans les programmes écrits en IRPL sont trois fonctions principales:
- travailler avec des fichiers et des répertoires,
- charger dynamiquement les modules et appeler les fonctions par nom,
- fonctions de réseau - réception et transmission de données vers des systèmes externes.
Fonctions dangereuses disponibles dans IRPL
Comment se protéger
Comme pour toute application logicielle qui traite des données non fiables, les systèmes d'automatisation industrielle doivent être conçus, implémentés, configurés et déployés avec des mécanismes de sécurité appropriés.
Recommandations consolidées pour garantir la sécurité des programmes pour l'automatisation industrielle
Par conséquent, lors de l'écriture de tels programmes, vous devez être guidé par les principes suivants:
- Considérez les robots industriels comme des ordinateurs et leurs applications comme un code extrêmement critique;
- authentifier toutes les communications;
- mettre en œuvre des politiques de contrôle d'accès;
- mettre en œuvre la validation d'entrée le cas échéant;
- assurer une désinfection continue de la sortie;
- Lors de la gestion des erreurs, n'exposez pas de détails techniques inutiles;
- créer les configurations et les procédures de déploiement correctes;
- Mettre en Ĺ“uvre des processus de gestion du changement pour le code d'automatisation industrielle.
Vieux ou intelligent?
Alors que les développeurs de logiciels traditionnels luttent contre les conséquences d'une programmation non sécurisée depuis des décennies et développent diverses techniques pour assurer la victoire, le monde de l'automatisation industrielle s'est avéré peu préparé pour détecter et prévenir l'exploitation des vulnérabilités.
Compte tenu du rythme de la convergence IT / OT, ​​il est impératif de mettre en œuvre en priorité des méthodes de développement de code sécurisé dans l'industrie de l'automatisation industrielle. Sinon, les prochaines années pourraient nous apporter de nombreux rapports d'incidents dans l'industrie, et les conséquences de ces incidents se manifesteront non seulement dans le cyberespace, mais aussi dans le monde physique.