Heartbleed

Heartbleed turvanõrkus on haavatavus OpenSSL krüptograafiatarkvaras, mis on laialdaselt kasutusel olev implementatsioon transpordikihi turbeprotokollist (TLS). Esimest korda tekkis turvanõrkus tarkvaras aastal 2012 ning avalikuks sai see 2014. aastal. Heartbleed turvanõrkust on võimalik ära kasutada sõltumata sellest, kas haavatav OpenSSL instants jookseb TLS serveri või kliendina. Heartbleed turvanõrkuse avastamist raskendas asjaolu, et selle ekspluatatsioon ei jäta logidesse jälge viitamaks ühelegi anomaaliale.

Ekspluatatsioon

Turvanõrkus on mittekorrektse sisendivalideerimise tulemus TLSi Heartbeat laienduses. Sellest tuleneb ka turvanõrkuse nimi. Kuna Heartbeat päringutes puudusid täiendavad piirikontrollid pikkuse (ingl length) ja lasti (ingl payload) väljadel ning lisaks usaldati teistelt masinatelt saadud andmeid, saatis päringule vastav masin kogemata välja iseenda mäluandmeid. Krüpteeritud TLS käepigistuse (ingl handshake) käigus saadavad kaks masinat üksteisele Heartbeat sõnumeid. RFC 6520 kohaselt peab Heartbeat vastus sisaldama täpset koopiat Heartbeat päringus sisalduvatest andmetest. Heartbeat vastuse kättesaamisel kirjutab masin lasti andmed enda mällu ja kopeerib sisu oma vastusesse tagasi. Pikkuse väli tähistab lasti pikkust. OpenSSL hõivab mälu pikkuse välja alusel ning kopeerib seejärel lasti vastusesse memcpy() abil. Ründajad saavad Heartbeat päringuid saata pikema pikkuse välja väärtusega kui lasti välja väärtus tegelikkuses on. Masinas jooksvad OpenSSL protsessid, mis Heartbeat päringule vastavad, ei verifitseeri, et lasti suurus vastaks pikkuse väljas defineeritule. Seega kopeerib masin lastis sisalduvad üleliigsed (pahatahtlikud) andmed enda vastusesse. Üleliigsed baidid on lisaandmed kaugprotsessi mälus.

Mõjuulatus

Antud turvanõrkus lubab ükskõik kellel internetis lugeda mälu süsteemidest, mida kaitseb haavatav versioon OpenSSL tarkvarast. Tundlik informatsioon, nagu sessiooniidentifikaatorid, kasutajanimed, märgised (ingl token) on paljastatavad. Ekstreemsetel juhtudel võivad isegi serveri privaatsed krüptograafilised võtmed ründajate kätesse sattuda. Asja teeb veelgi ohtlikumaks fakt, et seda turvanõrkust ekspluateeriv rünnak ei jäta logifailidesse mingisuguseid tõendeid. Seega on väga keeruline kindlaks teha, kas vaatluse all olev masin on rünnaku alla sattunud. Ühe Heartbeat sõnumi kohta saab ründaja lugeda 64 kilobaiti serverimälu. Sellest hoolimata pole piirangut rünnatavalt serverilt loetava mälu kogumahu osas. Veelgi enam, ründajal on võimalik jätkata ühendumist ja suvalise arvu 64 kilobaidiste segmentide pärimist, et paljastada mälus paiknevat salajast infot (paroolid, salavõtmed, krediitkaardiinformatsioon jne).

Lahendus

Haavatavust Heartbleedi suhtes on võimalik lahendada OpenSSL uuendamisega parandatud versioonile (1.0.1g või hilisem). OpenSSL-i on võimalik kasutada kas eraldiseisva programmina, dünaamilise jagatud objektina või staatiliselt ühendatud raamistikuna. Seega võib uuendamisprotsess nõuda OpenSSL-i haavatava versiooniga laetud protsesside taaskäivitamist ning lisaks ka staatiliselt ühenduses olnud programmide ja raamistike taasühendamist. Praktiliselt tähendab see OpenSSL-iga staatiliselt ühendatud pakettide uuendamist ning jooksvate programmide taaskäivitamist, et eemaldada mälusisene koopia vanast, haavatavast OpenSSL koodist. Peale haavatavuse parandamist peavad süsteemiadministraatorid tegelema potentsiaalse konfidentsiaalsuslekkega. Kuna Heartbleed lubas ründajatel omandada ligipääsu privaatsetele võtmetele, tuleb neid käsitleda kompromiteeritutena. Võtmepaarid tuleb uuesti genereerida ja neid kasutavad sertifikaadid uuesti väljastada, vanad sertifikaadid tuleb tagasi võtta. Heartbleed võis potentsiaalselt avalikustada ka teisi mälusiseseid saladusi, seega tuleb ka muu autentimismaterjal (näiteks paroolid) uuesti genereerida. Üksikutel juhtudel on siiski võimalik kindlaks teha, et süsteem, mis oli turvanõrkusest mõjutatud, ei saanud rünnaku osaliseks või kas mingi kindel osa informatsioonist lekkis.