Bild: Sascha Kohlmann , CC BY-SA 2.0Es gibt Systeme, auf die bloße Sterbliche standardmäßig keinen Zugriff haben. Und die Entwickler solcher Systeme glauben naiv, dass sie vor dem Eindringen und den scharfen Augen von Forschern geschützt sind.
Nehmen Sie mindestens Geldautomaten. Es gibt häufige Fälle, in denen unbekannte Personen an einen Geldautomaten kommen, einen Laptop anschließen, Geld nehmen und gehen, ohne Protokolle im System zu hinterlassen. Und aktuelle Geschichten mit "
Schnitzel " (Malware namens
Cutlet Maker ) bestätigen, dass es keine unverwundbaren Systeme gibt - es gibt unterforschte.
Studienbeginn
Es gibt eine Meinung, dass die einzige Möglichkeit, Geld von einem Geldautomaten zu stehlen, darin besteht, auf einem Muldenkipper zu fahren, einen Haken am Geldautomaten aufzuheben und abzureißen und dann eine Mühle, eine Brechstange und ein Gasschweißgerät zu verwenden. Es gibt aber noch eine andere Methode.
Nach einer kurzen Suche bei
Ebay hatte ich einen
NCR USB S1 Dispenser mit einer Firmware auf meinem Schreibtisch. Die Ziele waren wie folgt:
- einen Bypass zum Verschlüsseln der Befehle finden, die der Computer über USB an den Spender selbst sendet, insbesondere zum Ausgeben von Banknoten;
- Erfahren Sie, wie Sie die Notwendigkeit eines physischen Zugriffs auf den Safe zur Authentifizierung (Kassetten-Ruckeln) umgehen können, um Verschlüsselungsschlüssel für Befehle aus dem vorherigen Absatz zu generieren.

Firmware
Die Firmware ist eine
ELF- Datei für den
NXP ColdFire- Prozessor (
Motorola 68040 , mein Lieblingsprozessor), der unter
VxWorks v5.5.1 ausgeführt wird .
In der
ELF- Datei sind zwei Hauptabschnitte von Interesse -
.text und
.data :
- Einer von ihnen enthält einen Code, der sich ständig dreht (nennen wir ihn Hauptfirmware), wenn der Spender an die Systemeinheit im oberen Teil des Geldautomaten angeschlossen ist.
- Der zweite ist der mit zlib gepackte Bootloader-Code (sein lokaler Name ist USB Secure Bootloader ), der für das Hochladen der Firmware und das Starten des Hauptcodes verantwortlich ist.
Und das Beste daran ist, dass die Symbole in der Datei ungeschnitten bleiben - nehmen Sie sie und suchen Sie nach etwas Interessantem.
Internes Gerät der Hauptfirmware
Wenn Sie den Code in Hauptkomponenten unterteilen, erhalten Sie das folgende Schema (in der Reihenfolge der Übermittlung):
- Ein Stream, der sich mit dem Empfangen und Verteilen von USB-Paketen auf Dienste befasst.
- Services sind die wichtigsten ausführenden Einheiten, jede von ihnen hat ihre eigene Rolle und jede hat ihre eigenen Aufgaben (Klassen).
- Klassen - hier sind dies Aufgaben, die ein bestimmter Dienst mithilfe von Controllern ausführen kann.
- Controller sind tatsächlich „ Arbeiter “ ( Arbeiter ), die an der Validierung der an sie gesendeten Aufgaben, ihrer Implementierung sowie der Bildung von Antwortpaketen beteiligt sind.

Da die Firmware viel Code enthält, wurde beschlossen, zunächst nach allen möglichen Diensten zu suchen und dann zu prüfen, wohin die Aufgaben übertragen werden.
Als Ergebnis wurden die folgenden Dienste gefunden, die genau das tun sollten, wonach ich suche:
1)
DispTranService (Dispenser Transaction Service) : Arbeiten mit verschlüsselten Befehlen, Bildung von Banknotenbündeln, Authentifizierung. Man kann sagen, das interessanteste ist hier.

