Immagine: Sascha Kohlmann, CC BY-SA 2.0
Ci sono sistemi per i quali i comuni mortali non hanno accesso per impostazione predefinita. E gli sviluppatori di tali sistemi credono ingenuamente di essere protetti dalla penetrazione e dagli occhi acuti dei ricercatori.
Prendere almeno bancomat (ATM). Non è raro che persone sconosciute si avvicinino agli sportelli automatici, colleghino un laptop, prendano soldi e se ne vadano senza lasciare alcun registro nel sistema. E le storie recenti con “cotolette” (malware chiamato Cotoletta Maker ) confermano ancora di più che non ci sono sistemi invulnerabili – ci sono quelli sotto-ricercati.

Inizia la ricerca

Si ritiene che l’unico modo per rubare denaro da un bancomat sia arrivare a un autocarro con cassone ribaltabile, prendere un bancomat con un gancio e strapparlo con le frattaglie, quindi utilizzare la smerigliatrice, il rottame e la saldatrice a gas. Ma c’è un altro metodo.
Dopo una breve ricerca su Ebay, ho avuto sulla mia scrivania un NCR USB S1 Dispenser Dispenser fazzoletto con firmware. Gli obiettivi erano:

  • trova un bypass di crittografia dei comandi inviati dal computer tramite USB al distributore stesso, in particolare per l’emissione di banconote
  • scopri come bypassare la necessità di accesso fisico alla cassaforte per l’autenticazione (giocoleria della cassetta) per generare chiavi di crittografia dei comandi dal paragrafo precedente.

Firmware

Il firmware è un file ELF per il processore NXP ColdFire (Motorola 68040, il mio processore preferito), in esecuzione su VxWorks v5.5.1 .

Nel file ELF di interesse sono due sezioni principali -.testo e .dati :

  • Uno di questi contiene un codice che gira tutto il tempo principale (chiamiamolo il firmware principale) quando il distributore è collegato all’unità di sistema nella parte superiore dell’atm.
  • Nel secondo, il codice del bootloader viene imballato utilizzando zlib (il suo nome locale è USB Secure Bootloader ), che è responsabile del caricamento del firmware e dell’esecuzione del codice principale.

E la parte migliore è che ci sono caratteri non tagliati nel file – prendilo e cerca qualcosa di interessante.

Dispositivo interno del firmware principale

Se si divide il codice nei componenti principali, si ottiene il seguente schema (nell’ordine di invio):

  1. Un flusso che si occupa di ricevere pacchetti USB e distribuirli tra i servizi.
  2. I servizi sono le unità di esecuzione di base, ognuna di esse ha il proprio ruolo e ognuna ha i propri compiti (classi).
  3. Classi-qui queste sono attività che un servizio può eseguire con l’aiuto dei controller.
  4. I controllori sono in realtà “lavoratori” ( lavoratori ) che sono impegnati nella convalida delle attività inviate loro, nella loro esecuzione e nella formazione di pacchetti di risposta.


Poiché c’è molto codice nel firmware, è stato deciso di iniziare cercando tutti i servizi possibili e quindi guardare dove vengono trasferite le attività.
Di conseguenza, sono stati trovati i seguenti servizi che devono solo fare quello che sto cercando:
1) DispTranService (Servizio di transazione dispenser) : lavorare con comandi crittografati, generare fasci di banconote, autenticazione. Puoi dire il più interessante-qui.

2) securityService: dopo l’autenticazione sul lato del dispenser, viene generata una chiave di sessione, che viene inviata al computer in forma crittografata su richiesta del computer. Con questa chiave tutti i comandi importanti saranno crittografati-emissione, formando una pila di banconote.

Successivamente, un altro servizio ha attirato la mia attenzione: UsbDownloadService. Il suo compito è quello di collegare il distributore al computer e la versione della versione del firmware del distributore memorizzata sul computer ATM, per andare al bootloader per caricare il firmware con cui il sistema operativo dovrebbe funzionare (è nella cartella con il software del fornitore sul computer). Questo servizio è anche in grado di fornire informazioni sulla versione del firmware.

Autenticazione fisica

L’autenticazione fisica è implementata al più alto livello e protegge l’ATM dal semplice invio di comandi USB da emettere senza autorizzazione. In questo caso, sta nel fatto che solo con una cassaforte aperta con denaro è necessario eseguire una delle seguenti azioni:

  • rimuovere e inserire la cassetta inferiore,
  • accendere l’interruttore a levetta sul retro del rack con l’erogatore.


Ma tutto ciò è richiesto solo se il livello di accesso è impostato al massimo, cioè fisico. Ce ne sono tre: USB (0), logico (1) e fisico (2). I restanti due sono utilizzati da fornitori di servizi e sviluppatori per il debug e il test del firmware. Bene, quello fisico è altamente raccomandato dal venditore per l’uso predefinito.

Vulnerabilità

