Objavljeno:

Šifriranje notranjega pomnilnika telefonov s sistemom Android

Welcome to the brave new world where the ciphers are strong, but the entropy is weak.

Na sodobnih pametnih mobilnikih uporabniki hranijo številne občutljive podatke. Seznam svojih stikov, SMS sporočila, elektronsko pošto, fotografije, zgodovino brskanja in gesla za številne spletne strani, itd. Če želimo podatke na svojem mobilnem telefonu dobro zaščititi pred zlorabo ali nepooblaščenim dostopom, jih je potrebno šifrirati.

Šifriranje notranjega pomnilnika v operacijskem sistemu Android se uporablja od različice 3.0 dalje. Za šifriranje notranjega pomnilnika se v Androidu uporablja dm-crypt, ki med fizičnim nosilcem podatkov in datotečnim sistemom ustvari še eno navidezno plast, ki skrbi za transparentno šifriranje podatkov. Dm-crypt je sicer v Linuxu standarden sistem za šifriranje nosilcev podatkov.

Android za šifriranje uporablja 128-bitni AES ter ESSIV:SHA256. Glavni ključ za dostop do šifrirane vsebine (ang. master key) je šifriran z 128-bitnim ključem ter z algoritmom AES. Ta ključ je šifriran s ključem, ki izvira iz uporabnikovega gesla ter 2000 rotacij PBKDF2 (Password-Based Key Derivation Function 2) funkcije z 128-bitno naključno soljo (ang. random salt). Šifrirani glavni ključ, skupaj s soljo ter nekaterimi metapodatki se nahaja na koncu šifriranega razdelka (zadnjih 16 kb).

Uporaba tim. glavnega gesla omogoča hitro spreminjanje gesla za odklep šifriranega pomnilnika. Če namreč spremenimo šifrirno geslo, se spremeni le šifriranje vsebine glavnega ključa, s katerim so potem šifrirani podatki v notranjem pomnilniku, ne spremeni pa se tudi sam glavni šifrirni ključ. Uporaba dm-crypta nam tako tudi na mobilnih telefonih ponuja možnosti za kriptografsko zaščito podatkov, ki je (v teoriji) primerljiva s tisto, ki jo imamo na osebnih računalnikih.

Varnost včasih ni odvisna samo od kvalitete šifrirnih algoritmov…

A s pomembno razliko. Implementacija šifriranja notranjega pomnilnika na Androidu namreč vsebuje resno varnostno pomankljivost, ki napadalcu omogoča uspešen napad z grobo silo (ang. brute force attack). Geslo s katerim zašifriramo prej omenjeni glavni ključ je namreč enako kot geslo za zaklep zaslona. Poleg tega je to geslo omejeno na največ 16 znakov (pa tudi če ne bi bilo – težko si je predstavljati, da bodo uporabniki za vsak odklep zaslona na telefonu vnašali 16 znakov dolgo geslo). Razlog za to je seveda uporabnost, saj bo uporabnik uporabljal samo eno geslo, hkrati pa bo s tem tudi zelo zmanjšana možnost, da bi uporabnik pozabil geslo za dešifriranje notranjega pomnilnika.

Šifriranje notranjega pomnilnika v Androidu.

Šifriranje notranjega pomnilnika v Androidu.

Kot rečeno, ima rešitev, ki predvideva uporabo enotnega gesla veliko prednost s stališča uporabniške prijaznosti. Težava tega pristopa pa je, da geslo za odklep zaslona in geslo za odklep notranjega pomnilnika iz stališča varnosti zasledujeta dva povsem različna cilja.