2)
securityService : Nach der Authentifizierung wird auf der Seite des Spenders ein Sitzungsschlüssel generiert, der auf Anforderung des Computers verschlüsselt an diesen gesendet wird. Dieser Schlüssel verschlüsselt alle wichtigen Befehle - Ausgabe und bildet ein Bündel von Banknoten.

Anschließend fiel mir ein weiterer Dienst auf:
UsbDownloadService . Wenn der Spender an den Computer angeschlossen ist und die Firmware-Version des Spenders nicht mit der auf dem Geldautomaten gespeicherten übereinstimmt, wechseln Sie zum
Bootloader , um die Firmware hochzuladen, mit der das Betriebssystem arbeiten soll (sie befindet sich im Ordner mit der Software des Herstellers auf dem Computer). Dieser Dienst kann auch Informationen zur Firmware-Version bereitstellen.

Physische Authentifizierung
Die physische Authentifizierung wird auf höchster Ebene implementiert und schützt den Geldautomaten davor, einfach Befehle über USB zu senden, um sie ohne Autorisierung auszugeben. In diesem Fall besteht es darin, dass Sie nur mit einem offenen Safe mit Geld eine der folgenden Aktionen ausführen müssen:
- Entfernen Sie die untere Kassette und legen Sie sie ein.
- Schalten Sie den Kippschalter auf der Rückseite des Racks mit dem Spender.

All dies ist jedoch nur erforderlich, wenn die Zugriffsebene auf das Maximum eingestellt ist, dh physisch. Es gibt drei davon:
USB (0),
logisch (1) und
physisch (2). Die verbleibenden zwei werden von Dienstanbietern und Entwicklern zum Debuggen und Testen der Firmware verwendet. Nun, die physische wird vom Hersteller dringend für die standardmäßige Verwendung empfohlen.
Sicherheitslücke
Im Folgenden wird die kritische Sicherheitsanfälligkeit beschrieben (die vom Anbieter zum Zeitpunkt der Veröffentlichung des Artikels bereits behoben wurde), die es ermöglichte, alle Spenderbefehle, einschließlich Bargeldabhebungen, auszuführen, wenn Zugang zum Servicebereich bestand, jedoch ohne Zugang zum Safe (z. B. durch das Loch in der Frontplatte des Geldautomaten).
Wie sich herausstellte, akzeptiert
UsbDownloadService Befehle, die keine Verschlüsselung erfordern. Klingt verlockend. Aber plötzlich ist alles weiter geschützt und der Name
Secure Bootloader zahlt sich aus?
(Spoiler: nicht gerechtfertigt!)Wir müssen tiefer gehen
Wie bereits erwähnt, gibt es im Abschnitt
.data einen gepackten Loader-Code, der mich lange Zeit nicht interessiert hat, und meine Kollegen haben ihn bei der Prüfung der Firmware nicht beachtet.

Während der Bootloader ein Rätsel war, blieb die Frage offen: Wie überflutet die Software auf dem Computer die Firmware? In der Hauptfirmware wurde nichts dergleichen gefunden.
Der
Bootloader wird also entpackt und mit dem Offset
0x100000 in die
IDA geladen - jetzt können Sie nachforschen ... Nur gibt es keine Zeichen!
Es spielt keine Rolle: Vergleichen Sie die Hauptfirmware mit dem Bootloader-Code, lesen Sie das Datenblatt des Controllers - und es entsteht ein bestimmtes Bild.

