Image: Sascha Kohlmann , CC BY-SA 2.0Il 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 regards attentifs des chercheurs.
Prenez au moins des GAB (GAB). Il y a des cas fréquents où des inconnus viennent au guichet automatique, connectent un ordinateur portable, prennent de l'argent et partent sans laisser de journaux dans le système. Et des histoires récentes avec des "
côtelettes " (malware appelé
Cutlet Maker ) confirment qu'il n'y a pas de systèmes invulnérables - il y en a sous-explorés.
Début de l'étude
Il y a une opinion que la seule façon de voler de l'argent à un guichet automatique est de conduire sur un camion-benne, de ramasser un crochet au guichet automatique et de le déchirer, puis d'utiliser un broyeur, un pied de biche et une machine à souder au gaz. Mais il existe une autre méthode.
Après une courte recherche sur
Ebay , j'avais un
distributeur NCR USB S1 avec un firmware sur mon bureau. Les objectifs étaient les suivants:
- trouver un bypass pour crypter les commandes que l'ordinateur envoie via USB au distributeur lui-même, notamment pour l'émission des billets;
- Apprenez à contourner la nécessité d'un accès physique au coffre-fort pour l'authentification (secousse de cassette) pour générer des clés de chiffrement pour les commandes 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 , deux sections principales sont intéressantes -
.text et
.data :
- L'un d'eux contient un code qui tourne tout le temps (appelons-le firmware principal) lorsque le distributeur est connecté à l'unité centrale dans la partie supérieure de l'ATM.
- Le second est le code du chargeur de démarrage emballé avec zlib (son nom local est USB Secure Bootloader ), qui est responsable du téléchargement du firmware et du lancement du code principal.
Et la meilleure partie est que les symboles restent 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 des paquets USB et de leur distribution entre les services.
- Les services sont les principales unités d'exécution, chacune a son propre rôle et chacune a ses propres tâches (classes).
- Classes - voici les tâches qu'un service particulier peut effectuer avec l'aide de contrôleurs.
- Les contrôleurs sont en fait des « travailleurs » ( travailleurs ) qui sont impliqués dans la validation des tâches qui leur sont envoyées, leur mise en œuvre, ainsi que 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 chercher où les tâches sont transférées.
En conséquence, les services suivants ont été trouvés et devraient faire ce que je recherche:
1)
DispTranService (Dispenser Transaction Service) : travail avec des commandes cryptées, formation de liasses de billets, authentification. Vous pouvez dire que le plus intéressant est ici.

2)
securityService : après authentification, une clé de session est générée du côté du distributeur, qui, à la demande de l'ordinateur, lui est envoyée sous forme cryptée. Cette clé cryptera toutes les commandes importantes - émission, formation d'un paquet de billets de banque.