V primeru, da uporabnik vpiše napačno geslo za odklep zaslona, bo Android za nekaj časa onemogočil  ponovno vnašanje gesla (gre za tim. rate limiting). Če bo uporabnik ponovno skušal vnesti napačno geslo, bo Android telefon popolnoma zaklenil in bo potreben odklep s pomočjo Google računa (ali pa tovarniško resetriranje telefona) oziroma bo vsebino telefona popolnoma izbrisal. Zaradi teh omejitev nam tudi kratka gesla nudijo dovolj visoko stopnjo varnosti, saj nam sistem onemogoča preizkušanje gesel v nedogled.

Šifriranje notranjega pomnilnika v Androidu je nepovraten proces.

Šifriranje notranjega pomnilnika v Androidu je nepovraten proces.

Precej drugačna pa je situacija v primeru gesla za odklep notranjega pomnilnika telefona. Načeloma Android sicer omejuje število poskusov vnosa gesla (in po določenem številu neuspešnih poskusov pobriše telefon), a napadalec lahko vsebino telefona prekopira na svoj nosilec podatkov, šifrirane podatke pa nato poskuša odkleniti z neomejenim ugibanjem gesel. Da je to tudi praktično mogoče (in to celo na telefonih z zaklenjenim zagonskim nalagalnikom (ang. bootloader)), je julija 2012 na konferenci Defcon 2012 prikazal Thomas Cannon iz podjetja Viaforensics.

Čeprav so torej šifrirni mehanizmi za zaščito notranjega pomnilnika v osnovi relativno dobri, pa je samo zaščito mogoče relativno enostavno zlomiti (če imamo kopijo šifriranega pomnilnika), saj bodo uporabniki verjetno uporabili razmeroma kratko in tudi enostavno geslo, ki ga je mogoče učinkovito napasti z napadom s slovarjem (ang. dictionary attack) ali napadom z grobo silo.

Omenjena rešitev uporabe enotnega gesla za šifriranje notranjenga pomnilnika in odklep zaslona je uporabniško sicer zelo prijazna, iz varnostnega stališča pa predstavlja recept za katastrofo.

A na srečo tudi za to težavo obstaja rešitev.

Spreminjanje gesla za šifriranje notranjega pomnilnika z Cryptfs Password

Ker sta gesli za dm-crypt in odklep zaslona v resnici fizično ločeni, je gesli mogoče tudi ločeno spreminjati. Za to potrebujemo posebno aplikacijo Cryptfs Password, ki omogoča spreminjanje gesla za dostop do notranjega pomnilnika. Aplikacija sicer zahteva tim. korenski dostop (in posledično nameščeno aplikacijo SuperSU oziroma Superuser), kar pomeni, da moramo svoj Androidni telefon pred namestitvijo te aplikacije odkleniti (“rootati”).

Pomembno opozorilo: telefon je potrebno najprej odkleniti in nanj namestiti SuperSU oziroma Superuser, šele nato pa ga damo šifrirati. Odklepanje (“rootanje”) šifriranega telefona je namreč precej težavno (oziroma praktično nemogoče), saj orodja za odklepanje telefona ne znajo dostopati do šifriranega pomnilnika. Če smo telefon že predhodno šifrirali, ga je potrebno najprej tovarniško resetirati (ang. factory reset), ga nato odkleniti in nato ponovno šifrirati.

Aplikacija Crypfs Password.

Aplikacija Crypfs Password.

Ko imamo telefon odklenjen (“rootan”) in šifriran, poženemo aplikacijo Cryptfs Password. Njena uporaba je enostavna. Najprej vnesemo trenutno geslo, nato pa dvakrat novo geslo. S klikom na “Change password“, se geslo za šifriranje notranjega pomnilnika spremeni, geslo za odklep zaslona pa ostane nespremenjeno. Pomembno je tudi poudariti, da Cryptfs Password omogoča nastavljanje gesel daljših od 16 znakov.

Pomembno opozorilo: geslo za šifriranje notranjega pomnilnika je sedaj spremenjeno. A če bomo kasneje spremenili geslo za odklep zaslona, se bo hkrati z njim spremenilo tudi geslo za šifriranje notranjega pomnilnika! Zato je potrebno ob vsaki spremembi gesla za odklep zaslona ponovno pognati Cryptfs Password in geslo za šifriranje notranjega pomnilnika ponovno nastaviti!

