Disassembler

Artificial intelligence is no match for natural stupidity.
09dubna2014

OpenSSL a heartbleed


Do třetice všeho dobrého. Po docela slušném problému s možným man-in-the-middle útokem a odposlechem dat, která se měla tvářit jako neodposlechnutelná v SSL/TLS implementacích Apple a GnuTLS byla předevčírem (7.4.2014) popsána a zveřejněna zranitelnost i v OpenSSL. A není to len tak ledajaký problémek. Je to průser jak mraky, vedle kterého nějaké chybějící goto fail vypadá jen jako kosmetická vada.

Krvácející srdce


Zranitelnost známá jako „heartbleed“, popsaná v CVE-2014-0160 umožňuje komukoliv získat privátní klíče k SSL certifikátům (což je sice méně pravděpodobné, ale stále možné), nejrůznější odvozené kryptografické zabezpečovací klíče, uživatelská jména, hesla, úryvky transakcí, soukromý obsah a nejrůznější další data, která by celkem určitě neměla být přístupná široké veřejnosti. Jak je tohle všechno možné? Lidská chyba. Konkrétně pak chyba v implementaci TLS/DTLS heartbeat rozšíření popsaném v RFC6520. Toto rozšíření definuje keep-alive funkcionalitu, díky které je možno udržovat navázaná TLS spojení bez nutnosti znovu vyjednávat šifrovací klíče v případě, že neprobíhá žádný přenos. Vzhledem ke zvláštní povaze tohoto rozšíření není k odeslání (resp. přijetí) paketu potřeba mít TLS spojení již navázané, takže potenciální útok není možné bezpečně rozpoznat a tedy ani zastavit. Vinou chyby v kódu, který má na starost alokaci paměti, je pak útočník schopen přečíst 64kb blok paměti aplikace využívající OpenSSL knihovnu, který může obsahovat ona výše zmíněná citlivá data. A protože útočník může posílat pakety pořád dokola, je schopen takovýchto 64kb bloků přečíst tolik, kolik mu jich server poskytne.

Je to rozbitý


Nejvíce postiženi jsou paradoxně ti, kteří poctivě aktualizují, protože heartbleed bug se vyskytuje pouze u OpenSSL 1.0.1 – 1.0.1f. Předchozí verze, tedy větve 1.0.0 a 0.9.8 tímto problémem netrpí.

Distribuce dodávané se zranitelným OpenSSL shrnuje následující seznam:

Samozřejmě nutno podotknout, že zranitelnost se týká „jen“ služeb využívajících OpenSSL knihoven (což je pořád dobrá šestina internetu). Převážně tedy služeb jako Apache HTTP server, Nginx, Postfix, Cyrus, Dovecot, OpenSSH, OpenVPN, PostgreSQL, MySQL a dalších. Java-based servery jako například Tomcat, WebLogic nebo JBoss používají převážně Javovskou implementaci JSSE, která je buguprostá, a stejně tak třeba i Microsoftí IIS, které používá proprietární Windowsí implementaci TLS zvanou SChannel. GPL projekty pak převážně užívají sluníčkově licencovaného GnuTLS, ve kterém už jedna past na mamuty byla nedávno zazáplatována.

Oprava


TLS heartbeat bohužel není konfigurovatelný, takže neexistuje žádná rychlá a bezbolestná oprava. Pokud tedy jedete na některé z výše uvedených postižených distribucí, utíkejte aktualizovat na verzi 1.0.1g, která tuto hrozivou díru záplatuje. V případě, že si z nějakého důvodu nemůžete dovolit aktualizovat, třeba kvůli problémům s kompatibilitou, můžete OpenSSL rekompilovat s parametrem

-DOPENSSL_NO_HEARTBEATS

Který podporu heartbeatu úplně odstraní.

Další průšvih pak je, že není možno zjistit, jaká data vám byla z paměti vyzobána, takže pokud jste hodně paranoidní, budete pravděpodobně chtít revokovat veškeré certifikáty dostupné v době útoku (tedy v podstatě všechny) a vydat místo nich nové, což v případě self-signed certifikátů může být docela problém.

Další studium


Chcete-li si dále počíst, doporučuji navštívit web http://heartbleed.com který se zaměřuje přímo na seznámení s problematikou a velmi srozumitelně vysvětluje vše, co by vás mohlo zajímat.

Dále stojí za zmínku https://gist.github.com/takeshixx/10107280, kde naleznete pythonovský skript, kterými můžete zranitelnost testovat.

A pokud vás chyba zajímá z programátorského hlediska a chcete vědět, který kus kódu tuhle vtipnou eskapádu zapříčinil, pokračujte na http://blog.existentialize.com/diagnosis-of-the-openssl-heartbleed-bug.html.