Hlavní navigace

Routery Asus RT-N10R ukládají heslo v plaintextu

Josef Havránek

Zatím nepublikovaná zranitelnost byla čirou náhodou objevena na routeru Asus RT-N10R. Ač to není žádná katastrofa, je to určitý druh zranitelnosti, o které se mohou čtenáři Rootu dozvědět jako první.

Spolu s tím se také budete moci dozvědět, proč je i tato chybka problém a proč může být nazvána zranitelností. Jako bonus si pak také přečtete, jak a za jakých okolností byla zranitelnost odhalena.

Popis zranitelnosti

U routeru Asus RT-N10R jsem zjistil, že při vytvoření zálohy si do ní router ukládá heslo, tak jak je, v plaintextu, nehašované. Spolu s tím ukládá uživatelské jméno, model a výrobce, opět v plaintextu. Soubor zálohy je tedy slabé místo. Zálohování v této formě poměrně jistě dokazuje, že si router heslo ukládá úplně stejně i uvnitř nevolatilní paměti.

Proč si tím můžeme být jisti? Při správně implementované hašovací funkci s dostatečně kvalitní solí není možné získat zpět původní heslo, a to pak ukládal do zálohy. Každý alespoň trochu příčetný programátor by to nikdy nedělal, protože je daleko jednodušší něco uložit, než si muset napsat de-hašovací algoritmus, který by byl navíc slabinou routeru.

Demonstrace zranitelnosti

K demonstraci je zapotřebí samozřejmě zmíněný router a ideálně nějaký „Hex editor/reader". Pak už se jen změní heslo na nějaké známé a uloží se souboru zálohy. Ten pak otevřete zmíněným editorem. Vzhledem k tomu že předpokládám, že zmíněný router nemáte, poskytnu screenshot toho, co je v Hex editoru vidět. Nechám vás zatím v obrázku heslo najít.

Zálohované heslo bylo: Azsemsmispritale

Předpokládám, že jste heslo vykoukali z obrázku sami. Dále je ze zálohy možné vyčíst určitě ještě model, výrobce a v další části dokumentu kterou nezveřejňuji (nevím, co citlivého se dá z té zálohy „přečíst“) se lze např. dozvědět i použitý ntp server.

Proč je to problém

Možná si teď říkáte: „Vždyť je to přece soubor zálohy. Pokud mi někde neproklouzne, jsem v bezpečí“. Problém je ale právě v onom „pokud“, které není možné nikdy stoprocentně zajistit. Také netušíme, jak je naprogramované. Vzhledem k tomu že router pravděpodobně bude mít vaše heslo na nějaké paměťové buňce ve flash paměti, tak jednoduše nelze zaručit, že se z té buňky nedostane ven.

Připomeňme bezpečnostní chybu rom-0, která umožňovala na dálku stáhnout z routerů právě soubor zálohy. Pokud je v ní heslo uloženo v otevřené podobě, může se útočník okamžitě k síti přihlásit a router ovládnout.

Jsou dvě možnosti, jak se může dostat heslo ven:

  • nedostatkem software
  • hardwarovou cestou

Nedostatkem software

Takové nedostatky můžou způsobit, že za správných podmínek (např. zadáním správné adresy) se můžeme heslo od routeru dozvědět. Tento druh zranitelnosti existoval a byl patchováni v minulém updatu firmware. Na některých routerech je například vzdáleně dostupný terminál s privilegovaným přístupem, a tudíž je přes něj přístup do úplně celé paměti flash. Nakonec nevíme, jak se router vyrovnává s extrémní zátěží např. při DoS útoku.

Hardwarovou cestou

Většina z vás ví, že existuje způsob, kterým lze číst a zapisovat přímo do paměti. Používá se ICSP, JTAG a podobné. Existují také přímo čtečky flash pamětí.

Jednoduše řečeno, i BIOS na vašem počítači tam musel někdo něčím nahrát, a stejná věc platí o jakékoliv moderní elektronice. Co jde nahrát, by mělo jít i stáhnout.

Jak by to mělo být správně a proč

Jak to správně udělat

Za ideálních podmínek by žádné zařízení, které používá k ověření uživatele jeho jméno a heslo, alespoň to heslo nemělo znát. Tak se to i na slušných službách a ve slušných zařízeních děje. Způsob, jakým vás ověřují, je následující.