Novega gesla ni priporočljivo pozabiti...

Novega gesla ni priporočljivo pozabiti…

Kaj pa ostanki nešifriranih podatkov?

Ko zaženemo šifriranje notranjega pomnilnika telefona (pomembno se je zavedati, da zunanje pomnilniške kartice niso šifrirane), se pojavi vprašanje, kaj se zgodi s “starimi”, nešifriranimi podatki. Teoretično bi namreč na tim. praznem prostoru pomnilnika lahko ostale kopije starih, nešifriranih podatkov. A kot je razvidno iz specifikacij za implementacijo šifriranja v Androidu, šifriranje poteka tako, da Android prebere vsak sektor pomnilnika (oziroma bločne naprave – ang. block device) in ga zapiše nazaj kot šifriran sektor (ang. crypto block device). Na ta način Android prepiše celoten pomnilnik, tudi tim. prazen prostor.

Tako teorija. V praksi pa ta postopek lahko ni povsem popoln. Prvi problem lahko predstavlja krmilnik bliskovnega pomnilnika (ang. flash memory controller), ki morda podatkov na “izpraznjenih” blokih v resnici fizično ne zapiše (operacijskemu sistemu pa napačno sporoči, da podatke je prepisal).

Rešitev za ta problem je razmeroma enostavna. Telefon je po šifriranju potrebno do konca napolniti z naključnimi podatki, kar bo povzročilo zapolnitev vseh blokov pomnilnika s šifriranimi podatki. Te podatke nato izbrišemo, na koncu pa lahko poženemo še fstrim (za podprte naprave je na voljo tudi aplikacija LagFix (fstrim) Free). Omenjeni ukaz na SSD nosilcih podatkov izvede funkcijo TRIM, ki nepovratno izbriše podatke na tim. neuporabljenih blokih pomnilnika.

Drugi, resnejši problem pa predstavlja tehnologija wear leveling, ki se uporablja pri podaljševanju življenjske dobe USB ključev, SSD naprav in ostalih naprav, ki uporabljajo tim. flash RAM. Pri tej tehnologiji gre za to, da se pomnilniške celice v napravah z tim. bliskovnim pomnilnikom (tim. flash pomnilnik) po določenem številu zapisovanj podatkov vanje izrabijo. Krmilnik naprave zato podatke iz bolj obrabljenih celic premešča na manj uporabljane celice (in ta mehanizem se imenuje wear leveling) s čimer zagotovi bolj enakomerno izrabo celotne naprave.

