bild: Sascha Kohlmann , CC BY-SA 2.0
det finns system för vilka vanliga dödliga inte har tillgång som standard. Och utvecklarna av sådana system tror naivt att de är skyddade mot penetration och forskarnas skarpa ögon.
ta minst bankomater (bankomat). Det är inte ovanligt att okända personer närmar sig bankomater, ansluter en bärbar dator, tar pengar och lämnar utan att lämna några loggar i systemet. Och de senaste berättelserna med ”cutlets” (malware kallad Cutlet Maker ) bekräftar ännu mer att det inte finns några oskadliga system – det finns underforskade.

börja forskning

det finns en åsikt att det enda sättet att stjäla pengar från en bankomat är att komma fram till en dumper, hämta en bankomat med en krok och riva ut den med giblets och använd sedan kvarnen, skrot och gassvetsmaskin. Men det finns en annan metod.
efter en kort sökning på Ebay hade jag på mitt skrivbord en NCR USB S1 Dispenser dispenser näsduk med firmware. Målen var:

  • hitta en bypass av kryptering av kommandon som skickas av datorn via USB till dispensern själv, särskilt för att utfärda sedlar
  • lär dig hur du kringgår behovet av fysisk åtkomst till säkerheten för autentisering (jonglering av kassetten) för att generera kommandokrypteringsnycklar från föregående stycke.

Firmware

firmware är en ELF-fil för NXP ColdFire-processorn ( Motorola 68040 , min favoritprocessor), som körs på VxWorks v5.5.1 .

i ELF-filen av intresse finns två huvudavsnitt -.text och .data :

  • en av dem innehåller en kod som vrider hela huvudtiden (låt oss kalla den huvudfirmware) när dispensern är ansluten till systemenheten högst upp på ATM.
  • i det andra packas bootloader-koden med zlib (dess lokala namn är USB Secure Bootloader), som ansvarar för att ladda upp firmware och köra huvudkoden.

och det bästa är att det finns oklippta tecken i filen – ta det och leta efter något intressant.

intern enhet för huvudfirmware

om du delar upp koden i huvudkomponenterna får du följande schema (i inlämningsordningen):

  1. en ström som handlar om att ta emot USB-paket och distribuera dem bland tjänster.
  2. tjänster är de grundläggande enheterna, var och en har sin egen roll och var och en har sina egna uppgifter (klasser).
  3. klasser – här är det uppgifter som en tjänst kan utföra med hjälp av kontroller.
  4. kontrollerna är faktiskt ”arbetare” ( arbetare ) som är engagerade i valideringen av de uppgifter som skickas till dem, deras utförande och bildandet av svarspaket.


eftersom det finns mycket kod i firmware beslutades det att börja med att söka efter alla möjliga tjänster och sedan se var uppgifterna överförs.

som ett resultat hittades följande tjänster som bara måste göra vad jag letar efter:
1) DispTranService (Dispenser Transaction Service) : arbeta med krypterade kommandon, generera buntar av sedlar, autentisering. Du kan säga det mest intressanta-här.

2) securityService: efter autentisering på sidan av dispensern genereras en sessionsnyckel som skickas till datorn i krypterad form på datorbegäran. Med denna nyckel kommer alla viktiga kommandon att krypteras-utfärda, bilda en bunt sedlar.

därefter fångade en annan tjänst mitt öga: UsbDownloadService. Dess uppgift är att ansluta dispensern till datorn och versionen av dispenserns firmwareversion som är lagrad på ATM-datorn, för att gå till bootloader för att ladda upp firmware som operativsystemet ska fungera med (det finns i mappen med leverantörens programvara på datorn). Denna tjänst kan också ge information om firmwareversionen.

fysisk autentisering

fysisk autentisering implementeras på högsta nivå och skyddar ATM från att helt enkelt skicka USB-kommandon för att utfärda utan tillstånd. I det här fallet ligger det i det faktum att endast med ett öppet kassaskåp med pengar behöver du utföra en av följande åtgärder:

  • ta bort och sätt i den nedre kassetten,
  • växla växelströmbrytaren på baksidan av racket med dispensern.


men allt detta krävs endast om åtkomstnivån är inställd på maximalt, det vill säga fysiskt. Det finns tre av dem: USB (0), logisk (1) och fysisk (2). De återstående två används av tjänsteleverantörer och utvecklare för felsökning och testning av firmware. Tja, den fysiska rekommenderas starkt av säljaren för användning som standard.

sårbarhet

