Bug-historicus maakt je webbrowser veiliger

Jouw webbrowser (ja, ook de browser die je nu gebruikt om deze tekst te lezen) is kwetsbaar voor hackers. Wekelijks ontdekken onderzoekers softwarefouten, oftewel bugs, die jouw online veiligheid en privacy ondermijnen. Mijn geautomatiseerde bug-historicus analyseerde 75 van die bugs over meer dan 100.000 codeversies en onthulde hun oorzaken.

Webbrowsers bestaan uit tientallen miljoenen codelijnen, waarbij één kleine fout al snel kan leiden tot verregaande veiligheidsproblemen. Credit: WikiMedia.

Soms ligt het helemaal niet aan jou of je gemakkelijk te raden wachtwoord. Hackers kunnen namelijk ook bank- en socialmedia-accounts kraken door bugs in de webbrowser te misbruiken. Ik toonde aan dat browserontwikkelaars een aanzienlijk aantal van die bugs veroorzaakten wanneer ze net een andere bug probeerden op te lossen, en dat sommige bugs zelfs al openbaar werden gemaakt vooraleer ze daadwerkelijk waren opgelost. Met deze inzichten kunnen we effectievere methoden ontwikkelen om bugs beter te voorkomen en aan te pakken.

De onzichtbare ruggengraat van het web

Stel je voor: je logt in op je favoriete sociale media website. Je hoeft je wachtwoord gelukkig maar één keer in te vullen, want dankzij cookies weet de website bij elke klik nog steeds dat jij het bent. Terwijl je door je nieuwsfeed scrollt, klik je verder op een advertentie voor een exotische vakantie, dan op een sappig clickbait-artikel, en even later misschien op een hilarische kattenvideo.

Wat je niet ziet, is dat verschillende essentiële beveiligingsmechanismen je in de achtergrond beschermen tegen potentiële hackers. Je wachtwoord werd tijdens het inloggen enkel over een beveiligde verbinding verstuurd? Check! Je cookies werden afgeschermd van andere websites? Check! Niemand kon een post plaatsen in jouw naam? Check! Het klinkt misschien overdreven (en dat is het niet!), maar indien deze onzichtbare ruggengraat van mechanismen plots zou verdwijnen, zou het web vervallen in een regelrechte chaos zonder enige veiligheidsgaranties.

Indien de onzichtbare ruggengraat van beveiligingsmechanismen zou verdwijnen, zou het web vervallen in een regelrechte chaos zonder enige veiligheidsgaranties

Het is dus niet verwonderlijk dat de bedrijven achter populaire webbrowsers veel investeren in het voorkomen, opsporen en oplossen van fouten tegen deze veiligheidsmechanismen. En toch horen we elke week opnieuw over de ontdekking van zo'n kwetsbaarheid. Dat is niet zo gek als je dit in perspectief plaatst: Webbrowsers zijn onvoorstelbaar complex. Ze bevatten tientallen miljoenen lijnen code, bijna net zoveel als grote besturingssystemen zoals bijvoorbeeld Windows!

Stel je elke codelijn voor als een kaart in een gi-gan-tisch kaartenhuis. Elke keer dat je een kaart toevoegt, vervangt of verwijdert, breng je de stabiliteit van dit kilometershoge bouwwerk in gevaar. Op diezelfde manier brengt elke verandering aan de code, hoe klein ook, het risico op de introductie van een nieuwe kwetsbaarheid. Zulke veranderingen zijn onvermijdelijk, net zoals elk gebouw van tijd tot tijd onderhouds- en verfraaiingswerken nodig heeft.

Stel je elke codelijn voor als een kaart in een gi-gan-tisch kaartenhuis. Elke keer dat je een kaart toevoegt, vervangt of verwijdert, breng je de stabiliteit van dit kilometershoge bouwwerk in gevaar

Welke veranderingen vormen dan het grootste risico op een kwetsbaarheid? Ligt het aan de specifieke code die je aanpast, of is de aard van de verandering belangrijker? De beroemde astronoom Carl Sagan zei ooit “Je moet het verleden kennen om het heden te begrijpen”, en zodoende zocht ik naar antwoorden in het verleden: de levensloop van bugs.

Eendagsvlieg of oudgediende?

