De meeste hacks vinden plaats via het netwerk of internet. In dit artikel, dat is gebaseerd op onderzoek van  Jeroen Domburg, zoeken we uit of het ook via een gecompromitteerde harde schijf lukt.

Een harde schijf bestaat in feite alleen uit een verzameling van sectoren van 512 bytes en genummerd met een Logical Block Address (LBA), geabstraheerd via een bestandssysteem, waarmee je computer communiceert via een SATA poort. Of is dat wat te simplistisch gesteld? Harde schijven doen ook bad block management, ze beheren SMART-attributen (Self Monitoring, Analysis and Reporting Technology) en er wordt ook nog gebruik gemaakt van een cache. Dat impliceert dat er ergens een vorm van code aan het werk is.  En code kan gekraakt worden.

De PCB
Wat ons interesseert is de Printed Circuit Board – ofwel de PCB van de harde schijf. Dat is de printplaat van de disk die je ziet als je de onderkant bekijkt en waar ook de connectoren op zijn geplaatst.

Op een PCB zijn doorgaans vier chips geplaatst: de geheugenmodule – DRAM tussen de 8 en 64MB groot; de spindle motor controller: de chip die de motor van de schijf aanstuurt en zorgt voor het energiebeheer en enkele A/D-kanalen heeft; een seriële flash-chip tussen de 64 en 256kB en de eigenlijke controller die zorgt voor de datatoevoer en foutcorrectie.

De controller is geen standaardcomponent, en documentatie hierover is schaars. Toeval wil dat iemand op het HDDGuru forum door trial en error de JTAG pin layout van zo’n controller heeft kunnen bepalen. De JTAG-poort kan worden gebruikt om de controller te sturen: je kunt hem stoppen, starten, het geheugen bewerken etc.  Deze persoon vond op zijn 2,5″ 250 G HD naast een ARM-core ook een seriële poort waarmee hij de beschadigde flash van zijn HD kan herschrijven. En zo wordt het hacken van een harde schijf Interessant…

JTAG

De vraag is: is de manier waarop gegevens worden benaderd en uitgelezen, standaard voor alle harde schijven?

We verbinden een FT2232H-board met de JTAG – interface en met de seriële poort. Met OpenOCD kun je de JTAG-poort aansturen.  De chip op deze schijf blijkt niet één, maar drie ARM-cores te bevatten:

– Feroceon 1: zorgt voor het fysiek lezen en schrijven van data van en naar de schijven;

– Feroceon 2: SATA-interfacebeheer, cache en het omzetten van LBA-CHS (Logical Block-Cylinder Head/Sector);

– Een Cortex-M3: functie alsnog onbekend – zelfs op inactief waren nog alle HD functies beschikbaar.

Ons doel is de security van een heel systeem neer te halen via een hard disk firmware mod. De gemakkelijkste uit te voeren en waarschijnlijk moeilijkst te achterhalen manier om dat te doen is door data on-the-fly te veranderen.  Anders gezegd: op de harde schijf zelf passen we niets aan en de firmware maakt zichzelf onzichtbaar. We moeten dus de core gebruiken die de data beheert op het moment dat deze wordt verstuurd van de schijf naar de SATA-kabel. Dat vindt plaats in de cache, dus op de tweede Feroceon core.  Dit is na te gaan door een eenvoudige tekst op de schijf te zetten en deze met OpenOCD de cache uit te lezen.

 De cache van de harde schijf uitlezen

Code injecteren

Voor elke schrijfopdracht de volledige cache uitlezen is nogal onhandelbaar. We moeten dus uitzoeken hoe de cache werkt.  Ondanks de beknoptheid wordt er in de Western Digital-schijf uit het voorbeeld gelukkig geen obscure code gebruikt. Na wat experimenteren ontdekken we de “cache descriptor table”, die de start-LBA bevat van de sectoren die gecached moeten worden, hoeveel cache dat gebruikt, enkele vlaggen die de status van de cache entry bepalen en een getal dat de locatie aanduidt.

Delicaat punt: als we de cache te vroeg veranderen, is de data er nog niet.  Bewerken we hem te laat, dan zit de data al in de PC. We zoeken dus een routine die verantwoordelijk is voor de SATA hardware setup, die de data uit de cache haalt; vlak daarvoor moeten we onze slag slaan.  Enig debug-werk levert een geschikte kandidaat op.  Daarin moeten we dit soort code kwijt:

***Codevoorbeeld***