Težava je v tem, da imajo nekatere pomnilniške naprave nekaj nadomestnih pomnilniških celic (ang. spare cells). Pomnilniške celice namreč po določenem številu zapisovanj postanejo neuporabne, in sicer na način, da vanje ni več mogoče zapisovati novih podatkov, oziroma podatke iz njih izbrisati, branje pa je še vedno mogoče (drugače povedano, celice ohranijo zmožnost branja, izgubijo pa možnost zapisovanja in brisanja (ang. read-only). Seveda pa je potrebno omeniti, da je za opisano branje vsebine pomnilniških celic potrebna ustrezna (forenzična) oprema.

Opisano pomeni, da v resnici nikoli ne moremo vedeti ali kakšni nešifrirani podatki niso ostali na kakšni izmed pomnilniških celic, ki je bila nadomeščena z nadomestno celico. Zato je priporočljivo, da na nešifriran pomnilnik nikoli ne zapisujemo kakršnikoli občutljivih podatkov – občutljive podatke (različne nastavitve, gesla SMS sporočila, podatke o klicih,…) zapisujmo izključno na šifriran pomnilnik.

Kar pomeni, da mora biti prva stvar ob nakupu novega telefona vzpostavitev šifriranja, šele nato pa na telefon lahko začnemo prenašati občutljive podatke.

Naprednejši napadi na šifriranje v Androidu

V nadeljavanju si bomo pogledali še tri naprednejše napada na šifriranje notranjega pomnilnika v Android sistemih, ki napadalcu omogočijo zlom šifriranja tudi v primeru uporabe močnih gesel.

Cold Boot napad na šifriranje notranjega pomnilnika mobilnih telefonov

Eden izmed možnih napadov na šifriranje notranjega pomnilnika je Cold Boot napad. Napad napadalcu omogoča pridobitev šifrirnih ključev. Napada sicer ni prav enostavno izvesti (več podrobnosti o napadu si lahko preberete v članku Napadi na delovni pomnilnik), raziskovalci Tilo Müller, Michael Spreitzenbarth in Felix Freiling iz nemške univerze Friedrich-Alexander-Universität Erlangen-Nürnberg pa so dokazali, da je Cold Boot napad mogoče izvesti tudi na mobilnih telefonih.

Raziskovalci so mobilni telefon ohladili na -15 stopinj Celzija, nato pa s pomočjo orodja FROST (forensic recovery of scrambled telephones) izvedli Cold Boot napad. Na ta način so pridobili šifrirne ključe, kontakte, fotografije, seznam obiskanih spletnih strani in ostale podatke neposredno iz pomnilnika RAM.

Proti Cold Boot napadu na mobilnih telefonih (za razliko od osebnih računalnikov) še ni neke resne zaščite, a po drugi strani je res, da napada ni prav enostavno izvesti, vsaj brez ustreznih predpriprav ne.

Evil Maid napad na šifriranje notranjega pomnilnika mobilnih telefonov

Druga možnost je izvedba tim. napada zlobne sobarice (ang. Evil Maid attack). Gre za napad, pri katerem napadalec (navadno fizično) dostopi do sistema ter nanj namesti programski beležnik tipkanja.

Na omenjeni napad – sicer za osebne računalnike – je leta 2009 opozorila znana strokovnjakinja za informacijsko varnost Joanna Rutkowska, ki je leta 2009 praktično demonstrirala napad zlobne sobarice na računalnik v celoti šifriran z znanim šifrirnim programom TrueCrypt. Razvila je poseben program, ki nekoliko “popravi” originalno TrueCryptovo programsko kodo, ki uporabnika vpraša za geslo. “Popravljena” programska koda vpisano geslo prestreže in posreduje TrueCryptu, pred tem pa ga še shrani na poseben prostor na disku. S posebnim programom je nato ob naslednjem fizičnem dostopu do računalnika mogoče izpisati shranjeno geslo.

Evil Maid napad je mogoče izvesti tudi na mobilnih telefonih. Julija 2012 je Thomas Cannon iz podjetja Viaforensics na konferenci Defcon 2012 predstavil idejo (stran 28) za izvedbo Evil Maid napada na mobilne telefone. Kot je opozoril, je na sistemski razdelek mobilnega telefona mogoče namestiti strojni komplet (ang. rootkit) oz. aplikacijo, ki ali prestreže geslo ali pa napadalcu omogoči oddaljeni dostop do pametnega telefona. Takšno aplikacijo je mogoče (samodejno) naložiti tudi preko posebej prilagojenega USB polnilca mobilnega telefona (gre za tim. zlobni USB polnilec). (Zato si ni priporočljivo izposojati polnilcev od neznancev).

V prispevku je Cannon predstavil še nekaj povsem izvedljivih idej za napad na šifrirane mobilne telefone, npr. podtikanje zlonamernih aplikacij, lažno digitalno podpisovanje aplikacij (več o tem v predavanju Jeffa Forristala iz Bluebox Security, Android: One Root to Own Them All), itd.

Zaščita proti takšnim napadom je ustrezna varnostna kultura (pazljivost pri nameščanju aplikacij, redno posodabljanje sistema, itd…). Proti Evil Maid napadu se je sicer mogoče boriti z uporabo tim. pametnih kartic oz. strojnih žetonov (ang. hardware token), ki vsebujejo mikroprocesor ter digitalno potrdilo, s pomočjo katerega odklenemo dostop do podatkov (npr. TPM čip), oziroma zagon sistema iz neokuženega prenosnega medija. Žal so te rešitve v praksi uporabne le na področju osebnih računalnikov…

Napad preko radijskega procesorja

Mobilni telefoni vsebujejo dve vrsti procesorjev. Prvo vrsto predstavlja tim. aplikacijski procesor (ang. general-purpose applications processor), na katerem tečejo operacijski sistem in uporabniške aplikacije. Poleg tega procesorja pa mobilni telefoni vsebujejo še tim. radijski procesor (ang. baseband processor; zanj se uporabljata tudi izraza modem ali radio), na katerem pa teče tim. realno-časovni (ang. real time OS; v mobilnih omrežjih je pri komunikaciji med mobilnim telefonom in bazno postajo zelo pomembna pravilna časovna usklajenost) in zaprtokodni operacijski sistem. (Poleg tega se še en procesor nahaja tudi na SIM kartici).

Za radijske procesorje je sicer znano, da vsebujejo varnostne ranljivosti preko katerih je mogoč dostop do mobilnega telefona. Na to je sicer že leta 2010 opozoril Ralf-Philipp Weinman iz University of Luxembourg na predavanju z naslovom The Baseband Apocalypse oziroma v članku z naslovom Baseband Attacks: Remote Exploitation of Memory Corruptions in Cellular Protocol Stacks. A odkritje razvijalcev operacijskega sistema Replicant iz začetka leta 2014 je pokazalo, da pri tem ne gre zgolj za varnostne pomankljivosti.

Replicant je operacijski sistem za mobilne telefone, ki temelji na Androidu. A za razliko od Androida je popolnoma odprt in ne vsebuje nobene lastniške kode. Skupina razvijalcev, ki razvija Replicant, je pred kratkim ugotovila, da Android, ki teče na telefonih Samsung Galaxy vsebuje stranska vrata (ang. backdoor), preko katerih je mimo vseh zaščit preko omrežja mogoče dostopati do vsebine mobilnega telefona oziroma uporabniških podatkov (seznam dokazano ranljivih telefonov in analiza zlonamerne kode).

Kot so odkrili razvijalci Replicanta, v Androidu, ki teče na telefonih Samsung Galaxy, teče posebna programska koda, ki omogoča neposredno komunikacijo z radijskim procesorjem in sicer na način, da radijskemu procesorju omogoča neposreden dostop do datotečnega sistema v Androidu (branje, zapisovanje in brisanje datotek). Ugotovljeno je bilo tudi, da programska koda teče s takšnimi privilegiji, da je preko radijskega procesorja mogoč tudi dostop tudi do uporabniških podatkov. Glede na to, da je radijski procesor aktiven praktično ves čas, to pomeni, da napadalec lahko preko omrežja mimo vseh kontrol v Androidu dostopa do datotečnega sistema oziroma uporabniških podatkov na telefonu.

Težava je v tem, da je radijski procesor v večini mobilnih telefonov na nek način primaren. To pomeni, da ima popoln nadzor nad vso strojno opremo (kamera, mikrofon, zaslon) – in to mimo aplikacijskega procesorja. Sicer je radijski procesor mogoče izolirati od preostalega telefona, vendar je naprav, ki bi to omogočale zelo malo. Replicant je omenjena stranska vrata sicer onemogočil, a težava je v tem, da zaradi prej navedenega radijski procesor morda še vedno lahko prevzame nadzor nad aplikacijskim procesorjem, in z njegovo pomočjo prepiše programsko opremo na način, da si ustvari nova stranska vrata.

Naj še omenimo, da je proizvajalcev radijskih procesorjev, ki se uporabljajo v vseh sodobnih pametnih mobilnikih šest, večinski tržni delež pa imata Intel Mobile Communications (bivši Infineon) in Qualcomm. Kar pomeni, da ima morebitni napadalec, ki bi v proizvodni proces čipov uspel vstaviti zlonamerno programsko kodo, z napadom na le omejeno število proizvajalcev dostop do praktično vseh mobilnikov na svetu…

Zaključek

Kot smo videli, operacijski sistem Android šifriranje nosilcev podatkov oz. notranjega pomnilnika prinaša tudi na mobilno platformo. A čeprav je sama implementacija šifriranja na videz enostavna za uporabo, uporabljeni algoritmi pa močni, je samo zaščito mogoče relativno enostavno zlomiti. Šibka točka Androidnega šifriranja notranjega pomnilnika so namreč ravno gesla, saj bodo uporabniki verjetno uporabili razmeroma kratka in tudi enostavna gesla. Kratka in enostavna gesla pa je mogoče učinkovito napasti z napadom s slovarjem (ang. dictionary attack) ali napadom z grobo silo (ang. brute force attack).

Problem sodobnega šifriranja tako ni varnost oz. kvaliteta šifrirnih algoritmov ter dolžina ključev, pač pa glavni izziv po eni strani predstavlja zagotavljanje dovolj visoke stopnje entropije uporabljenih gesel, po drugi strani pa mobilne platforme enostavno že v sami zasnovi vsebujejo takšne varnostne ranljivosti, da bi bilo za dovolj visoko stopnjo zaščite mobilne naprave poterbno zasnovati povsem na novo.

Uporaba aplikacije Cryptfs Password je na prvi pogled sicer precej elegantna rešitev problema prekratkih gesel za dostop do šifrirane kopije notranjega pomnilnika, vendar pa uporaba te aplikacije po drugi strani prinaša nove težave.

Za namestitev aplikacije Cryptfs Password je namreč potrebno mobilni telefon odkleniti (“rootati”). Predpogoj za odklep (“rootanje”) telefona pa je odklep zagonskega nalagalnika (ang. bootloader). Ko pa imamo zagonski nalagalnik odklenjen, pa je na mobilni telefon zelo enostavno namestiti orodje za obnavljanje ROM podatkov (npr. ClockworkMod Recovery (CWM), Team Win Recovery Project (TWRP), itd.), s katerim potem napadalec zelo enostavno izdela kopijo (šifriranega) notranjega pomnilnika. To kopijo lahko nato napade s preiskušanjem vseh možnih kombinacij gesel (z metodo grobe sile ali pa z napadom s slovarjem).

Po drugi strani pa je oziroma naj bi bilo kopijo ROM-a oz. kopijo (šifriranega) notranjega pomnilnika pri zaklenjenem zagonskem nalagalniku (ang. bootloader) precej težje narediti. A z ustrezno opremo je mogoče tudi to. Zato sam zaklep zagonskega nalagalnika po našem mnenju ne predstavlja ustrezne zaščite.

Za višjo stopnjo varnosti je po našem mnenju priporočljivo s pomočjo aplikacije Cryptfs Password nastaviti dovolj dolgo geslo oziroma geslo z dovolj entropije. To pomeni vsaj 30 znakov ali več (gesla potem ne smemo pozabiti). Seveda pa tudi na področju mobilne varnosti ne smemo pozabiti na ustrezno varnostno kulturo. Zlasti kar se tiče nameščanja aplikacij, pa tudi na področju fizične varnosti.

Popolne varnosti pa seveda ni mogoče zagotoviti. Razen, če mobilni telefon vržemo v koš za smeti.

Kategorije: Informacijska tehnologija, Informacijska varnost
Ključne besede: Android, mobilna telefonija, šifriranje