Bild: Sascha Kohlmann , CC BY-SA 2.0
Es gibt Systeme, auf die Normalsterbliche standardmäßig keinen Zugriff haben. Und die Entwickler solcher Systeme glauben naiv, dass sie vor dem Eindringen und den scharfen Augen der Forscher geschützt sind.
Nehmen Sie mindestens Geldautomaten (ATM). Es ist nicht ungewöhnlich, dass Unbekannte sich Geldautomaten nähern, einen Laptop anschließen, Geld nehmen und gehen, ohne Protokolle im System zu hinterlassen. Und die jüngsten Geschichten mit “ Cutlets “ (Malware namens Cutlet Maker ) bestätigen noch mehr, dass es keine unverwundbaren Systeme gibt – es gibt zu wenig erforschte.

Forschung beginnen

Es gibt die Meinung, dass der einzige Weg, Geld von einem Geldautomaten zu stehlen, darin besteht, zu einem Muldenkipper zu gelangen, einen Geldautomaten mit einem Haken aufzunehmen und ihn mit Innereien herauszureißen und dann die Mühle, den Schrott und das Gasschweißgerät zu verwenden. Aber es gibt eine andere Methode.
Nach einer kurzen Suche bei Ebay hatte ich auf meinem Schreibtisch einen NCR USB S1 Spender Spender Taschentuch mit Firmware. Die Ziele waren:

  • Finden Sie eine Umgehung der Verschlüsselung von Befehlen, die vom Computer über USB an den Spender selbst gesendet werden, insbesondere zur Ausgabe von Banknoten
  • Erfahren Sie, wie Sie den physischen Zugriff auf den Safe für die Authentifizierung umgehen (Jonglieren mit der Kassette), um Befehlsverschlüsselungsschlüssel aus dem vorherigen Absatz zu generieren.

Firmware

Die Firmware ist eine ELF-Datei für den NXP ColdFire-Prozessor (Motorola 68040, mein Lieblingsprozessor), der auf VxWorks v5.5.1 läuft .

In der ELF-Datei von Interesse sind zwei Hauptabschnitte – .text und .daten :

  • Einer von ihnen enthält einen Code, der die gesamte Hauptzeit (nennen wir es die Hauptfirmware) dreht, wenn der Spender an die Systemeinheit oben am Geldautomaten angeschlossen ist.
  • Im zweiten Fall wird der Bootloader-Code mit zlib gepackt (sein lokaler Name ist USB Secure Bootloader ), das für das Hochladen der Firmware und das Ausführen des Hauptcodes verantwortlich ist.

Und das Beste daran ist, dass die Datei ungeschnittene Zeichen enthält – nehmen Sie sie und suchen Sie nach etwas Interessantem.

Internes Gerät der Hauptfirmware

Wenn Sie den Code in die Hauptkomponenten aufteilen, erhalten Sie das folgende Schema (in der Reihenfolge der Einreichung):

  1. Ein Stream, der sich mit dem Empfangen von USB-Paketen und deren Verteilung zwischen Diensten befasst.
  2. Dienste sind die grundlegenden Ausführungseinheiten, jede von ihnen hat ihre eigene Rolle und jede hat ihre eigenen Aufgaben (Klassen).
  3. Klassen – hier sind dies Aufgaben, die ein Dienst mit Hilfe von Controllern ausführen kann.
  4. Die Controller sind eigentlich “ Arbeiter “ ( Arbeiter ), die an der Validierung der an sie gesendeten Aufgaben, ihrer Ausführung und 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, wo die Aufgaben übertragen werden.
Als Ergebnis wurden die folgenden Dienste gefunden, die nur das tun müssen, wonach ich suche:
1) DispTranService (Dispenser Transaction Service) : arbeiten mit verschlüsselten Befehlen, Generieren von Banknotenbündeln, Authentifizierung. Sie können das Interessanteste sagen – hier.

2) securityService : Nach der Authentifizierung auf der Seite des Spenders wird ein Sitzungsschlüssel generiert, der auf Computeranforderung verschlüsselt an den Computer gesendet wird. Mit diesem Schlüssel werden alle wichtigen Befehle verschlüsselt – Ausgabe, Bildung eines Stapels von Banknoten.

Anschließend fiel mir ein weiterer Dienst auf: UsbDownloadService. Seine Aufgabe ist es, den Spender mit dem Computer und der Version der Firmware-Version des Spenders, die auf dem Geldautomaten-Computer gespeichert ist, zu verbinden, um zum Bootloader zu gehen, um die Firmware hochzuladen, mit der das Betriebssystem arbeiten soll (sie befindet sich im Ordner mit der Herstellersoftware auf dem Computer). Dieser Dienst kann auch Informationen zur Firmware-Version geben.

Physische Authentifizierung

Die physische Authentifizierung ist auf höchster Ebene implementiert und schützt den Geldautomaten davor, einfach USB-Befehle ohne Autorisierung zu senden. In diesem Fall liegt es daran, dass Sie nur mit einem offenen Safe mit Geld eine der folgenden Aktionen ausführen müssen:

  • entfernen und setzen Sie die untere Kassette 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 restlichen zwei werden von Dienstanbietern und Entwicklern zum Debuggen und Testen von Firmware verwendet. Nun, der physische wird vom Anbieter für die standardmäßige Verwendung dringend empfohlen.

