De diskGenie
De diskGenie is een beveiligde externe harde schijf met een keypad. Via dit toetsenbordje kan een pincode worden ingetoetst die de inhoud van de schijf vrijgeeft. De pincode kan bestaan uit zes tot maximaal zestien cijfers en voor de versleuteling wordt gebruik gemaakt van 128bit- of 256bit-aes-encryptie. De prijzen variëren van ongeveer 110 euro voor de 250GB-variant met 128bits encryptie tot 280 euro voor een exemplaar met 256bits versleuteling en een opslagcapaciteit van 750GB. Een geïntegreerde chip zorgt voor de realtime hardwarematige versleuteling, zodat er bij het schrijven of lezen van de gegevens geen merkbare vertraging moet zijn.

Volgens de supportdesk van iStorage krijgt de diskGenie binnen twee weken het Claims Tested Mark-certificaat, daarnaast is de chip voor de versleuteling voorzien van een FIPS 140-2-certificaat. Op het eerste gezicht lijkt de schijf goed beveiligd - voor ons des te meer reden om de proef op de som te nemen.
Uitpakken
In de doos zit in ons geval een 250GB-versie van de diskGenie, en een hoesje. Er wordt een Y-kabel meegeleverd om de drive te kunnen gebruiken als een enkele usb-poort onvoldoende stroom levert.

De diskGenie ziet er netjes uit. Het omhulsel van de disk bestaat uit een soort rubber, zodat vlekken en vingerafdrukken weinig kans maken.
/i/1280832795.jpeg?f=imagenormal)
De bijgeleverde snelstartgids geeft basisinformatie over de schijf, terwijl online een complete handleiding beschikbaar is. Standaard wordt de diskGenie geleverd met het wachtwoord '123456'. Als je deze code invoert en de unlock-toets indrukt, kun je de inhoud van de schijf lezen. Om het wachtwoord te wijzigen moet je de speciale beheersmodus opstarten door twee toetsen ingedrukt te houden, het nieuwe wachtwoord in te typen en de unlock-toets in te drukken.
Voor het invoeren van de juiste code zijn maximaal 50 pogingen toegestaan. Als binnen deze pogingen niet de juiste code is ingevoerd kun je nog een speciale code uit de handleiding invoeren waarna je nog eens 50 keer de kans krijgt de juiste code in te voeren. Als er na deze tweede serie van pogingen nog geen juiste code is ingevoerd is de enige manier om de schijf weer te kunnen gebruiken een complete reset, waarbij alle data wordt gewist. Frustrerend voor hackers is dat na iedere zes pogingen de schijf losgekoppeld moet worden. Via een rgb-led houdt de diskGenie de gebruiker op de hoogte van de modus en bijvoorbeeld of het wachtwoord foutief is.
Voor de eindgebruiker is het interessant om te weten dat de schijf niet afhankelijk is van een bepaald besturingssysteem. In de handleiding worden instructies gegeven voor het formatteren en partitioneren onder Windows en OS X, maar we kregen de schijf zonder enige problemen werkend onder Linux. Hoewel dit voor de eindgebruiker goed nieuws is, is het voor ons minder gunstig. De optie om de meegeleverde software te hacken, een optie die bij eerdere schijven snel tot resultaat leidde, vervalt direct. We zullen dus onze aandacht op de hardware moeten richten.
Echt uitpakken
Om de behuizing open te maken is het losdraaien van twee verborgen, beveiligde torx-schroeven voldoende. Het toepassen van dergelijke schroeven werpt in theorie een drempeltje op, maar in de praktijk is het vrij eenvoudig de schijf open te maken. Een setje met bijpassende schroevendraaiers kostte ons nog geen tientje.

Nadat de behuizing is verwijderd kunnen we een blik werpen op de binnenkant. Het apparaat bestaat uit een printplaat met de elektronica en het keypad, en een 250GB grote WD Blue Scorpio-sata-laptopschijf.