Grote softwareprojecten zoals webbrowsers houden een gedetailleerde geschiedenis van alle gemaakte codewijzigingen bij. Je kan dit vergelijken met de “ongedaan maken”-knop in je tekstverwerker, maar dan véél geavanceerder. Zo documenteren ontwikkelaars netjes elke codewijziging en kunnen ze zonder al te veel gedoe terugkeren naar een vorige versie van de code.

In deze rijke codegeschiedenis leven en leefden onvoorstelbaar veel bugs, waarbij elke bug het levenslicht ziet bij een codewijziging die een fout veroorzaakt. Om die fout te verhelpen, moet de bug allereerst ontdekt worden, zodat deze vervolgens met een nieuwe codewijziging kan worden opgelost. Die oplossing komt dan uiteindelijk ook in jouw webbrowser terecht door middel van een software-update.

Een softwareproject kan worden voorgesteld als een lange opeenvolging van codeveranderingen (gekleurde cirkels). De levensloop van een bug (rode cirkels) start bij de wijziging die een fout introduceert en eindigt pas wanneer die fout is opgelost.

Sommige bugs zijn een leven van ettelijke jaren beschoren, anderen zijn dan weer eerder eendagsvliegen. Sommige bugs doen de webbrowser louter wat tegenpruttelen, en anderen hebben dan weer verregaande gevolgen voor je online veiligheid. In deze laatste groep ben ik geïnteresseerd. Maar net vanwege de enorme omvang van de codegeschiedenis is het praktisch onmogelijk de levenslopen van bugs handmatig in kaart te brengen.

Daarom ontwikkelde ik een soort van digitale bug-historicus die de codegeschiedenis van een webbrowser geautomatiseerd kan doorploegen. Op basis van een webpagina die de bug in kwestie reproduceert, achterhaalt het telkens waar het leven van die bug begon en eindigde. Dit gloednieuwe programma liet ik los op zowat alle gekende bugs van één van de belangrijkste beveiligingsmechanismen die alle webbrowsers gebruiken: de Content Security Policy.

Vanwege de enorme omvang van de codegeschiedenis is het praktisch onmogelijk de levenslopen van bugs handmatig in kaart te brengen

Op die manier identificeerde ik de levenslopen van 75 unieke bugs door meer dan 100.000 codeversies te analyseren, en dat leverde ons opvallende inzichten op. Zo werd een groot deel van de kwetsbaarheden veroorzaakt door een codewijziging die… een andere kwetsbaarheid trachtte op te lossen! Dit is alsof je door een typfout te corrigeren een andere (misschien wel ergere) typefout maakt. Goedbedoelde inspanningen kunnen dus zelfs het omgekeerde effect veroorzaken.

Nog verontrustender is dat ontwikkelaars bij sommige inspanningen veronderstelden dat een kwetsbaarheid effectief was opgelost, terwijl dit helemaal niet zo was. Dit is problematisch, want zowat alle opgeloste kwetsbaarheden worden na een bepaalde tijd publiek gemaakt. En daarmee bedoel ik werkelijk publiek: de hele wereld kan aan deze informatie. Meerdere kwetsbaarheden in onze dataset waren minstens één jaar publiek én onopgelost. Zo maak je het hackers wel heel gemakkelijk!

Meer dan je smartphone of desktop alleen

Op basis van deze inzichten heb ik concrete verbeteringen voorgesteld die Google, Mozilla en Apple, de bedrijven achter de populairste webbrowsers, kunnen helpen om kwetsbaarheden effectiever te voorkomen en te behandelen.

Het probleem reikt echter veel verder dan de webbrowser op je smartphone of desktop computer. Ook andere apparaten zoals je smart-tv, spelcomputer en smartwatch maken gebruik van een interne webbrowser. Zo heb ik bijvoorbeeld ook veel gerelateerde kwetsbaarheden in e-readers kunnen aantonen. Er is dus nog veel werk aan de winkel om al deze systemen beter te beveiligen.

Wat kan jij als gebruiker alvast doen? Software-updates niet wegklikken, maar installeren!

Gertjan Franken dingt mee naar de Vlaamse PhD Cup 2024. Ontdek meer over dit onderzoek op www.phdcup.be.