Sicherheitsanfälligkeit

Im Folgenden wird eine kritische Sicherheitsanfälligkeit beschrieben (die vom Anbieter zum Zeitpunkt der Veröffentlichung des Artikels bereits behoben wurde), die bei Zugriff auf den Servicebereich, jedoch ohne Zugriff auf den Safe (z. B. durch ein Loch in der ATM-Frontplatte), alle Befehle des Spenders ausführt, einschließlich Bargeld.

Wie sich herausstellte, UsbDownloadService akzeptiert Befehle, die keine Verschlüsselung erfordern. Es klingt verlockend. Aber dann ist alles weiter geschützt, und der Name Secure Bootloader wird sich rechtfertigen?

(Spoiler: nicht rechtfertigen!)

Wir müssen tiefer gehen

Wie bereits erwähnt, in der .datenabschnitt Es gibt einen gepackten Bootloader-Code, der mein Interesse lange Zeit nicht geweckt hat, und meine Kollegen haben bei der Untersuchung der Firmware nicht darauf geachtet.

Während das Vorhandensein des Bootloaders geheim war, blieb die Frage offen: Wie hat die Software auf dem Computer die Firmware gefüllt? Immerhin wurde in der Hauptfirmware nichts gefunden.

Der Bootloader wird also entpackt und bei Offset 0x100000 in IDA geladen – jetzt können Sie erkunden … Nur keine Charaktere!
Es spielt keine Rolle: Vergleichen Sie die Hauptfirmware mit dem Bootloader-Code, lesen Sie das Datenblatt des Controllers – und ein bestimmtes Bild entsteht.

Es stellte sich heraus, dass die Firmware-Upload, obwohl es geschützt zu sein scheint, ist eigentlich nicht. Ich muss nur wissen, wie man es richtig fü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 Blackbox!“Auf der Black Hat 2018 Konferenz in Las Vegas). Was kostet es, den NVRAM-Speicher zu löten und ein Backup darauf hochzuladen, um den gesamten Controller zu „streuen“ … Danke an einen Kollegen Alexey für seine Geduld!
Das Ergebnis war der folgende Algorithmus zum Hochladen der Firmware auf den Spender:
1) Generieren Sie ein Paar RSA-Schlüssel und gießen Sie den öffentlichen Schlüssel in die Steuerung.

2) Schreiben Sie nacheinander die .daten und .textabschnitte von der ELF zu ihren physischen Adressen aus den Abschnittsüberschriften.

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) Zählen und senden Sie die Summe aller aufgezeichneten Firmware-Wörter.

Wenn danach alles erfolgreich berechnet und aufgezeichnet wurde, wird die Hauptfirmware heruntergeladen.
Es stellte sich heraus, dass es beim Schreiben von Firmware nur eine Einschränkung gibt: Die Firmware-Version sollte nicht niedriger als die aktuelle sein. Aber schließlich stört uns niemand, die Firmware-Version in ihren Daten selbst zu ersetzen.
Infolgedessen wurde meine spezielle Firmware mit Antisecurity -Fixes überflutet und erfolgreich gestartet!
Zu diesem Zeitpunkt wurde der Code der Hauptfirmware gut untersucht, Befehle zum Ausgeben von Banknoten wurden gefunden. Jetzt können sie unverschlüsselt gesendet werden, und der Spender wird sie gerne ausführen.

Auslieferung

Nach allem, was während der Forschung erfahren wurde (zum Beispiel ein echter Geldautomat zakirpicheny ), war das Ergebnis so angenehm und kompensiert die Bemühungen, dass der Algorithmus mit einem anderen großen Anbieter wiederholen wollte.

Der echte Geldautomat begann zu surren und teilte bereitwillig frische, knackige Noten mit uns (in diesem Fall „Bonbonpapier“). Es wurde keine Magie angewendet: nur ein Laptop, ein Gehirn und ein USB-Kabel.

Wir waren erneut davon überzeugt, dass es nach dem Prinzip der Sicherheit durch Dunkelheit unmöglich ist, einen angemessenen Schutz zu bieten. Die Angemessenheit eines Codes oder einer Firmware bedeutet keineswegs, dass ein Angreifer an einem Punkt keinen Zugriff darauf hat und die gefundenen Sicherheitslücken nicht ausnutzt. Alles, was für die Umsetzung egoistischer Ziele notwendig ist, kann in Gegenwart eines bestimmten Geldbetrags erworben werden.
Entwickler sollten sich mit dem Code befassen und Sicherheitsspezialisten sollten 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, um in jedem Einzelfall einen angemessenen Schutz zu gewährleisten.
Der Anbieter bestätigte die Sicherheitsanfälligkeit (der Verstoß wurde auch in einem anderen Modell gefunden – S2), die im Februar-Fix des 2018-Jahres als geändert deklariert wurde.
CVE-Liste:

  • CVE-2017-17668 (NCR S1 Spender),
  • CVE-2018-5717 (NCR S2 Spender).

Danke

Vor mir arbeiteten meine Kollegen Dima Sklyarov und Misha Tsvetkov bereits an der Firmware (allerdings ohne Spenderplatine) . Ihre Leistungen haben mir in der Studie sehr geholfen, wofür ich ihnen sehr danke! Seitens des „Eisens“ hat mir Alexey Stennikov sehr geholfen .

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.