Når du snur smartkort, er sidekanalangrep kjent for å være ganske effektive på maskinvare. Men hva er det, og kan det brukes i programvare for omvendt utvikling og hvordan?
Når du snur smartkort, er sidekanalangrep kjent for å være ganske effektive på maskinvare. Men hva er det, og kan det brukes i programvare for omvendt utvikling og hvordan?
Et ' sidekanalangrep ' definerer enhver teknikk som vil vurdere utilsiktede og / eller indirekte informasjonskanaler for å nå målet hans. Det er først blitt definert i smartkort-kryptografi for å beskrive angrep som bruker utilsiktet informasjonslekkasje fra den innebygde brikken på kortet, og som kan brukes til å hente nøkler og data. For eksempel kan den brukes ved å overvåke:
Utførelsestid (Tidsangrep): For å skille hvilke operasjoner som er utført og gjette, for eksempel hvilken gren av koden som er valgt (og dermed verdien av testen).
Strømforbruk (Strømovervåking angrep): Til skille nøyaktig hvilken sekvens av instruksjoner som er utført og være i stand til å komponere verdiene til variablene på nytt. Vær oppmerksom på at det finnes flere analyseteknikker med samme inngang, men med litt annen måte å analysere den på. For eksempel kan vi liste opp: Single Power Analysis (SPA), Differential Power Analysis (DPA), High-order Differential Power Analysis (HO -DPA), Malangrep , ...
Elektromagnetisk stråling (elektromagnetiske angrep): Tett knyttet til strømforbruk , men kan også gi informasjon som ikke finnes i strømforbruket, spesielt på RFID- eller NFC-brikker.
Hvis du er mer interessert i å lære å utnytte denne informasjonen, kan jeg foreslår at du starter med å lese Strømanalyseangrep. Ikke bli "redd" bort av det faktum at boken handler om smartkort. Det meste av informasjonen gjelder også 1-til-1 på 'normale' (SoC) innebygde enheter.
Glemte å nevne at det er en åpen kildekodeplattform kalt OpenSCA og noe åpen kildekode-maskinvare. kalt FOBOS (Flexible Open-source BOard for Side-channel) som jeg ikke ser ut til å finne en riktig kobling hjemmefra.
Når vi snakker om anvendelse av sidekanalangrep i omvendt engineering av programvare, er det mer eller mindre angrep som vil stole på å bruke utilsiktet eller indirekte informasjonslekkasje. Det siste eksemplet er dette innlegget fra Jonathan Salwan som beskriver hvordan han gjettet passordet til en crackme bare ved å telle antall instruksjoner utført på forskjellige innganger med Pin.
Mer bredt, denne teknikken har blitt brukt lenge i programvare omvendt engineering uten å navngi den, eller kunne ha forbedret mange analyser. Den grunnleggende ideen er å først vurdere at hvis et programvare er for uklart til å forstå det raskt, kan vi betrakte det som en svart boks og tenke på å bruke en sidekanalsteknikk for å gjette vedlagte data gjennom en guidet prøve og feiling. teknikken.
Listen over sidekanaler som er tilgjengelig i programvare for omvendt utvikling er mye lenger enn den vi har innen maskinvare. Fordi den vedlegger den forrige listen og legger til noen nye kanaler som (ikke uttømmende liste):
Instruksjonsantall : Tillat å identifisere forskjellige atferd, avhengig av input.
Antall lese / skriv : Det samme som ovenfor, med flere muligheter til å identifisere mønstre fordi det også inkluderer instruksjon som er lest.
Raised Interrupt Count : Avhengig av hvilken type avbrudd som heves, når og hvordan, kan du identifisere annen atferd og være i stand til å bestemme den gode veien til målet ditt.
Tilgang til instruksjonsadresser : Tillat å gjenoppbygge de delene av programmet som er aktive i et presist øyeblikk.
Tilgjengelige minneadresser : Tillat å gjenopprette datamønster eller kompleks datastruktur som er lagret eller tilgjengelig i minnet (f.eks. i bunken).
Denne listen er langt fra uttømmende, men i utgangspunktet kan verktøy som Valgrind VM eller andre brukes til å utføre en slik analyse og raskt utlede informasjon om oppførselen til et gitt program, og dermed påskynde reversering.
Å prøve å bygge en programvare som vil være motstandsdyktig mot slike angrep, vil også låne mye fra smartkortindustrien. Men ikke bare. Her er noen få triks jeg kunne tenke meg (men langt fra å være fullstendig om alt vi kan finne).
Antall instruksjoner er ekstremt effektiv for å oppdage hvilken gren er tatt i kode som denne:
hvis (verdi) ret = foo (); ellers ret = bar ();
Med foo ()
og bar ()
med forskjellig instruksjonsantall.
Dette kan beseires ved å utføre foo ()
og bar ()
uansett hvilken -verdi
som er og bestemmer etterpå hva som er verdien av ret
.
tmp_foo = foo (); tmp_bar = bar (); hvis (verdi) ret = tmp_foo; ellers ret = tmp_bar;
Denne teknikken gjør programmet ditt mye vanskeligere å gjette fra et sidekanalangrep, men også mye mindre effektiv. Man må finne en riktig avveining.
Tidsangrep er ekstremt enkle å utføre og vanskelig å løse fordi sleep ()
ikke kan være et alternativ (for lett å oppdage i en kode, og uansett kan du ikke anta en bestemt hastighet for prosessoren). Programmereren må identifisere utførelsestiden for hver gren av programmet sitt og å balansere hver gren med ekstra ikke-nyttige operasjoner som har samme beregningskraft enn de fra de andre grenene. Poenget er å gjøre hver gren skille fra de andre bare basert på utførelsestiden.
En annen måte å fortynne sidekanalen på er å multitråde programmet ditt. Tenk deg at hver gren av programmet ditt blir utført i en egen tråd, og en variabel forteller i hvilken tråd det aktuelle programmet virkelig er (hvis mulig på en kryptisk måte). Da vil sidekanalanalyse være mye vanskeligere å utføre.
Sidekanalangrep har blitt undervurdert for programvare-reverse engineering, det kan drastisk øke hastigheten på omvendt av mange programmer. Men på samme tid eksisterer forvirkningsteknikker og må utvikles spesielt for å reversere programvare. Så ikke bli overrasket om du ser flere og flere nyheter relatert til dette feltet.