imagine: Sascha Kohlmann , CC BY-SA 2.0
există sisteme pentru care simplii muritori nu au acces în mod implicit. Iar dezvoltatorii unor astfel de sisteme cred cu naivitate că sunt protejați de penetrare și de ochii dornici ai cercetătorilor.
luați cel puțin ATM-uri (ATM). Nu este neobișnuit ca persoanele necunoscute să se apropie de bancomate, să conecteze un laptop, să ia bani și să plece fără a lăsa niciun jurnal în sistem. Și poveștile recente cu „cotlete” (malware numit Cutlet Maker ) confirmă și mai mult că nu există sisteme invulnerabile – există unele sub-cercetate.
începeți cercetarea
există opinia că singura modalitate de a fura bani de la un bancomat este să ajungeți la un basculant, să ridicați un bancomat cu un cârlig și să-l rupeți cu mănuși, apoi să folosiți mașina de șlefuit, resturi și sudură cu gaz. Dar există o altă metodă.
după o scurtă căutare pe Ebay, am avut pe biroul meu o batistă de distribuitor NCR USB S1 cu firmware. Obiectivele au fost:
- găsiți o ocolire a criptării comenzilor trimise de computer prin USB către distribuitorul propriu-zis, în special pentru emiterea bancnotelor
- aflați cum să ocoliți necesitatea accesului fizic la seif pentru autentificare (jonglarea casetei) pentru a genera chei de criptare a Comenzii din paragraful anterior.
Firmware
firmware-ul este un fișier ELF pentru procesorul NXP ColdFire ( Motorola 68040 , procesorul meu preferat), care rulează pe VxWorks v5.5.1 .
în fișierul ELF de interes sunt două secțiuni principale – .text și .date :
- unul dintre ele conține un cod care transformă tot timpul principal (să-l numim firmware-ul principal) atunci când distribuitorul este conectat la unitatea de sistem din partea de sus a ATM-ului.
- în al doilea rând, codul bootloader este ambalat folosind zlib (numele său local este USB Secure Bootloader ), care este responsabil pentru încărcarea firmware-ului și rularea codului principal.
și cea mai bună parte este că există caractere netăiate în fișier – luați-l și căutați ceva interesant.
dispozitiv intern al firmware-ului principal
dacă împărțiți codul în componentele principale, obțineți următoarea schemă (în ordinea depunerii):
- un flux care se ocupă cu primirea pachetelor USB și distribuirea acestora între servicii.
- serviciile sunt unitățile performante de bază, fiecare dintre ele are propriul rol și fiecare are propriile sarcini (clase).
- clase – aici acestea sunt sarcini pe care un serviciu le poate efectua cu ajutorul controlorilor.
- controlorii sunt de fapt „muncitori” ( muncitori ) care sunt angajați în validarea sarcinilor care le sunt trimise, executarea lor și formarea pachetelor de răspuns.
deoarece există o mulțime de cod în firmware, sa decis să începeți prin căutarea tuturor serviciilor posibile și apoi să căutați unde sunt transferate sarcinile.
ca rezultat, s-au găsit următoarele servicii care trebuie doar să facă ceea ce caut:
1) DispTranService (serviciu de tranzacție Dispenser) : lucrul cu comenzi criptate, generarea de pachete de bancnote, autentificare. Puteți spune cel mai interesant – aici.
2) securityService: după autentificarea pe partea laterală a distribuitorului, este generată o cheie de sesiune, care este trimisă computerului în formă criptată la cererea computerului. Cu această cheie toate comenzile importante vor fi criptate-emiterea, formând un teanc de bancnote.
ulterior, un alt serviciu mi-a atras atenția: UsbDownloadService. Sarcina sa este de a conecta distribuitorul la computer și versiunea versiunii de firmware a distribuitorului care este stocată pe computerul ATM, pentru a merge la bootloader pentru a încărca firmware-ul cu care ar trebui să funcționeze sistemul de operare (se află în folderul cu software-ul furnizorului de pe computer). Acest serviciu este, de asemenea, capabil să ofere informații despre versiunea firmware-ului.
autentificarea fizică
autentificarea fizică este implementată la cel mai înalt nivel și protejează ATM-ul de a trimite pur și simplu comenzi USB pentru a emite fără autorizație. În acest caz, constă în faptul că numai cu un seif deschis cu bani trebuie să efectuați una dintre următoarele acțiuni:
- scoateți și introduceți caseta inferioară,
- comutați comutatorul de comutare de pe spatele raftului cu distribuitorul.
dar toate acestea sunt necesare numai dacă nivelul de acces este setat la maxim, adică fizic. Există trei dintre ele: USB (0), Logic (1) și fizic (2). Celelalte două sunt utilizate de furnizorii de servicii și dezvoltatori pentru depanarea și testarea firmware-ului. Ei bine, cel fizic este foarte recomandat de furnizor pentru utilizare în mod implicit.
vulnerabilitate
următoarele descriu o vulnerabilitate critică (deja stabilită de Furnizor la momentul publicării articolului), care, dacă există acces la zona de servicii, dar fără acces la seif (de exemplu, printr-o gaură făcută în panoul frontal ATM), execută orice comenzi ale distribuitorului, inclusiv numerar.
după cum sa dovedit, UsbDownloadService acceptă comenzi care nu necesită criptare. Sună tentant. Dar atunci totul este protejat în continuare, iar numele Secure Bootloader se va justifica?
(Spoiler: nu justifica!)
trebuie să mergem mai adânc
după cum sa menționat deja, în .secțiunea de date există un cod de bootloader ambalat, care de mult timp nu mi-a trezit interesul, iar colegii mei, când au examinat firmware-ul, nu i-au acordat atenție.
în timp ce prezența bootloader-ului era secretă, întrebarea a rămas deschisă: cum a umplut software-ul de pe computer firmware-ul? La urma urmei, nimic nu a fost găsit în firmware-ul principal.
deci, bootloader – ul este despachetat, încărcat în IDA la offset 0x100000-acum Puteți explora … Numai fără personaje!
nu contează: Compararea firmware – ului principal cu codul bootloader, citirea Fișei Tehnice a controlerului-și o anumită imagine începe să apară.
s-a dovedit că încărcarea firmware-ului, deși pare a fi protejată, nu este de fapt. Trebuie doar să știți cum să o umpleți corect.
s — a cheltuit destul de mult efort și timp pentru o înțelegere deplină a acestui proces (pentru mai multe detalii, consultați raportul ” Blackbox is dead-Long live Blackbox!”La conferința Black Hat 2018 Din Las Vegas). Care este costul lipirii memoriei NVRAM, încărcarea unei copii de rezervă pentru a „stropi” întregul controler … Mulțumesc unui coleg Alexey pentru răbdarea lui!
rezultatul a fost următorul algoritm pentru încărcarea firmware-ului în distribuitor:
1) generați o pereche de chei RSA și turnați cheia publică în controler.
2) scrie succesiv .date și .secțiuni de text de la ELF la adresele lor fizice din anteturile secțiunii.
3) Calculați SHA-1 din datele înregistrate, criptați hash-ul cu o cheie privată, trimiteți controlerului.
4) numărați și trimiteți suma tuturor cuvintelor firmware înregistrate.
după aceea, dacă totul este calculat și înregistrat cu succes, firmware-ul principal va fi descărcat.
s-a dovedit că la scrierea firmware-ului există o singură limitare: versiunea de firmware nu trebuie să fie mai mică decât cea actuală. Dar, la urma urmei, nimeni nu ne deranjează să înlocuim versiunea de firmware în datele sale în sine.
ca rezultat, firmware-ul meu special cu anti-securitate-remedieri a fost inundat și lansat cu succes!
în acest moment, codul firmware-ului principal a fost bine studiat, au fost găsite comenzi pentru emiterea bancnotelor. Acum pot fi trimise necriptate, iar distribuitorul le va executa fericit.
extrădarea
după tot ceea ce a fost experimentat în timpul cercetării (de exemplu, un adevărat ATM zakirpicheny ), rezultatul a fost atât de plăcut și compensând eforturile pe care algoritmul a vrut să le repete cu un alt furnizor major.
ATM real a început să whir și de bună voie în comun cu noi note clare proaspete (în acest caz, furnizor de „ambalaje de bomboane”). Nu a fost aplicată nicio magie: doar un laptop, un creier și un cablu USB.
constatări
încă o dată am fost convinși că, ghidat de principiul securității prin obscuritate , este imposibil să se asigure o protecție adecvată. Proprietatea unui cod sau a unui firmware nu înseamnă deloc că un atacator nu va avea acces la acesta la un moment dat și nu va profita de vulnerabilitățile găsite. Toate cele necesare pentru punerea în aplicare a obiectivelor egoiste pot fi dobândite în prezența unei anumite sume de bani.
dezvoltatorii ar trebui să se ocupe de cod, iar specialiștii în securitate ar trebui să-l protejeze. De aceea, cea mai productivă abordare pare a fi cooperarea cu companiile de securitate a informațiilor cu experiență suficientă în asigurarea securității diferitelor sisteme care vor contribui la construirea unei protecții adecvate în fiecare caz particular.
furnizorul PS a confirmat vulnerabilitatea (încălcarea a fost găsită și într – un alt model-S2), care a fost declarat astfel cum a fost modificat în remedierea din februarie a anului 2018.
lista CVE:
- CVE-2017 – 17668 (distribuitor NCR S1),
- CVE-2018-5717 (distribuitor NCR S2).
mulțumesc
înaintea mea, colegii mei, Dima Sklyarov și Misha Tsvetkov , lucrau deja la firmware (deși fără o placă de distribuire) . Realizările lor m-au ajutat foarte mult în studiu, pentru care le mulțumesc foarte mult! Din partea „fierului” Alexey Stennikov ma ajutat foarte mult .