Op de printplaat zijn drie chips aangebracht. Van links naar rechts zien we een chip met gele verf, een vierkante Initio INIC-1607 en een 25F010-eeprom. Er is helaas weinig documentatie te vinden over de Initio. Op de website van de fabrikant wordt zelfs helemaal geen melding van dit type gemaakt. Op de 25F010 staat waarschijnlijk de firmware van de Initio-chip opgeslagen.
Het is niet duidelijk waarom de gele verf op de eerste chip zit. Het is mogelijk dat het gedaan is om potentiële hackers niet wijzer te maken, maar dat heeft weinig zin: met een beetje terpentine is het typenummer eenvoudig te onthullen. De chip blijkt een PIC16F883, een redelijk gewone 8bits microcontroller. Na wat testen en meten blijkt ook waar de niet-bestukte connector voor gebruikt wordt: dit is de interface waarop een programmer kan worden aangesloten om de chip opnieuw te programmeren of te debuggen. Na behoorlijk wat speur- en meetwerk kunnen we met redelijke zekerheid zeggen dat onderstaand schema het ontwerp van de schijf weergeeft:

De Initio-chip zit tussen de usb-poort en de harde schijf. Wat speurwerk op het internet wees uit dat de chip realtime 256bits aes-encryptie kan uitvoeren. Omdat de gebruikte microcontroller bovendien te langzaam is om de versleuteling voor zijn rekening te nemen, mogen we concluderen dat de Initio verantwoordelijk is voor de versleuteling van de data op de aangesloten schijf. De microcontroller stuurt het ledje en het toetsenbord aan en communiceert met de Initio via een seriële bus.
Hoe het werkt
Als eerste kijken we naar de inhoud van de schijf. Om het debuggen makkelijker te maken hebben we de meegeleverde schijf vervangen door een kleiner exemplaar van 60GB; als we op byte-niveau willen kijken is dat eenvoudiger met een kleinere schijf.
Het installeren van de nieuwe schijf was simpel: na het monteren van de nieuwe schijf hoefden we alleen de diskGenie te resetten naar de standaard pincode om het apparaat weer te kunnen gebruiken. Daarna hebben we de schijf weer verwijderd en hem in een standaard usb-behuizing geplaatst. Daarbij viel direct op dat in de standaardbehuizing de werkelijke grootte van 60GB wordt weergegeven. In de diskGenie waren echter ruim 1,4 miljoen blokjes van 512 bytes gereserveerd, er was dus 700MiB minder beschikbaar.
De ruimte die door de diskGenie wordt vrijgehouden, wordt echter nauwelijks gebruikt: er worden maar 700 bytes daadwerkelijk beschreven. Een korte zoektocht leerde dat de controller ook gebruikt wordt voor drives zonder keypad. In dat geval toont de controller een niet versleutelde extra partitie, waarop software geïnstalleerd kan worden om een keypad te emuleren. De 700MiB bevat dan ook de data die gebruikt wordt om zaken als het aantal resterende pogingen op te slaan. Los van de vraag of dat wel net zo veilig is als de hardwareoplossing, is het vervelend dat ook de diskGenie domweg 700MiB opslagcapaciteit onbruikbaar maakt.
In het geval van de diskGenie hebben de ontwerpers het gedeelte dat een wachtwoord van software op de pc ontvangt, vervangen door een routine die het wachtwoord van de aangesloten microcontroller krijgt. De vraag die direct opkomt is of we de communicatie tussen de Initio-chip en de microcontroller kunnen uitlezen om zo het wachtwoord te achterhalen. Voor de communicatie tussen beide chips wordt gebruik gemaakt van SPI, een vrij eenvoudig serieel protocol. Als het juiste wachtwoord is ingevoerd stuurt de microcontroller de gegevens naar de Initio-chip, die op zijn beurt de harde schijf toegankelijk maakt. Het commando om de schijf vrij te geven ziet er bij ons als volgt uit:
00 78 80 00 00 4B C4 A9 26 B3 86
67 D3 62 05 74 AD 61 70 8D 7A 7F
FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF 80 00 00 00 00 00 00 00
De code bestaat uit zestien ogenschijnlijk willekeurige bytes. Als de drive naar de fabrieksinstellingen wordt gereset, wordt er een andere reeks verstuurd. Opvallend is dat de reeks niet wijzigt als de gebruiker het wachtwoord verandert. Op basis van deze informatie en onze ervaringen met vergelijkbare chips kunnen we met redelijke zekerheid vaststellen wat er tijdens het gebruik gebeurt:
Bij een volledige reset
- De microcontroller zet de pincode op 123456;
- De microcontroller genereert een random sleutel om naar de Initio-chip te versturen;
- De Initio-chip genereert een random sleutel om de harde schijf mee te versleutelen. Met de sleutel die van de microcontroller is ontvangen, wordt de aes-key versleuteld en op het verborgen gedeelte van de hd opgeslagen.
Bij het ontgrendelen van de schijf
- De gebruiker voert het wachtwoord in;
- De microcontroller controleert het wachtwoord, als deze correct is wordt de eerder gegenereerde key naar de Initio-chip verzonden;
- De Initio-chip gebruikt deze key om zijn eigen sleutel te ontcijferen en controleert vervolgens of de decryptie gelukt is;
- De Initio-chip gebruikt die sleutel om de harde schijf te decrypten;
- De gebruiker kan de data weer lezen.
Om zeker te zijn van bovenstaande procedure hebben we de reset op twee verschillende harde schijven geprobeerd. Als het beschreven scenario correct is, zal de microcontroller de pincode moeten accepteren en de sleutel voor de laatst geresette harde schijf naar de Inic chip moeten sturen. Als de eerste harde schijf in de behuizing zit zal de Initio-chip zijn eigen key niet kunnen ontcijferen en dus de harde schijf niet kunnen vrijgeven. Dat is ook precies wat er gebeurde: de microcontroller toonde een groen ledje ten teken dat het wachtwoord correct was, maar de pc kreeg geen toegang tot de harde schijf.
Ten Aanval
Op basis van de informatie die we tot nu toe hebben vergaard, zijn er verschillende mogelijkheden om de schijf te kraken. De eerste die in ons opkomt is de zogenaamde evil maid-aanval. Daarvoor moet de schijf ergens onbeheerd worden achtergelaten, zeg: in een hotelkamer. De hacker, de 'evil maid', kan vervolgens bijvoorbeeld een keylogger installeren. Als de eigenaar het apparaat daarna gebruikt, worden alle toetsaanslagen bewaard en bij een tweede bezoek kan de evil maid de gegevens uitlezen en alle sporen van zijn of haar aanwezigheid verwijderen. De diskGenie is kwetsbaar voor deze hack. Het apparaat kan eenvoudig worden geopend en er kan vervolgens door een kundige hacker mee geknoeid worden.
Bovenstaand scenario gaat uit van een doelgerichte hack die bovendien redelijk wat voorkennis en voorbereiding nodig heeft. Een situatie die natuurlijk vaker voorkomt is diefstal of verlies van de schijf, zodat een hacker zonder wachtwoord aan de slag moet. De eenvoudigste plek om de aanval te starten lijkt de microcontroller. De pincode bestaat uit zes tot maximaal zestien cijfers. Deze code is zelfs in het ongunstigste geval miljoenen keren eenvoudiger te kraken dan de 256bits aes-encryptie waarmee de inhoud van de schijf is versleuteld. Daarnaast is de Initio-chip gecertificeerd door het NIST, en dat kan niet van de microcontroller worden gezegd.
We zouden als eerste graag wat informatie over de pincode krijgen. Dat blijkt niet erg moeilijk. Het valt direct op dat de led verschillende signalen kan geven als er foutieve pincodes worden ingevoerd. Als het wachtwoord verkeerd is maar wel het juiste aantal cijfers bevat, knippert de led drie keer; als het aantal cijfers verkeerd is knippert het ledje vier keer. Dit is voor een hacker uiteraard bijzonder nuttige informatie. Als je weet hoe lang het wachtwoord is kun je op basis daarvan beter bepalen welke methode je moet toepassen om het apparaat te kraken.
Timing attack
Een veelgebruikte techniek om informatie over een wachtwoord te krijgen, is de timing attack. Deze aanval is mogelijk als de microcontroller simpelweg de karakters van het opgeslagen wachtwoord vergelijkt met de invoer. Als het wachtwoord 12345 is en er wordt 23456 ingevoerd kan de microcontroller al aan het eerste cijfer zien dat het wachtwoord fout is. Als er 12346 wordt ingevoerd, ziet de controller pas bij het laatste cijfer dat het wachtwoord fout is. Als er dus een gedeelte van het wachtwoord juist is, is het mogelijk dat de microcontroller er een fractie korter over doet om het wachtwoord te valideren. Dit verschil kan meetbaar zijn, en door deze informatie te gebruiken kan een wachtwoord een stuk sneller achterhaald worden.
We moeten als eerste proberen te ontdekken in welke orde van grootte deze tijdsverschillen vallen. Het verschil in reactietijd tussen een goede en een foutieve invoer zal slechts enkele processortikken bedragen, zodat het belangrijk is om te weten hoeveel tijd een kloktik kost. Als de microcontroller zijn klokfrequentie van een extern kristal zou krijgen was deze informatie simpelweg van het kristal af te lezen; in dit geval wordt de frequentie echter intern door de microcontroller bijgehouden.
Nu moeten we even wat achtergrondinformatie over de interne werking van een microcontroller geven. Die voert elke actie uit in één cyclus van de klok. Als een nieuwe klokcyclus wordt gestart, wordt bijvoorbeeld een instructie ingelezen, een berekening uitgevoerd of data weggeschreven. Omdat het begin van al deze bewerkingen samenvalt met het begin van de klokcyclus, gebruikt de microcontroller op dat moment het meeste energie. Door het energieverbruik nauwkeurig te monitoren moet je dus kunnen vaststellen wat de klokfrequentie is.

