Skvělé nové funkce Androidu 4.4 Kitkat: Vaše síť může být odposlouchávána

Zlaté pravidlo praví: „Nešahej na to, co funguje.“ Inu, opět jsem neuposlechl a dokopal jsem se k upgradu Nexusu 7 na poslední verzi: 4.4.2. Upgrade jsem prováděl z nějaké již historické verze. Navzdory výhružkám o stažené aktualizaci systému, kterou mě tablet prudí už déle než rok, jej nelze automaticky upgradovat, pokud byl rootnutý (tj. chtěl jsem být administrátorem svého hardwaru) a byl potřeba ruční zásah. Z KitKatu asi nikdo nebyl doslova nadšený, ikonky překopané po vzoru IOS 7, mizející baterka a tak podobně. Skutečnost byla ale ještě daleko děsivější. Jaké to bylo překvapení, když po prvním naběhnutí systému v notifikační liště byl vykřičník s nápisem: „Vaše síť může být odposlouchávána.“ Jelikož notifikaci lze odsunout do pryč (byť se tam po dalším restartu opět objeví), vývojáři naznali, že je třeba si hlášku užít více a tak se ještě o něco větší vykřičník se stejným nápisem zobrazuje i v druhé liště s tlačítky pro nastavení, odkud už se ho nelze zbavit nijak! 

Co tedy s tím? Ač jsem z toho vytočen i po x dnech u ledu, uvedu napřed TL+DR verzi návodu, jak se té otrapy zbavit, předtím než dopíšu zbytek hateblogu na téma, proč by se vynálezce tohoto prvotřídího bezpečnostního zlepšení na to měl radši vysrat a jít prodávat banány. Zmíněná hláška se zobrazuje v případě, že uživatel do interního úložiště uložil nějaký CA certifikát (což stále uložit jde, jenom se začne zobrazovat tahle hrůza). Úložiště se dělí na systémové (kde jsou CA certifikáty již předinstalované) a uživatelské, kde si je uživatel přidává sám. Pokud už máte to štěstí a vlastníte root práva ke svému hardwaru, můžete certifikát smazat a místo toho ho nacpat do systémových (kde už žádná hláška neprudí). Postup je nějak takto:

  • Na počítači s openssl utilitou si předpřipravíme náš certifikát:
    • pomocí openssl x509 -in certifikat.pem -subject_hash zjistíme otisk předmětu našeho certifikátu, vypadne něco jako: 0b112a89 (to si pamatujeme, použijeme to dále)
    • přidáme k certifikátu textovou část: openssl x509 -in certifikat.text -text > novy_certifikat.pem
    • v textovém editoru otevřene tento nový soubor a textovou část (tj. to co není uvozeno ---BEGIN/END CERTIFICATE---) přesuneme na konec souboru
    • soubor s certifikátem přejmenujeme na <otisk předmětu>.0 (tečka nula přidáme)
    • tento náš nově vzniklý soubor zkopírujeme do telefonu/tabletu, kde s ním budeme dále pracovat
  • v zařízení si otevřeme terminál, vlezeme na roota (příkaz su)
  • zkopírujeme certifikát: cp /kde/je/nakopi­rovan/nas/cer­tifikat /system/etc/se­curity/cacerts/
  • často se stává, že /system je read only a tedy příkaz cp selže. V tom případě remountujeme: mount -o remount,rw /system (a příkaz cp opakujeme)
  • nastavíme práva na souboru s certifikátem: chmod 0644 /system/etc/se­curity/cacerts/<sou­bor s naším certifikátem>
  • pokud jsme remountovali /system, uděláme jej opět read only: mount -o remount,ro /system

Certifikát z uživatelské sekce tedy můžeme s klidem smazat. Fungovat by měl nadále a otravná hláška by měla být fuč. Teď tedy ještě nějaké vysvětlení, co ta hláška znamená, proč je to úplná kravina, co se tak akorát tak stane a proč si myslím sprosté věci o dané osobě.