Quanto segue descrive una vulnerabilità critica (già fissata dal venditore al momento della pubblicazione dell’articolo), che, se vi è accesso all’area di servizio, ma senza accesso alla cassaforte (ad esempio, attraverso un foro realizzato nel pannello frontale ATM), esegue qualsiasi comando del distributore, incluso il contante.

Come si è scoperto, UsbDownloadService accetta comandi che non richiedono la crittografia. Sembra allettante. Ma poi tutto è protetto ulteriormente, e il nome Secure Bootloader si giustificherà?
(Spoiler: non giustificare!)

Abbiamo bisogno di andare più in profondità

Come già accennato, nel .sezione dati c’è un codice bootloader imballato, che per molto tempo non ha suscitato il mio interesse, ei miei colleghi, quando hanno esaminato il firmware, non hanno prestato attenzione ad esso.

Mentre la presenza del bootloader era segreta, la domanda rimaneva aperta: come ha fatto il software sul computer a riempire il firmware? Dopo tutto, non è stato trovato nulla nel firmware principale.

Quindi, il bootloader viene decompresso, caricato in IDA all’offset 0x100000-ora puoi esplorare … Solo nessun personaggio!
Non importa: confrontando il firmware principale con il codice del bootloader, leggendo la scheda tecnica del controller – e una certa immagine inizia ad emergere.

Si è scoperto che il caricamento del firmware, anche se sembra essere protetto, in realtà non lo è. Ho solo bisogno di sapere come riempirlo correttamente.
Sono stati spesi un sacco di sforzi e tempo per una piena comprensione di questo processo (per maggiori dettagli, vedere il rapporto ” Blackbox is dead — Long live Blackbox!”Alla conferenza Black Hat 2018 a Las Vegas). Qual è il costo della saldatura della memoria NVRAM, caricando un backup su di esso per “cospargere” l’intero controller … Grazie ad un collega Alexey per la sua pazienza!
Il risultato è stato il seguente algoritmo per caricare il firmware sul dispenser:
1) Generare una coppia di chiavi RSA e versare la chiave pubblica nel controller.

2) Scrivere successivamente il .dati e .sezioni di testo dall’ELF ai loro indirizzi fisici dalle intestazioni di sezione.

3) Calcola SHA-1 dai dati registrati, crittografa l’hash con una chiave privata, invia al controller.

4) Conta e invia la somma di tutte le parole del firmware registrate.

Successivamente, se tutto viene calcolato e registrato correttamente, verrà scaricato il firmware principale.
Si è scoperto che durante la scrittura del firmware c’è solo una limitazione: la versione del firmware non deve essere inferiore a quella corrente. Ma dopo tutto, nessuno ci preoccupa di sostituire la versione del firmware nei suoi dati stessi.
Di conseguenza, il mio firmware speciale con correzioni antisicurezza è stato inondato e lanciato con successo!
A questo punto, il codice del firmware principale era ben studiato, sono stati trovati comandi per l’emissione di banconote. Ora possono essere inviati in chiaro e il distributore li eseguirà felicemente.

Estradizione

Dopo tutto ciò che è stato sperimentato durante la ricerca (ad esempio, un vero BANCOMAT zakirpicheny ), il risultato è stato così piacevole e compensando gli sforzi che l’algoritmo voleva ripetere con un altro importante fornitore.

Il vero bancomat ha cominciato a ronzare e volentieri condiviso con noi note fresche e croccanti (in questo caso venditore “involucri di caramelle”). Nessuna magia è stata applicata: solo un laptop, un cervello e un cavo USB.

risultati

Ancora una volta eravamo convinti che, guidati dal principio della sicurezza attraverso l’oscurità , è impossibile fornire una protezione adeguata. La proprietà di un codice o firmware non significa affatto che un utente malintenzionato non avrà accesso ad esso ad un certo punto e non approfitterà delle vulnerabilità riscontrate. Tutto il necessario per l’attuazione di obiettivi egoistici può essere acquisito in presenza di una certa somma di denaro.
Gli sviluppatori dovrebbero occuparsi del codice e gli specialisti della sicurezza dovrebbero proteggerlo. Questo è il motivo per cui l’approccio più produttivo sembra essere la cooperazione con le società di sicurezza delle informazioni con sufficiente esperienza nel garantire la sicurezza di vari sistemi che aiuteranno a costruire una protezione adeguata in ogni caso particolare.
PS Vendor ha confermato la vulnerabilità (la violazione è stata trovata anche in un altro modello – S2), che è stata dichiarata come modificata nella correzione di febbraio dell’anno 2018th.
Elenco CVE:

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

Grazie

Prima di me, i miei colleghi, Dima Sklyarov e Misha Tsvetkov , stavano già lavorando al firmware (anche se senza una scheda dispenser) . I loro risultati mi hanno aiutato molto nello studio, per il quale li ringrazio tanto! Da parte di” iron ” Alexey Stennikov mi ha aiutato molto .

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.