Wij hebben dat gedaan door in de verbinding tussen de voeding en de microcontroller een weerstand van 330 ohm te plaatsen en daar een oscilloscoop op aan te sluiten. In het geval van de diskGenie konden we aflezen dat deze chip op 8MHz is geklokt, en dat komt overeen met de frequentie waarop de chip volgens de specificaties kan draaien.
Nu we de kloksnelheid hadden bepaald werd het tijd voor de timing attack. Om deze aanval goed uit te kunnen voeren, moeten we de tijd meten tussen het moment waarop begonnen wordt met het valideren van de pincode en de afwijzing van een foutieve pincode. De eenvoudigste manier is het meten van de tijd tussen het indrukken van de knop op het keypad en het oplichten van de led. Dat zou echter betekenen dat we nauwkeurig een tijdsverschil van een achtmiljoenste van een seconde moeten kunnen registreren. Dat is vrijwel onmogelijk, zeker gezien het feit dat kleine afwijkingen in het kloksignaal de meting volledig in de war kunnen schoppen.
Er waren echter nog twee andere signalen die we mogelijk zouden kunnen gebruiken. Als alternatief voor het starts
ignaal keken we naar de matrix van de keypad. Deze wordt sequentieel uitgelezen. Eerst wordt in de eerste rij gekeken of er een toets is ingedrukt, vervolgens de tweede rij en als laatste de derde rij waarna het geheel weer van voren af aan begint. Er is een veel uitgebreidere uitleg beschikbaar, maar voor ons is het genoeg om te weten dat het uitlezen van het toetsenbord te zien is als drie pulserende lijnen.
Op het moment dat de unlock toets wordt ingedrukt krijgt de microcontroller het even zó druk, dat het uitlezen van het toetsenbord een fractie van een seconde wordt onderbroken, terwijl wordt bepaald of de pincode correct is. Dit proces neemt ongeveer 25ms in beslag. Binnen deze tijd is een timing attack nog steeds moeilijk, maar wel iets eenvoudiger. Helaas bleek tijdens het meten dat er een relatief groot verschil zat tussen
twee identieke pogingen.
Gelukkig bedachten we ons dat de microcontroller onthoudt hoeveel pogingen er al gedaan zijn om het juiste wachtwoord in te vullen. Dit wordt zelfs onthouden als de stroom van het apparaat afgehaald wordt. Deze gegevens moeten dus ergens worden weggeschreven, vermoedelijk op een eeprom die in de chip is meegebakken.
Het beschrijven van een eeprom is een complexe aangelegenheid. De microcontroller moet een op de chip meegebakken spanningsconverter aanslingeren om een spanning te genereren die hoog genoeg is om de cellen van de eeprom te wissen. Daarna moet enige tijd worden gewacht totdat de nieuwe data is weggeschreven. Die wachttijd wordt bepaald door een soort analoge klok.
Het bleek niet erg moeilijk om vast te stellen op welk moment de eeprom werd beschreven. De spanningsconverters die voor het wissen van de eeprom worden gebruikt, gebruiken veel meer stroom dan de microcontroller zelf. Omdat de oscilloscoop nog was aangesloten, konden we eenvoudig een dip in de stroomtoevoer ontdekken.
Helaas bleek dat ons niet verder te brengen. De gemeten verschillen tussen twee identieke pogingen liepen nog steeds te ver uiteen. Tussen twee keer dezelfde invoer zat soms een verschil van meer dan 100 klokcycli. We weten niet of dit een doelbewuste bescherming is tegen een timing attack, maar het werd wel duidelijk dat we hier niet verder gingen komen. Toch had dit verhaal een aantal nieuwe inzichten opgeleverd.
De eeprom
Toen we ontdekten dat we het moment van schrijven van de eeprom konden bepalen, werden we nieuwsgierig of dat misschien een zwakke plek in het ontwerp van de diskGenie zou kunnen zijn. Als we immers kunnen bepalen wanneer de eeprom beschreven wordt, kunnen we wellicht de microcontroller willekeurige data of -nog beter- helemaal niks laten schrijven. Om dit voor elkaar te krijgen hebben we onderstaand schema in elkaar geklust. De microcontroller van de diskGenie staat links en de avr-microcontroller die we hebben gebruikt zie je aan de rechterkant.

