Image: Sascha Kohlmann, CC BY-SA 2.0
Il existe des systèmes auxquels les simples mortels n’ont pas accès par défaut. Et les développeurs de tels systèmes croient naïvement qu’ils sont protégés de la pénétration et des yeux attentifs des chercheurs.
Prenez au moins des guichets automatiques (ATM). Il n’est pas rare que des inconnus s’approchent des guichets automatiques, connectent un ordinateur portable, prennent de l’argent et partent sans laisser de journaux dans le système. Et les histoires récentes avec des « côtelettes » (logiciels malveillants appelés Cutlet Maker) confirment encore plus qu’il n’y a pas de systèmes invulnérables – il y en a sous-étudiés.
Commencer la recherche
Il existe une opinion selon laquelle le seul moyen de voler de l’argent à un guichet automatique est d’arriver à un camion à benne basculante, de ramasser un guichet automatique avec un crochet et de l’arracher avec des abats, puis d’utiliser la machine à souder, à la ferraille et au gaz. Mais il existe une autre méthode.
Après une brève recherche sur Ebay, j’avais sur mon bureau un mouchoir distributeur NCR USB S1 avec firmware. Les objectifs étaient:
- trouver un contournement du chiffrement des commandes envoyées par l’ordinateur via USB au distributeur lui-même, en particulier pour l’émission de billets de banque
- apprendre à contourner le besoin d’accès physique au coffre-fort pour l’authentification (jongler avec la cassette) pour générer des clés de chiffrement de commande à partir du paragraphe précédent.
Firmware
Le firmware est un fichier ELF pour le processeur NXP ColdFire (Motorola 68040, mon processeur préféré), fonctionnant sur VxWorks v5.5.1.
Dans le fichier ELF d’intérêt se trouvent deux sections principales -.texte et.données :
- L’un d’eux contient un code qui tourne tout le temps principal (appelons-le le firmware principal) lorsque le distributeur est connecté à l’unité centrale en haut de l’ATM.
- Dans le second, le code du chargeur de démarrage est emballé à l’aide de zlib (son nom local est USB Secure Bootloader), qui est responsable du téléchargement du firmware et de l’exécution du code principal.
Et la meilleure partie est qu’il y a des caractères non coupés dans le fichier – prenez-le et cherchez quelque chose d’intéressant.
Périphérique interne du firmware principal
Si vous divisez le code en composants principaux, vous obtenez le schéma suivant (dans l’ordre de soumission):
- Un flux qui traite de la réception de paquets USB et de leur distribution entre les services.
- Les services sont les unités performantes de base, chacune d’elles a son propre rôle et chacune a ses propres tâches (classes).
- Classes – ce sont ici des tâches qu’un service peut effectuer à l’aide de contrôleurs.
- Les contrôleurs sont en fait des « workers » (travailleurs) qui sont engagés dans la validation des tâches qui leur sont envoyées, leur exécution et la formation de paquets de réponse.
Comme il y a beaucoup de code dans le firmware, il a été décidé de commencer par rechercher tous les services possibles, puis de regarder où les tâches sont transférées.
En conséquence, les services suivants ont été trouvés qui n’ont qu’à faire ce que je recherche:
1) DispTranService (Service de transaction de distributeur) : travailler avec des commandes cryptées, générer des paquets de billets, authentification. Vous pouvez dire le plus intéressant – ici.
2) securityService: après authentification sur le côté du distributeur, une clé de session est générée, qui est envoyée à l’ordinateur sous forme cryptée à la demande de l’ordinateur. Avec cette clé, toutes les commandes importantes seront cryptées – émission, formant une pile de billets de banque.
Par la suite, un autre service a attiré mon attention: UsbDownloadService. Sa tâche consiste à connecter le distributeur à l’ordinateur et à la version de la version du micrologiciel du distributeur stockée sur l’ordinateur ATM, pour accéder au chargeur de démarrage afin de télécharger le micrologiciel avec lequel le système d’exploitation doit fonctionner (il se trouve dans le dossier avec le logiciel du fournisseur sur l’ordinateur). Ce service est également capable de donner des informations sur la version du firmware.
Authentification physique
L’authentification physique est implémentée au plus haut niveau et protège l’ATM de l’envoi simple de commandes USB à émettre sans autorisation. Dans ce cas, cela réside dans le fait que seulement avec un coffre-fort ouvert avec de l’argent, vous devez effectuer l’une des actions suivantes:
- retirez et insérez la cassette inférieure,
- allumez l’interrupteur à bascule à l’arrière du rack avec le distributeur.
Mais tout cela n’est requis que si le niveau d’accès est défini au maximum, c’est-à-dire physique. Il y en a trois: USB (0), logique (1) et physique (2). Les deux autres sont utilisés par les fournisseurs de services et les développeurs pour le débogage et le test du micrologiciel. Eh bien, le physique est fortement recommandé par le fournisseur pour une utilisation par défaut.
Vulnérabilité
Ce qui suit décrit une vulnérabilité critique (déjà corrigée par le vendeur au moment de la publication de l’article), qui, s’il y a accès à la zone de service, mais sans accès au coffre-fort (par exemple, à travers un trou pratiqué dans le panneau avant du guichet automatique), exécute toutes les commandes du distributeur, y compris les espèces.
Il s’est avéré que UsbDownloadService accepte les commandes qui ne nécessitent pas de cryptage. Ça a l’air tentant. Mais alors tout est protégé davantage, et le nom Secure Bootloader se justifiera?
(Spoiler : ne justifie pas !)
Nous devons aller plus loin
Comme déjà mentionné, dans le.section des données il y a un code de chargeur de démarrage emballé, qui pendant longtemps n’a pas suscité mon intérêt, et mes collègues, lorsqu’ils ont examiné le firmware, n’y ont pas prêté attention.
Alors que la présence du chargeur de démarrage était secrète, la question restait ouverte: comment le logiciel de l’ordinateur remplissait-il le firmware? Après tout, rien n’a été trouvé dans le firmware principal.
Ainsi, le chargeur de démarrage est décompressé, chargé dans IDA au décalage 0x100000 – vous pouvez maintenant explorer… Seulement pas de personnages!
Peu importe: comparer le firmware principal avec le code du chargeur de démarrage, lire la fiche technique du contrôleur – et une certaine image commence à émerger.
Il s’est avéré que le téléchargement du firmware, bien qu’il semble être protégé, ne l’est en fait pas. Juste besoin de savoir comment le remplir correctement.
Beaucoup d’efforts et de temps ont été consacrés à une compréhension complète de ce processus (pour plus de détails, voir le rapport « Blackbox est mort – Vive Blackbox! »Lors de la conférence Black Hat 2018 à Las Vegas). Quel est le coût de la soudure de la mémoire NVRAM, en y téléchargeant une sauvegarde afin de « saupoudrer » l’ensemble du contrôleur… Merci à un collègue Alexey pour sa patience!
Le résultat a été l’algorithme suivant pour télécharger le firmware sur le distributeur:
1) Générez une paire de clés RSA et versez la clé publique dans le contrôleur.
2) Écrivez successivement le.données et.sections de texte de l’ELF à leurs adresses physiques à partir des en-têtes de section.
3) Calculez SHA-1 à partir des données enregistrées, chiffrez le hachage avec une clé privée, envoyez-le au contrôleur.
4) Comptez et envoyez la somme de tous les mots du firmware enregistrés.
Après cela, si tout est calculé et enregistré avec succès, le firmware principal sera téléchargé.
Il s’est avéré que lors de l’écriture du micrologiciel, il n’y a qu’une seule limitation: la version du micrologiciel ne doit pas être inférieure à la version actuelle. Mais après tout, personne ne nous dérange de remplacer la version du firmware dans ses données elles-mêmes.
En conséquence, mon firmware spécial avec des correctifs d’antisécurité a été inondé et lancé avec succès!
À ce stade, le code du firmware principal a été bien étudié, des commandes d’émission de billets de banque ont été trouvées. Maintenant, ils peuvent être envoyés non cryptés, et le distributeur les exécutera avec plaisir.
Extradition
Après tout ce qui a été vécu au cours de la recherche (par exemple, un véritable ATM zakirpicheny), le résultat était si agréable et compensant les efforts que l’algorithme voulait répéter avec un autre fournisseur majeur.
Le vrai guichet automatique a commencé à vrombir et a volontiers partagé avec nous des notes fraîches et croustillantes (dans ce cas, des « emballages de bonbons » du vendeur). Aucune magie n’a été appliquée: seulement un ordinateur portable, un cerveau et un cordon USB.
résultats
Une fois de plus, nous étions convaincus que, guidés par le principe de la sécurité par l’obscurité, il est impossible d’assurer une protection adéquate. La propriété d’un code ou d’un firmware ne signifie pas du tout qu’un attaquant n’y aura pas accès à un moment donné et ne profitera pas des vulnérabilités trouvées. Tout le nécessaire pour la mise en œuvre d’objectifs égoïstes peut être acquis en présence d’une certaine somme d’argent.
Les développeurs doivent s’occuper du code et les spécialistes de la sécurité doivent le protéger. C’est pourquoi l’approche la plus productive semble être la coopération avec des entreprises de sécurité de l’information ayant une expérience suffisante pour assurer la sécurité de divers systèmes qui aideront à construire une protection adéquate dans chaque cas particulier.
Le fournisseur PS a confirmé la vulnérabilité (la violation a également été trouvée dans un autre modèle – S2), qui a été déclarée telle que modifiée dans le correctif de février de l’année 2018.
Liste CVE:
- CVE-2017-17668 (Distributeur NCR S1),
- CVE-2018-5717 (Distributeur NCR S2).
Merci
Avant moi, mes collègues, Dima Sklyarov et Misha Tsvetkov, travaillaient déjà sur le firmware (mais sans carte de distribution). Leurs réalisations m’ont beaucoup aidé dans l’étude, pour laquelle je les remercie beaucoup! De la part de « iron », Alexey Stennikov m’a beaucoup aidé.