följande beskriver en kritisk sårbarhet (redan fastställd av säljaren vid tidpunkten för publiceringen av artikeln), som, om det finns tillgång till serviceområdet, men utan tillgång till kassaskåpet (till exempel genom ett hål i ATM-frontpanelen), utför alla kommandon i dispensern, inklusive kontanter.

som det visade sig accepterar UsbDownloadService kommandon som inte kräver kryptering. Det låter frestande. Men då är allt skyddat ytterligare, och namnet Secure Bootloader kommer att motivera sig själv?
(Spoiler: inte motivera!)

vi måste gå djupare

som redan nämnts, i .datasektion det finns en packad bootloader-kod, som under lång tid inte väckte mitt intresse, och mina kollegor, när de undersökte firmware, uppmärksammade inte den.

medan närvaron av bootloader var hemlig var frågan öppen: hur fyllde programvaran på datorn firmware? När allt kommer omkring hittades ingenting i huvudfirmware.

så, bootloader packas upp, laddas i IDA vid offset 0x100000-nu kan du utforska … Endast inga tecken!
det spelar ingen roll: att jämföra huvudfirmware med bootloader – koden, läsa databladet på styrenheten-och en viss bild börjar dyka upp.

det visade sig att firmware-uppladdningen, även om den verkar vara skyddad, faktiskt inte är. Behöver bara veta hur man fyller det korrekt.
ganska mycket arbete och tid spenderades på en fullständig förståelse av denna process (för mer information, se rapporten ” Blackbox är död — länge leve Blackbox!”Vid Black Hat 2018-konferensen i Las Vegas). Vad kostar kostnaden för att lödda nvrams minne, ladda upp en säkerhetskopia till den för att ”strö” hela styrenheten … Tack till en kollega Alexey för hans tålamod!
resultatet var följande algoritm för att ladda upp firmware till dispensern:
1) generera ett par RSA-nycklar och häll den offentliga nyckeln i styrenheten.

2) Skriv successivt .data och .textavsnitt från ELF till deras fysiska adresser från sektionshuvudena.

3) Beräkna SHA-1 från inspelade data, kryptera hash med en privat nyckel, skicka till regulatorn.

4) Räkna och skicka summan av alla inspelade firmware ord.

därefter, om allt beräknas och spelas in framgångsrikt, kommer huvudfirmware att hämtas.
det visade sig att när du skriver firmware finns det bara en begränsning: firmwareversionen ska inte vara lägre än den nuvarande. Men trots allt stör ingen oss att ersätta firmwareversionen i själva data.
som ett resultat översvämmades min speciella firmware med antisäkerhetsfixar och lanserades framgångsrikt!
vid denna tidpunkt var koden för huvudfirmware väl studerad, kommandon för utfärdande av sedlar hittades. Nu kan de skickas okrypterade, och dispensern kommer gärna att utföra dem.

utlämning

efter allt som upplevdes under forskningen (till exempel en riktig bankomat zakirpicheny) var resultatet så trevligt och kompenserade för de ansträngningar som algoritmen ville upprepa med en annan stor leverantör.

den verkliga ATM började whir och villigt delade med oss färska skarpa anteckningar (i detta fall leverantör ”candy wrappers”). Ingen magi applicerades: bara en bärbar dator, en hjärna och en USB-sladd.

fynd

återigen var vi övertygade om att det är omöjligt att tillhandahålla adekvat skydd, styrd av säkerhetsprincipen genom dunkelhet. Anständigheten av en kod eller firmware betyder inte alls att en angripare inte kommer att ha tillgång till den vid en tidpunkt och inte kommer att dra nytta av de sårbarheter som hittats. Allt som behövs för genomförandet av själviska mål kan förvärvas i närvaro av en viss summa pengar.
utvecklare bör hantera koden och säkerhetsspecialister bör skydda den. Det är därför som det mest produktiva tillvägagångssättet verkar vara samarbete med informationssäkerhetsföretag med tillräcklig erfarenhet av att säkerställa säkerheten hos olika system som kommer att bidra till att bygga ett adekvat skydd i varje enskilt fall.
PS-leverantören bekräftade sårbarheten (överträdelsen hittades också i en annan modell – S2), som förklarades ändrad i februari-fixen för 2018-året.
CVE-lista:

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

tack

före mig arbetade mina kollegor, Dima Sklyarov och Misha Tsvetkov , redan med firmware (men utan dispenserkort) . Deras prestationer hjälpte mig mycket i studien, för vilken jag tackar dem så mycket! På sidan av ”järn” hjälpte Alexey Stennikov mig mycket .

Lämna ett svar

Din e-postadress kommer inte publiceras.