Een kleine uitleg is wellicht op zijn plaats. De weerstand is gebruikt als een kortsluitleiding. Als de microcontroller meer stroom gebruikt om naar de eeprom te schrijven, zal de spanning over de weerstand iets oplopen en de spanning op de input van de avr zal juist iets teruglopen. De avr vergelijkt het verschil in spanning met een bepaalde drempel. Als deze drempel wordt overschreden weet de avr dat er een schrijfactie is begonnen.
Zodra dat gebeurt, kan de avr de schrijfactie frustreren door een bepaalde hoeveelheid spanning op de microcontroller te zetten. De hoeveelheid spanning wordt bepaald door de BC560-transistor met de daarop aangesloten potmeter. Het idee is dat de spanning op de BC560 voldoende laag is, zodat de microcontroller gewoon blijft draaien maar het schrijven naar de eeprom mislukt.
Het doelwit van deze hele constructie is de ingebouwde resetprocedure van de diskGenie. Zoals we al meldden, wordt bij een reset een nieuwe key naar de Initio-chip verzonden. Deze key en de nieuwe pincode worden vervolgens opgeslagen in de eeprom, waarbij de oude key en de pincode worden overschreven. Als we kunnen voorkomen dat de nieuwe key wordt weggeschreven, weten we na een reset de juiste pincode, maar is de bestaande data met de oude key nog steeds beschikbaar en kunnen we deze eenvoudig lezen.
Helaas lukte dit maar gedeeltelijk. Het is gelukt om de spanning zo aan te passen dat het schrijven naar de eeprom mislukte, maar het lukte niet om de eeprom helemaal niet te beschrijven. Er werd niet naar de eeprom geschreven wat de microcontroller wilde, maar omdat er nog wel iets geschreven werd, was de hele schijf niet meer te gebruiken.
Het is via deze methode echter wel gelukt om de twee bytes te beïnvloeden die gebruikt worden om het aantal verkeerd ingevoerde pincodes te bij te houden. Dat zette de deur voor een brute force aanval open. Het invoeren van pincodes werkt echter veel te traag omdat er alleen al twee seconden nodig zijn om de led te laten knipperen als het wachtwoord fout is.
Brute force
Omdat onze listige pogingen niet erg succesvol bleken, hebben we een stapje teruggedaan en zijn we gaan onderzoeken hoe realistisch een brute-forceaanval is. We hebben al een kwetsbaarheid ontdekt in de methode die een brute-forceaanval tegen moet gaan: door de microcontroller dwars te zitten als deze het aantal resterende pogingen probeert weg te schrijven, hoeven we ons geen zorgen meer te maken over het maximale aantal pogingen.
Het probleem blijft echter dat iedere poging drie à vier seconden kost. Dat is veel te veel als de pincode uit zes of meer cijfers bestaat. We zullen dus proberen deze tijd drastisch in te korten, en dat doen we met behulp van de lessen die we hebben geleerd bij de timing-aanval. We zijn benieuwd naar het verschil in tijd tussen het stoppen van het uitlezen van het keypad en het beschrijven van de eeprom bij een helemaal goede en een helemaal foutieve pincode:

Aan de linkerkant is de poging te zien met een foutieve pincode, aan de rechterkant is te zien wat er gebeurt als de correcte code wordt ingevoerd. De witte lijnen op de afbeeldingen bakenen identieke intervallen af, waarmee duidelijk is dat de eeprom een fractie van een seconde eerder wordt beschreven als de pincode fout is.
Het is vrij simpel om deze informatie toe te passen. We haalden het circuit dat we gebruikten om de schrijfactie naar de eeprom te frustreren er weer bij, en voegden een lijn tussen de avr en de matrix van het toetsenbord toe. Daarmee konden we de tijd meten die verstrijkt tussen het verwerken van de pincode en het beschrijven van de eeprom. We voegden nog een tweede lijn naar de reset van de microcontroller toe, en schreven een klein stukje software dat ervoor zorgt dat de avr de tijd meet die nodig is om de invoer te verwerken.
Als de avr nu op basis van de verstreken tijd kan concluderen dat de pincode fout is, wordt de microcontroller gereset voordat het aantal resterende pogingen wordt weggeschreven. Op deze manier kunnen de pincodes snel achter elkaar worden ingevoerd, zonder dat er gewacht hoeft te worden op een reactie van de microcontroller en zonder dat het apparaat na honderd foutieve pincodes volledig is geblokkeerd.
Een snelle rekensom leert dat een brute-forceaanval haalbaar is bij korte pincodes. Op basis van onze ervaring schatten we dat het maximaal een seconde duurt om een pincode in te voeren en te testen. Als we het invoerproces kunnen automatiseren en alle mogelijkheden van een pincode van zes cijfers proberen, zouden we 10*10*10*10*10*10=1000000 seconden nodig hebben: ongeveer elf dagen.
Met wat extra informatie zou deze tijd nog behoorlijk ingekort kunnen worden. Als het apparaat bijvoorbeeld intensief wordt gebuikt, zullen de toetsen van de cijfers die in de pincode voorkomen wellicht iets sneller slijten of wat extra vuil zijn. Als we er achter kunnen komen welke cijfers in de pincode worden gebruikt neemt de tijd voor een brute-forceaanval op een zescijferige pincode af naar 6*5*4*3*2*1 seconden, ongeveer 12 minuten. Bij langere pincodes neemt deze tijd echter exponentieel toe. Bij zeven cijfers kost het al bijna anderhalf uur, acht cijfers kosten elf uur en bij tien cijfers zijn we anderhalve maand bezig.
Conclusie
Is de diskGenie veilig? Dat hangt, zoals wel vaker, van de toepassing af. Voor de gemiddelde gebruiker is het apparaat een uitstekende oplossing. Voor het opslaan van bedrijfsgeheimen is de diskGenie ook prima te gebruiken, als de pincode tenminste voldoende lang is: we raden minimaal elf karakters aan. Voor nog gevoeliger data, bijvoorbeeld de lanceercodes van het kernwapenarsenaal van het land waarvan je president bent, zijn er waarschijnlijk betere opties.
Er is geen software waarmee geknoeid kan worden, zodat een hacker in ieder geval ervaring met de hardware moet hebben. De gebruikte microcontroller is echter geen beveiligde chip en zal in een laboratorium waarschijnlijk zijn geheimen wel prijsgeven.
De diskGenie is voldoende beveiligd om de gemiddelde hacker buiten de deur te houden, maar iemand met heel diepe zakken en de mogelijkheid om chips uit elkaar te halen kan waarschijnlijk wel bij de data komen. Ook met de 'evil maid'-aanval moet rekening worden gehouden: iemand met de technische vaardigheden om een microcontroller te gebruiken om de pincode of de key te onderscheppen, zal niet door de diskGenie worden tegengehouden. De gelegenheid voor een dergelijke aanval zal zich echter niet al te vaak voordoen, en vooralsnog is de diskGenie de enige beveiligde draagbare harddisk die op onze testbank niet zonder meer zijn geheimen prijsgaf.
Onze dank gaat wederom uit naar Sprite_tm voor het beschikbaar stellen van zijn technische kennis en tijd.