Når du vender smart-kort, er sidekanalangreb kendt for at være ret effektive på hardware. Men hvad er det, og kan det bruges i reverse engineering af software, og hvordan?
Når du vender smart-kort, er sidekanalangreb kendt for at være ret effektive på hardware. Men hvad er det, og kan det bruges i reverse engineering af software, og hvordan?
Et ' sidekanalangreb ' definerer enhver teknik, der vil betragte utilsigtede og / eller indirekte informationskanaler for at nå sit mål. Det er først blevet defineret i smart-kort-kryptografi til at beskrive angreb, der bruger utilsigtet informationslækage fra den indlejrede chip på kortet, og som kan bruges til hentning af nøgler og data. For eksempel kan den bruges ved overvågning:
Udførelsestid (Timing-angreb): For at skelne mellem hvilke operationer der er udført og gætte f.eks. hvilken gren af koden der er valgt (og dermed værdien af testen).
Strømforbrug (Strømovervågningsangreb): Til skelne nøjagtigt, hvilken sekvens af instruktioner der er udført, og være i stand til at komponere værdierne for variablerne igen. Bemærk, at der findes flere analyseteknikker, der bruger den samme input, men med en lidt anden måde at analysere den på. For eksempel kan vi liste: Single Power Analysis (SPA), Differential Power Analysis (DPA), High-order Differential Power Analysis (HO -DPA), Skabelonangreb , ...
Elektromagnetisk stråling (elektromagnetiske angreb): Nært relateret til strømforbrug , men kan også give oplysninger, der ikke findes i strømforbruget, især på RFID- eller NFC-chips.
Hvis du er mere interesseret i at lære at udnytte disse oplysninger, så vil foreslå at starte med at læse Strømanalyseangreb. Bliv ikke 'bange' væk af det faktum, at bogen handler om smartkort. De fleste af oplysningerne gælder også 1-til-1 på 'normale' (SoC) indlejrede enheder.
Glemte at nævne, at der er en open source-platform kaldet OpenSCA og noget open source-hardware kaldet FOBOS (Fleksibel open source BOard til sidekanal), som jeg ikke synes at finde et ordentligt link hjemmefra.
Når vi taler om anvendelse af sidekanalangreb i software reverse engineering nu, er det mere eller mindre ethvert angreb, der vil stole på at bruge utilsigtet eller indirekte informationslækage. Det bedste seneste eksempel er dette indlæg fra Jonathan Salwan, der beskriver, hvordan han gættede adgangskoden til en crackme ved blot at tælle antallet af instruktioner, der blev udført på forskellige indgange med Pin.
Mere bredt er denne teknik blevet brugt siden længe i software reverse engineering uden at navngive den, eller kunne have forbedret mange analyser. Grundideen er først at overveje, at hvis et stykke software er for uklart til at forstå det hurtigt, kan vi betragte det som en sort boks og tænke på at bruge en sidekanalsteknik til at gætte de vedlagte data gennem en guidet prøve og fejl teknik.
Listen over sidekanaler, der er tilgængelige i software reverse engineering er meget længere end den, vi har inden for hardware. Fordi det vedlægger den forrige liste og tilføjer nogle nye kanaler såsom (ikke udtømmende liste):
Instruktionsantal : Tillad at identificere forskellige adfærd afhængigt af input.
Læse / skrive tælle : Samme som ovenfor, med flere muligheder for at identificere mønstre, fordi det også inkluderer læst instruktion.
Raised Interrupt Count : Afhængigt af hvilken type afbrydelse der rejses, hvornår og hvordan, kan du muligvis identificere forskellige adfærdsmønstre og være i stand til at bestemme den gode vej til dit mål.
Adgang til instruktionsadresser : Tillad at genopbygge de dele af programmet, der er aktive i et præcist øjeblik.
Adgang til hukommelsesadresser : Tillad at genopbygge datamønster eller kompleks datastruktur, der er gemt eller tilgængelig i hukommelsen (f.eks. i bunken).
Denne liste er langt fra udtømmende, men dybest set kan værktøjer som Valgrind VM eller andre bruges til at udføre en sådan analyse og hurtigt udlede oplysninger om et givent programs opførsel og dermed fremskynde reverse engineering.
Forsøg på at opbygge en software, der er modstandsdygtig over for sådanne angreb, låner også meget fra smart-kortindustrien. Men ikke kun. Her er et par tricks, jeg kunne tænke på (men langt fra at være komplet om alt, hvad vi kan finde).
Instruktionstællingen er ekstremt effektiv til at opdage hvilken gren er taget i kode som denne:
hvis (værdi) ret = foo (); ellers ret = bar ();
Med foo ()
og bar ()
med forskellige instruktionstal.
Dette kan besejres ved at udføre foo ()
og bar ()
uanset hvilken -værdi
der er, og derefter beslutter, hvad der er værdien af ret
.
tmp_foo = foo (); tmp_bar = bar (); hvis (værdi) ret = tmp_foo; ellers ret = tmp_bar;
Denne teknik gør dit program meget sværere at gætte fra et sidekanalangreb, men også meget mindre effektiv. Man skal finde en ordentlig kompromis.
Timingangreb er ekstremt lette at udføre og vanskelige at løse, fordi sleep ()
ikke kan være en mulighed (for let at opdage i en kode, og alligevel kan du ikke antage en bestemt hastighed for processoren). Programmøren skal identificere udførelsestiden for hver gren af sit program og balancere hver gren med ekstra ikke-nyttige operationer, der har samme beregningskraft end dem fra de andre grene. Pointen er at gøre hver gren uadskillelig fra de andre kun baseret på udførelsestiden.
En anden måde at fortynde sidekanalen på er at multitråde dit program massivt. Forestil dig, at hver gren af dit program udføres i en separat tråd, og en variabel fortæller i hvilken tråd det aktuelle program virkelig er (hvis det er muligt på en kryptisk måde). Derefter vil sidekanalanalyse være meget sværere at udføre.
Sidekanalangreb er blevet undervurderet bredt til software reverse engineering, det kan drastisk fremskynde det omvendte af mange programmer. Men på samme tid findes der tiltrækningsteknikker, som skal udvikles specifikt rettet mod reverse engineering af software. Så vær ikke overrasket, hvis du ser flere og flere nyheder relateret til dette felt.