Spousta lidí možná ani neví, co a proč to tam vlastně je (za to ta hláška je naprosto parádně vyděsí). Daný certifikát jim nainstaloval jejich IT a tak podobně. K čemu tam vlastně je? Celá zábava s certifikáty je kvůli šifrování a podepisování. Při připojení např. přes WiFi (ale nejen tam…) lítá obsah síťového provozu okolo a prakticky každý si jej může poslechnout. Což není zrovna to pravé, když takhle po internetové kavárně lítají vaše hesla od mailů a tak podobně. Proto máme takovou hezkou věc, jako asymetrickou kryptografii. Funguje to tak, že jedna strana si vygeneruje pár klíčů – pár k sobě patří, jeden je veřejný, druhý soukromý. Platí, že co se zašifruje veřejným klíčem, lze dešifrovat pouze soukromým, který k němu patří. Můžete tedy nakrásně odeslat veřejný klíč po síti, kterou vám odposlouchávají a druhá strana vám pak může posílat šifrovaná data, aniž by to ten mezi byl schopen přečíst. To funguje hezky do doby, než ta strana mezi může do té komunikace i zasahovat – v tom případě by zarazila výměnu veřejného klíče a místo něj poslala svůj. A tady nám do toho vstupují certifikáty a podpisy. Podpis je defakto také šifrování – jen funguje obráceně, tj. zašifruje se soukromým klíčem a veřejným se dešifruje. A certifikát je pouze veřejný klíč doplněný nějakými meta atributy (u serverů typicky adresa toho serveru, u certifikátu pro lidi tam je e-mailová adresa, jméno, atd.) a tento celek je podepsán nějakou třetí stranou. (Tedy třetí stranou, která má zase svůj certifikát). Pokud tedy aplikace v zařízení komunikuje se serverem, dostane od něj certifikát, na tomto certifikátu ověří jeho podpis (typicky ho ověří tak, že certifikát třetí strany, který podepsal certifikát serveru, má v sobě fixně uložený už od výrobce) a v případě že podpis sedí, certifikátu důvěřuje. Tahle třetí strana (které se říká certifikační autorita – proto CA certifikáty) se potom zavazuje nějak kontrolovat, že ten, komu ten certifikát vydala, je doopravdy ten, za koho se vydává.

A tady právě narážíme na jeden problém. Abysme mohli posoudit správnost ceritikátu, co jsme dostali, musíme mít v našem zařízení již nainstalovaný certifikát autority, která jej serveru vydala. Tedy, nemusí to být nutně konkrétně tahle autorita – v praxi funguje i to, že autorita A, kterou máme v našem zařízení, podepíše autoritu B a tudíž i certifikáty podepsané autoritou B jsou v našem zařízení uznávané. Prakticky na každém běžném operačním systému, který se dnes používá (a je úplně jedno, jestli mobilní IOS/Android, desktopové Windows/Linux/Mac OS X nebo něco dalšího) nalezneme okolo padesátky takto předinstalovaných CA certifikátů, které tvůrce daného systému považoval za bezpečné. Pokud naopak máme nějakou aplikaci, kterou chceme takto zabezpečit, jsme nuceni pro ni certifikát zakoupit. Tedy certifikačním autoritám, které jsou již v běžně používaných systémech takto zakořeněné, potom platíme za vydání certifikátu pro nás (a je to víceméně jediný důvod, proč za to platit – jinak si zadarmo můžeme vytvořit autoritu svojí). Co se stane, pokud narazíme na aplikaci, která zašle certifikát, který náš systém nemůže ověřit, viděl minimálně u webových prohlížečů asi každý. Zobrazí se taková ta hezká stránka upozorňující, jak je to nebezpečné. Firefox po x kliknutích nabízí přidání výjimky, u chrome je potřeba potvrdit pokračování na stránku, IE vybízí odkazem se zelenou fajfkou „rychle odsud pryč.“ Pokud tuhle obrazovku potvrdíme a jdeme dále na web, pak jsme buď přesvědčeni, že se nám vrátil správný certifikát (třeba jsme si to ověřili jinak) nebo to prostě ignorujeme a klidně jsme možná potvrdili falešný certifikát někoho, kdo nás doopravdy odposlouchává.

Nicméně, pokud mám nějakou aplikaci, kterou používám pouze já, pravděpodobně nebudu chtít za vydání certifikátu pro ní zaplatit. Podobně u firem, které mají nějaké interní aplikace, kam přistupují pouze zaměstnanci, je zbytečné platit za komerční certifikát, když můžeme naší certifikační autoritu přidat do zařízení, které do dané aplikace přistupovat budou. To je regulérní postup a funguje úplně normálně, až na to, že u posledního androidu se po přidání certifikátu zobrazí tato krásná varovná hláška. Co tedy ona hláška přesně znamená? Prakticky ty naimportované certifikáty slouží pouze k ověření podpisu a nic víc. Tedy ať ověřuju certifikát vydaný pro kohokoliv, pokud se podpis shoduje, projde to. Takže pokud ta domácí doimportovaná autorita vydá certifikát pro mé elektronické bankovnictví, zařízení to sežere a nebude si stěžovat. Stejně tak pokud ten samý certifikát vydá kterákoliv z těch systémových autorit. Těch je tam sice okolo 50, nicméně SSL Observatory ukázalo, že díky řetězení ověření (tedy že platný je certifikát i vydaný někým jiným, komu ale jeden z těch 50 důvěřuje), že těch subjektů, které takto můžou také vydat platný certifikát pro cokoliv, je více než 1200 (a mezi tím třeba všechny Německé univerzity). Tedy krom mé domácí autority existuje dalších než 1200 subjektů, které si klidně můžou vydat certifikát pro jakoukoliv aplikaci používám a tablet si na ní stěžovat nebude. Není to ideální? Není, ale nikdo zatím nevymyslel nic lepšího (pokud si opravdu nechcete každý certifikát ověřovat ručně…)