V algoritmu, který se stará o ukládaní/ověřování hesla, jsou dvě základní součásti:

  • generátor náhodného řetězce (říká se mu sůl)
  • hašovací algoritmus

Při prvním přihlášení tento algoritmus převezme vaše heslo a vygeneruje si sůl. Pak vám vaše heslo pořádně „osolí“. Je důležité, aby se sůl neopakovala a byla dost dlouhá. Pak ideálně přepíše/vymaže paměťový blok, kde bylo heslo uloženo v čitelné podobě. Nakonec se osolené heslo dá do hašovacího algoritmu a ten vrátí haš.

Tento haš spolu se solí a vašim uživatelským jménem pak uloží do relační tabulky. Tady je důležité, aby byl hašovací algoritmus dost silný a každá sebemenší změna v heslu generovala naprosto odlišný haš.

Při každém dalším přihlášení se udělá stejný postup, jen sůl se už znovu negeneruje a podle uživatelského jména se vybírá a čte z tabulky a přidává stejným způsobem k vašemu heslu. Výsledný haš zadaného a soleného hesla se pak porovná s uloženou podobou. Pokud se obě varianty shodují, jste přihlášeni, v opačném případě odmítnuti.

Proč to takto složitě dělat

Jednoduše: zařízení/služba vůbec heslo nezná. Jediné, co se ukládá, je haš a sůl, a zjišťování původních hesel je proto extrémně náročné.

Další výhoda je, že i kdyby všichni uživatelé měli stejné heslo, pokaždé bude v tabulce jiný haš. Nemůžete tedy odhadnout jejich hesla nijak jednoduše, kvůli podobnosti haše. Pro zjištění všech hesel musíte prolomit všechny haše, ne jen jeden.

Pro zvědavce: v této oblasti mě velmi poučilo video na YouTube, podívejte se na něj.

Reakce Asusu

Asus jsem o této skutečnosti samozřejmě informoval. Napsal jsem report nejprve česky (na českou pobočku) a byl jsem informován, že požadavek musím napsat anglicky a že jej přepošlou do centrály. Dodnes se mi nikdo další už neozval.

Laxní přístup je sice nepříjemný, ale z ekonomického hlediska pochopitelný. Router byl už na začátku prodeje velmi levný. Není tedy možné od výrobce čekat, že bude vynakládat další peníze na prakticky mrtvý a pravděpodobně sotva výdělečný produkt.

Způsob odhalení chyby

Přiblížím vám, jak jsem chybu objevil. Všechno to začalo zprávou od mého bývalého zaměstnavatele, která zněla asi takto: „někdo nám hacknul router, někde jsi musel vyzradit heslo“. K tomu, že router někdo nahackoval, vedla zaměstnavatele změna stavu routeru: připojení bylo pomalé a s původním heslem nebylo možné se přihlásit.

Začal jsem rychle přemýšlet, kudy mohlo heslo uniknout. Po vyloučení jiných možností jsem došel k souboru zálohy, které jsem spolu s návodem, jak router uvést do „známého“ funkčního stavu dal k dispozici na společné firemní úložiště. Soubor jsem tedy stáhnul a otevřel v textovém editoru. Uviděl jsem kupu „rozsypané rýže“ a plno NULL, BEL, ETB, EOT a dalších řídicích znaků.

Přemýšlel jsem nad tím, co by to mohlo rozumněji otevřít, a nakonec stačil obyčejný hexeditor. Pak jsem začal v souboru zálohy hledat a velmi rychle jsem začal hořekovat nad tím, proč to někdo takhle hloupě naprogramoval.

Jak to celé dopadlo

Naštěstí to má dobrý konec. Zaměstnavatel si naštěstí spletl verze dokumentu, které jsem mu posílal mailem a verze s hesly zůstaly ve firmě.  Druhá verze se dostala do cloudového úložiště bez hesel – k ní mohlo mít pár zaměstnanců přístup, což si ale reguloval zaměstnavatel.

Dále tu bylo podezření, že se soubory dostaly k některé ze spřátelených organizací, které působí ve stejné budově. Ověřoval jsem to, ale nestalo se tak a sdílena byla jen upravená verze bez záloh. Pokud tedy soubor někam utekl, byla to pravděpodobně chyba zaměstnavatele.

Nakonec jsme pořídili novější, který byl stejně potřeba. U Asusu jsme změnili heslo, pro jistotu.

Našli jste v článku chybu?