Afgelopen jaar werd internet opgeschrikt door een kritieke bug in de populaire softwarebibliotheek OpenSSL. De bug kreeg zelfs een catchy naam (Heartbleed), een logo en een website. De fout werd onafhankelijk van elkaar ontdekt door het Finse beveiligingsbedrijf Codenomicon en Google. 

Iedereen die een 1.0.1- of 1.0.2-beta-release van OpenSSL draaide, was kwetsbaar voor de fout. Door een niet aanwezige controle in de TLS heartbeat extensie van OpenSSL kon een client die met een server verbond de inhoud tot 64 kB RAM van die server inkijken. Dat heeft mogelijk verregaande gevolgen, want in het RAM van een server zijn allerlei privacygevoelige gegevens van gebruikers aanwezig, maar ook bijvoorbeeld geheime sleutels van ssl-certificaten.

 

De Duitse onderzoeker Robin Seggelmann introduceerde per ongeluk de fout en publiceerde de code vlak voor middernacht op oudjaar 2011 in de Git-repository van OpenSSL. De code raakte via de development branch in de stabiele versie 1.0.1 zonder dat de reviewers de fout opmerkten. De heartbeat extension zorgt dat een client een heartbeat pakket naar de server stuurt om te controleren of de verbinding met de server nog werkt en de server doet hetzelfde met de client. Dit pakket bevat een willekeurige payload van een bepaalde lengte. Als de server zo’n pakket ontvangt, stuurt hij een pakket terug met exact diezelfde payload. De client vergelijkt dan zijn eigen payload met die van de server om te verifiëren of de verbinding werkt.

 

Door de Heartbleed-bug kan een aanvaller echter een speciaal geprepareerd heartbeatpakketje naar de server sturen. Dat pakketje heeft een kleine payload, maar geeft aan dat het een payload van 64 kB heeft. Eigenlijk gaat het dus om een kleine payload vermomd als een grote. De server die het pakketje ontvangt, kopieert dan 64 kB uit het RAM tijdens het aanmaken van zijn pakketje terug, waardoor tot 64 kB gegevens na de payload in het RAM gekopieerd worden. Gegevens die daar toevallig staan. Dat kunnen wachtwoorden zijn, interne gegevenstabellen van programma’s, geheime sleutels, creditcardgegevens maar even goed ook totaal onbruikbare informatie.

 

De impact is groot, omdat een client zo vaak als hij wil heartbeatpakketjes kan sturen en dus elke keer door misbruik van de Heartbleed-bug een nieuw blok van 64 kB gegevens uit een willekeurige plaats in het RAM terugkrijgt. Tussen al die willekeurige informatie zal dan wel eens iets nuttigs zitten… Bovendien laat het gebruik van de bug geen enkele sporen na, zodat de beheerder van de server op geen enkele manier kan controleren of gegevens gelekt zijn.

 

Stel dat een client de geheime sleutel van een ssl-certificaat te pakken heeft gekregen door misbruik van de Heartbleed-bug, dan kan de aanvaller zich zelfs uitgeven voor de server en dus een man-in-the-middle aanval uitvoeren. Bezoekers kunnen de server van de aanvaller dan niet onderscheiden van de server die ze denken te bezoeken, zoals die van hun bank. Heel wat servers hebben daarom uit voorzorg hun ssl-certificaat teruggetrokken en vernieuwd en vroegen hun gebruikers om hun wachtwoorden te wijzigen. Dat de bug effectief uitgebuit is, bleek toen wachtwoorden van Yahoo! Mail lekten en toen de Canadese belastingdienst met een gegevenslek te maken kreeg. Ondertussen is de fout opgelost in OpenSSL 1.0.1g en 1.0.2-beta2. De OpenSSL 1.0.0- en 0.9.8-releases die nog op veel embedded devices draaien, zijn niet kwetsbaar voor Heartbleed. Overigens hadden een maand na de publicatie van het lek meer dan de helft van de kwetsbare websites hun ssl-certificaat nog niet teruggetrokken en vernieuwd.