Samotná hláška je průdící, dalo by se i pochopit, že se ve výchozím nastavení objevuje. Pokud by ale alespoň nějakým nastavením šla vypnout. A to nejde. Nicméně i to by šlo třeba s dalším updatem napravit. Několik lidí toto chování reportovalo (podle mě zcela oprávněně) jako chybu. Chyby byly pokaždé uzavřené (podle mě zcela nesmyslně) jako ‚Works as intended,‘ tedy ‚Funguje jak bylo zamýšleno.‘ Já si nicméně nejsem jistý tím, jestli se nad tím vůbec někdo zamýšlel. Ale tak schválně se zamyslíme, jak se takový uživatelský CA certifikát může dostat do tabletu a jaké to má následky:

  • uživatel si jej naimportoval sám, protože je to jeho vlastní autorita, kterou používá
    • pokud uživatel nemá v plánu odposlouchávat sám sebe, tak to ničemu nevadí
  • uživatel si jej naimportoval sám, protože mu to radila nějaká chytrá webová stránka slibující hromadu porna zdarma
    • uživatel je nesvéprávný debil, kterému zobrazování jakékoliv varovné hlášky stejně nepomůže. Kdyby mu ta samá stránka napsala, ať pošle číslo své kreditky s datem expirace a CCV kódem, tak ho pošle
  • do zařízení certifikát naimportovalo IT oddělení společnosti, kde uživatel pracuje a zařízení používá (nebo odbodná situace) – asi nejčastější varianta
    • certifikát je v zařízení nejspíše z důvodu přístupu na interní aplikace, do interní sítě, atd.
    • dané IT oddělení stejně tak může pro uživatele fakovat certifikáty i pro jiné aplikace jinak nesouvisející s prací. Tohle je patrně první případ, kdy to vadí. Nicméně je třeba si uvědomit, že úplně stejná situace nastává i u stolního počítače, kde se daná hláška nezobrazuje. A také daný správce má nad zařízením a daty uživatele takovou moc, že je úplně jedno, jestli mu může podstrkovat falešné certifikáty nebo ne

Tohle jsou asi 3 reálné situace, které mohou nastat. Ani jednu z nich zobrazování prudící hlášky neřeší. Naopak pokud se normálnímu uživateli, který nechce svoje zařízení rootovat a trávit mládí s openssl v konzoli, zbývá jediná možnost, jak se hlášky zbavit – smazat certifikát z úložiště. Smazáním certifikátu ale vyřadí jejich ověřování pro aplikace, kvůli kterým tam byl. Tedy defakto zničí veškeré výhody šifrovaného spojení, protože pokud uživatel dále odkliká pokaždé všechny výjimky, tak je výsledek stejný, jako kdyby data běhaly po síti nešifrována. Tohle je jediný výsledek, čeho daná hláška může dosáhnout. Pokud tohle bylo zamýšleno, tak to vymyslel buď člověk lobující za komerční certifikační autority ve snaze přihrát jim ještě nějaké peníze navíc nebo nějaký sadistický vtipálek s morbidním smyslem pro humor. Pokud tohle zamýšleno nebylo a přesto veškeré návrhy byly zamítnuty, tak to navrhoval neschopný lempl nemající nejmenší technické znalosti o věcech, které se rozhodl překopat a měl by místo toho radši dělat práci, na kterou má kvalifikaci – třeba mýt záchody. Pamatuju si první verze Androidu, kde nebyla uživatelská možnost přidávání certifikátu. Poté, co tato možnost byla přidána, ji KitKat prakticky znemožnil tím, že při její využití zaspamuje systém otravnými hláškami. Bravo! Jestli bylo zamýšleno vrátit se funkcionalitou na Android 1.5, tak se to povedlo.