Par la suite, un autre service a attiré mon attention:
UsbDownloadService . Sa tâche est, lorsque le distributeur est connecté à l'ordinateur et que la version du micrologiciel du distributeur ne correspond pas à celle stockée sur l'ordinateur ATM, de basculer vers le
chargeur de
démarrage afin de télécharger le micrologiciel avec lequel le système d'exploitation devrait fonctionner (il se trouve dans le dossier contenant le logiciel du vendeur sur l'ordinateur). Ce service sait également 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 via USB à émettre sans autorisation. Dans ce cas, cela consiste dans le fait que seulement avec un coffre-fort ouvert avec de l'argent, vous devez effectuer l'une des opérations suivantes:
- retirer et insérer la cassette inférieure,
- basculez 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 réglé 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 déboguer et tester le firmware. Eh bien, le physique est fortement recommandé par le vendeur pour une utilisation par défaut.
Vulnérabilité
Ce qui suit décrit la vulnérabilité critique (déjà corrigée par le vendeur au moment de la publication de l'article), qui a permis d'exécuter toutes les commandes du distributeur, y compris le retrait d'espèces, s'il y avait accès à la zone de service, mais sans accès au coffre-fort (par exemple, à travers le trou pratiqué dans la face avant de l'ATM).
Il s'est avéré que
UsbDownloadService accepte des commandes qui ne nécessitent pas de chiffrement. Cela semble tentant. Mais soudain, tout est encore plus protégé, et le nom
Secure Bootloader sera payant?
(Spoiler: non justifié!)Nous devons aller plus loin
Comme déjà mentionné, dans la section
.data , il y a un code de chargeur compressé, qui pendant longtemps ne m'a pas intéressé, et mes collègues n'y ont pas prêté attention lorsqu'ils ont examiné le firmware.

Alors que le chargeur de démarrage était un mystère, la question est restée ouverte: comment le logiciel de l'ordinateur inonde-t-il le firmware? En effet, dans le firmware principal, rien de tel n'a été trouvé.
Ainsi, le
chargeur de démarrage est décompressé, chargé dans l'
IDA à l'offset
0x100000 - maintenant vous pouvez enquêter ... Seulement il n'y a pas de caractères!
Cela n'a pas d'importance: 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 protégé, ne l'est pas vraiment. Tout ce que vous devez savoir, c'est 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 is dead - Long live Blackbox! » Lors de la conférence Black Hat 2018 à Las Vegas). Pourquoi cela vaut-il la peine de souder la mémoire NVRAM, d'y télécharger une sauvegarde dans le but de "gratter" le contrôleur entier ...
Merci au collègue Alexei pour votre patience!
En conséquence, nous avons obtenu l'algorithme suivant pour télécharger le firmware sur le distributeur:
1) Générez une paire de clés RSA et remplissez la clé publique dans le contrôleur.

2) Écrivez séquentiellement les sections
.data et
.text d'
ELF dans leurs adresses physiques à partir des en-têtes de section.
3) Calculer SHA-1 à partir des données enregistrées, crypter le hachage avec une clé privée, envoyer au contrôleur.

4) Calculez et envoyez la somme de tous les mots enregistrés du firmware.

Après quoi, si tout est compté et enregistré avec succès, le firmware principal se chargera.
Il s'est avéré que lors de l'écriture du firmware, il n'y a qu'une seule limitation: la version du firmware ne doit pas être inférieure à la version actuelle. Mais personne ne nous empêche de changer la version du firmware dans ses données elles-mêmes.
En conséquence, mon firmware spécial avec des correctifs
anti-sécurité a été téléchargé et lancé avec succès!
À ce stade, le code principal du micrologiciel a été bien étudié, des commandes pour l'émission de billets ont été trouvées. Maintenant, ils peuvent être envoyés non cryptés et le distributeur les exécutera avec plaisir.

Problème
Après tout ce qui a été expérimenté au cours de l'étude (par exemple, un vrai guichet automatique «
maçonné »), le résultat était si agréable et compensait les efforts que je voulais répéter l'algorithme avec un autre grand fournisseur.

L'ATM le plus réel a commencé à bourdonner avec acharnement et à partager avec nous des billets frais et croustillants (dans ce cas, les «emballages de bonbons» du vendeur). Aucune magie n'a été appliquée: seulement un ordinateur portable, un cerveau et un cordon USB.
Conclusions
Une fois de plus, nous étions convaincus que, guidés par le principe de la
sécurité à travers l'obscurité , il est impossible de fournir une protection adéquate. La propriété du code ou du micrologiciel ne signifie nullement qu'à un moment précis, un attaquant n'y aura pas accès et ne tirera pas parti des vulnérabilités trouvées. Tout ce qui est nécessaire à la réalisation d'objectifs égoïstes peut être acquis en présence d'une certaine somme d'argent.
Les développeurs doivent gérer le code et les agents de sécurité doivent le protéger. C'est pourquoi l'approche la plus productive semble être la coopération avec des sociétés 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.
PS Vendor a confirmé la vulnérabilité (un écart a également été trouvé dans un autre modèle -
S2 ), qui a été déclaré corrigé dans le correctif de février 2018.
Liste CVE:
Remerciements
Avant moi, mes collègues -
Dima Sklyarov et
Misha Tsvetkov - avaient déjà travaillé sur le firmware (mais sans carte de distribution). Leurs réalisations m'ont beaucoup aidé dans l'étude, merci beaucoup à eux! Concernant le matériel,
Aleksei Stennikov m'a beaucoup aidé.