Slik unngår du at din app blir en sikkerhetstrussel

Stadig flere bedrifter tar i bruk mobile apps som virksomhetskritiske applikasjoner. Dette vil kreve lang større fokus på sikkerhet. Uten kjennskap til de mest vanlige sikkerhetshullene på mobil vil både applikasjonen og baksystemer være åpne for angrep av hackere.

Mens det lenge har vært fokus på sikkerhet i serverbaserte applikasjoner virker det som det er mindre fokus på dette i applikasjoner for mobil. Dette gjør seg utslag i at mange applikasjoner har sikkerhetshull og jeg vil i denne artikkelen sette fokus på de mest vanlige av dem.

Usikker lagring av sensitive data

Veldig mange apps håndterer personopplysninger eller andre sensitive data som f.eks brukernavn og passord. Det er viktig å ikke anta at disse dataene er sikre selv om de ligger på telefonen og brukere ikke har direkte tilgang til dem.

Uvedkommende vil kunne få tak i data som ligger på telefonen på flere ulike måter: Gjennom sikkerhetshull i operativssystem, ved at den blir stjålet og jailbreaket/rootet eller gjennom at det tas backup til ulike nettskytjenester som iCloud.

På iOS er det vanlig å lagre innstillinger for en bruker ved å bruke NSUserDefaults klassen. Denne klassen må aldri brukes til å lagre sensitive data ettersom alle data lagres som klartekst.

Det er også vanlig å ha egne innstillinger for en app og hente ut disse ved hjelp av NSUserDefaults. Da er det viktig å huske at selv om man velger å angi at et tekstfelt er sikkert (TextField is secure), så lagres fremdeles teksten i klartekst.

Hvordan lagre data sikkert

For lagring av brukernavn og passord bør man heller bruker mekanismene som finnes i operativsystemet, det vil si keystore på Android og keychain på iOS. For iOS finnes det en KeychainItemWrapper som forenkler denne oppgaven.

På mobile enheter er det vanlig å lagre data i SQLite. Har du behov for å lagre sensitive data i en database finnes det en kryptert variant av SQLite: SQL Cipher.

For lagring av filer kan det være greit å se nærmere på Data Protection API hvis man jobber med iOS. På Android er det viktig å ikke lagre sensitive data på minnekort og passe på at alle filer lagres med Context.MODE_PRIVATE.

Android Intent Spoofing

Intents brukes for å kommunisere mellom komponenter og/eller apper i Android. Intents kan bli misbrukt av ondsinnede apper til å sende data til din app og på den måten utnytte sikkerhetshull i applikasjonen din. Du kan sikre deg mot dette ved å sørge for at komponenter i appen din ikke blir tilgjengelig utenfor appen ved å sette android:exported=false på komponenten:

Ellers kan du bruke permissions for å styre hvem som får tilgang til å sende data til din komponent:

Unauthorized intent receipt

Akkurat som at intents kan misbrukes ved at en ondsinnet app sender intents til din app, kan intents også misbrukes ved at en ondsinnet app mottar intents den aldri skulle ha hatt. Dette kan løses ved å angi hvilken klasse som skal motta en intent eller å bruke rettigheter.

// Angi klasse som skal motta intent
Intent i = new Intent();
i.setClassName("some.pkg.name","some.pkg.name...");

// Eller ved å bruke rettigheter: 
Intent i = new Intent(); 
i.setAction("com.company.action"); 
sendBroadcast(i, "com.company.permission");

iOS URL schemes

iOS har en mekanisme for å starte en app og sende data fra en nettside eller en annen nettside, iOS URL schemes. Dette fungerer som vanlige lenker i en nettside:

Starte IMDB app og søke etter Godfather

Poste en tweet via Twitter-appen 

Et eksempel på hvordan en app kan misbrukes er Skype appen, hvor man ved å legge inn i en skjult iframe tag kunne få appen til å ringe et vilkårlig telefonnummer:

skype2

I nyere versjoner av Skype-appen er dette løst ved at brukeren måtte bekrefte nummeret som skulle ringes ved å trykke OK.

Pass derfor på å validere data som kan sendes inn til appen og be brukeren eventuelt bekrefte operasjoner.

Ordliste

Tekstfelter som bruker autocorrect kan være en kilde til lekkasje av sensitive data. Dersom brukeren skriver inn et ord som ikke finnes i ordlista, vil ordet bli lagt til i ordlista. På iOS finner man ordlista i fila Library/Keyboard/dynamic-text.dat.

iosscreenshot2

Løsningen er derfor å skru av autocorrect på tekstfelter hvor det kan skrives inn sensitiv informasjon.

Skjermdumper

Visste du at iOS tar skjermdumper av appen hver gang du går ut av den og tilbake til hjemskjermen? Dette gjør iOS for å kunne animere at appen flyr fra deg når du lukker appen og mot deg når du starter den igjen (Android gjør også det samme i noen situasjoner).

Løsningen her å skjule sensitive data når appen blir inaktiv, enten ved å skjule felter eller å legge noe over som skjuler feltene. 

Mer om sikkerhetsrisikoer i apps

OWASP har et eget mobile project og har utviklet en iPhone app og Android app der du kan få mer informasjon om sikkerhetsrisikoer man bør unngå på på de respektive plattformene.

For mer informasjon om sikkerhet i Android kan foredraget Seven Ways to Hang Yourself with Android av Yekaterina Tsipenyuk O'Neil og Erika Chin anbefales.

Jeg holdt en lyntale på Booster 2013 i Bergen som går i noe mer detalj på dette emnet. Under kan du se videoen fra foredraget (kilde: https://vimeo.com/boosterconf). 

Kjenner du til gode ressurser rundt sikkerhet i apps? Del dem gjerne i kommentarfeltet nedenfor.

Litt om forfatteren

Anders-Skar

Anders Skar

Anders er frontend-arkitekt og utvikler med spesiell forkjærlighet for mobile løsninger. Har jobbet med utvikling av webløsninger i snart 20 år og er spesielt opptatt av at vi skal lage brukervennlige løsninger.
comments powered by Disqus