Es stellte sich heraus, dass das Hochladen der Firmware, obwohl sie geschützt aussieht, nicht wirklich so ist. Alles, was Sie wissen müssen, ist, wie man es richtig ausfüllt.
Es wurde viel Mühe und Zeit aufgewendet, um diesen Prozess vollständig zu verstehen (weitere Informationen finden Sie im Bericht „
Blackbox ist tot - Es lebe die Blackbox! “ Auf der Black Hat 2018-Konferenz in Las Vegas). Warum lohnt es sich, den NVRAM-Speicher zu löten und ein Backup hochzuladen, um den gesamten Controller zu "kratzen" ...
Vielen Dank an Kollege Alexei für Ihre Geduld!
Als Ergebnis haben wir den folgenden Algorithmus zum Hochladen der Firmware auf den Spender erhalten:
1) Generieren Sie ein Paar RSA-Schlüssel und geben Sie den öffentlichen Schlüssel in die Steuerung ein.

2) Schreiben Sie nacheinander
.data- und
.text- Abschnitte von
ELF aus Abschnittsüberschriften an ihre physischen Adressen.
3) Berechnen Sie SHA-1 aus den aufgezeichneten Daten, verschlüsseln Sie den Hash mit einem privaten Schlüssel und senden Sie ihn an den Controller.

4) Berechnen und senden Sie die Summe aller aufgezeichneten Wörter der Firmware.

Wenn danach alles gezählt und erfolgreich aufgezeichnet wurde, wird die Hauptfirmware geladen.
Es stellte sich heraus, dass es beim Schreiben von Firmware nur eine Einschränkung gibt: Die Firmware-Version darf nicht niedriger als die aktuelle sein. Aber niemand hindert uns daran, die Firmware-Version in ihren Daten selbst zu ändern.
Als Ergebnis wurde meine spezielle Firmware mit
Anti-Sicherheitskorrekturen hochgeladen und erfolgreich gestartet!
Zu diesem Zeitpunkt war der Haupt-Firmware-Code gut untersucht, es wurden Befehle zur Ausgabe von Banknoten gefunden. Jetzt können sie unverschlüsselt gesendet werden, und der Spender führt sie gerne aus.

Problem
Nach allem, was während der Studie erlebt wurde (zum Beispiel ein „
vermauerter “ echter Geldautomat), war das Ergebnis so angenehm und kompensierte die Bemühungen, dass der Algorithmus mit einem anderen großen Anbieter wiederholt werden wollte.

Der realste Geldautomat begann gespannt und eifrig mit frischen, knusprigen Banknoten zu teilen (in diesem Fall "Bonbonverpackungen" des Anbieters). Es wurde keine Magie angewendet: nur ein Laptop, ein Gehirn und ein USB-Kabel.
Schlussfolgerungen
Wir waren erneut davon überzeugt, dass es nach dem Prinzip der
Sicherheit durch Dunkelheit unmöglich ist, einen angemessenen Schutz zu bieten. Die Richtigkeit des Codes oder der Firmware bedeutet keineswegs, dass ein Angreifer zu einem bestimmten Zeitpunkt keinen Zugriff darauf erhält und die gefundenen Sicherheitslücken nicht ausnutzt. Alles, was zur Verwirklichung egoistischer Ziele notwendig ist, kann in Gegenwart eines bestimmten Geldbetrags erworben werden.
Entwickler müssen mit dem Code umgehen, und Sicherheitspersonal sollte ihn schützen. Aus diesem Grund scheint der produktivste Ansatz die Zusammenarbeit mit Informationssicherheitsunternehmen zu sein, die über ausreichende Erfahrung bei der Gewährleistung der Sicherheit verschiedener Systeme verfügen, die jeweils zum Aufbau eines angemessenen Schutzes beitragen.
PS Vendor bestätigte die Sicherheitsanfälligkeit (eine Lücke wurde auch in einem anderen Modell gefunden -
S2 ), die im Februar-Fix von 2018 als behoben deklariert wurde.
CVE-Liste:
Danksagung
Vor mir hatten meine Kollegen -
Dima Sklyarov und
Misha Tsvetkov - bereits an der Firmware gearbeitet (allerdings ohne Spenderplatine). Ihre Erfolge haben mir in der Studie sehr geholfen, wofür ich ihnen vielmals danke! In Bezug auf die Hardware hat mir
Aleksei Stennikov sehr geholfen.