void hook() {

  foreach (cache_struct in cache_struct_table) {

    if (is_valid(cache_struct)) {

      foreach (sector in cache_struct.sectors) {

        sector[0]=0x12345678;

      }

    }

  }

}

Deze code vervangt de eerste 4 bytes van elke sector in de cache door 0x12345678, dus als we dit naar de harde schijf uploaden, moeten we het resultaat gemakkelijk kunnen terugvinden.

Titel: Code laden in de cache

Persistentie

Om de veranderingen permanent te maken, moeten we ze natuurlijk ergens anders opslaan dan in de cache zelf. Een goede plek daarvoor is het flash-geheugen.  De flash is een standaardcomponent waarvan het opslagformaat reeds bekend is: datablokken voorafgegaan door een tabel die ze beschrijft. Je kunt hem makkelijk lossolderen en er een connector aanhangen om eenvoudig te schakelen tussen de programmeerinterface en de harde schijf. Op de plek waar we onze hack kwijtwillen, wordt echter een ongekend compressiealgoritme gebruikt. Blokken data vervangen is dus geen mogelijkheid.

Wat wel kan, is een blok toevoegen en daarnaar verwijzen, zodat de code daarin vóór al de rest uitgevoerd wordt.  Daarvoor moeten we de flash binary volledig uit elkaar halen en met de ‘juiste’ code weer in elkaar zetten. Resultaat: exact hetzelfde als wat we voordien hadden, maar nu zonder  JTAG-interface.

Nu botsen we in ons hackerscenario op een praktisch probleem: geen enkel bedrijf zal een ‘donatie’ van harde accepteren waar duidelijk te zien is dat ermee geknoeid is. Eigenlijk moeten we dus de flash kunnen zappen zonder een soldeertussenstap. Western Digital maakt het ons echter makkelijk: er zijn tools ter beschikking om via DOS nieuwe firmware op de flash en de zogenaamde service area van de harde schijf te zetten (de voorbehouden sectoren).  Deze tools gebruiken weliswaar specifieke opdrachten van de fabrikant, maar met enig giswerk en het ‘lenen’ van code uit idle3-tools en het werk van Ariel Berkman komen we er.  We gieten alles in een handig programmaatje genaamd FWtool.

De aanval is nu compleet: als een hacker op de een of andere manier root access kan verkrijgen op een server met deze schijf, kan hij FWtool gebruiken om remote de flash van een schijf te dumpen, te veranderen en terug te flashen. Wanneer de eigenaar toch zou merken dat de machine gehacked is en besluit deze opnieuw te installeren, maakt dat geen enkel verschil. Door de firmware hack kan de aanvaller nog steeds toegang krijgen tot het systeem.  Hoe dat in zijn werk gaat?  Je zou de firmware bijvoorbeeld kunnen laten uitkijken naar een magic string, verborgen in een bestand of uitgelezen van een URL. Als de firmware door de string getriggerd wordt, kunnen we het evil masterplan in gang zetten: bijvoorbeeld wachten tot /etc/shadow uitgelezen wordt en de inhoud daarvan on-the-fly veranderen door een voorgeprogrammeerde rootlogin en wachtwoord.

Een andere toepassing behelst juist het omgekeerde: je kunt bijvoorbeeld een onkloonbare harde schijf maken.  Zolang de firmware normaal ‘random’ gebruik van files waarneemt, gebeurt er niets.  Als de schijf echter sequentieel uitgelezen wordt, zoals een diskdump utility zou doen, schudden we alle data eens goed door elkaar.

Conclusie

Hoewel het niet onmogelijk is om een relatief niet-gedocumenteerd stuk hardware via wat reverse engineering te hacken, blijft het twijfelachtig of een generische hack ooit in het wild zal verschijnen.  Het is uiteraard makkelijker om softwarematig te hacken dan voor elk type harde schijf een firmware hack te bouwen in je hacking tool. Verder toonden we hier aan dat zelfs een kapotte harde schijf nog aardig wat bruikbare hardware bevat voor de programmeur die via embedded code een avontuur wil aangaan. Noch Linux Magazine, noch de auteur, noch de onderzoeker zijn verantwoordelijk voor eventuele problemen die ontstaan door het uitvoeren van de in dit artikel besproken methodes.

Meer info:

HDDGuru: http://forum.hddguru.com/viewtopic.php?t=20324&start=

OpenOCD: http://openocd.sourceforge.net/

Flash dataformaat: http://nazyura.hardw.net/Part02.htm

Demo van de hack: http://spritesmods.com/hddhack/demo-pass.ogv

Code-voorbeeld: http://spritesmods.com/hddhack/hddhack.tgz