Wat is clickjacking en hoe voorkom je het?

Auteur: Gepubliceerd

In het kort: Clickjacking, ook wel een UI redress attack genoemd, houdt in dat een gebruiker wordt verleid om op een ander element te klikken dan het element dat hij ziet. Een aanvaller kan bijvoorbeeld een onzichtbare pagina met een knop over een ogenschijnlijk onschuldige knop in een spel leggen. Website-eigenaren beperken zulke aanvallen vooral door te bepalen wie hun pagina’s mag insluiten. Gebruikers kunnen zich beschermen door voorzichtig te zijn met verdachte interacties.

Hoe het onderscheppen van klikken werkt

Een browser kan een pagina binnen een andere pagina weergeven met het element iframe, een ingesloten frame. Dit is een normale functie, die bijvoorbeeld wordt gebruikt om video’s of kaarten te tonen. Bij clickjacking gebruikt een aanvaller deze functie om het werkelijke doel van een klik onder of boven een speciaal daarvoor gemaakte interface te verbergen.

Een typisch scenario verloopt als volgt: de gebruiker opent een pagina die de aanvaller beheert. Die pagina laadt een andere website in een frame. Het frame is transparant of zorgvuldig bijgesneden en zo geplaatst dat de knop erin precies op de plek staat waar de gebruiker wil klikken. De gebruiker ziet de ene opdracht, maar de browser registreert een interactie met een ander element.

De aanvaller hoeft daarvoor de inhoud van de andere website niet te kunnen lezen. De toegangsbeperkingen die browsers tussen verschillende websites opleggen, verhinderen niet dat pagina’s worden ingesloten en klikken erop worden gericht. Gegevens beschermen tegen uitlezen en voorkomen dat een interface wordt ingesloten, zijn daarom twee afzonderlijke taken.

Voorbeeld: een beloning die een andere actie uitvoert

Stel je een pagina voor met een eenvoudig spel en een knop ‘Haal je beloning op’. Boven die knop ligt een onzichtbaar frame met een bedieningspaneel van een andere website. Als die website insluiten toestaat en de sessie van de gebruiker binnen dat frame werkt, kan de klik terechtkomen op een knop die een handeling op zijn account uitvoert.

Dat betekent niet dat elk bezoek aan een kwaadaardige pagina onmiddellijk tot een accountovername leidt. Of de aanval slaagt, hangt onder meer af van de beveiliging van de doelwebsite, de beschikbaarheid van een ingelogde sessie in het frame en de vraag of de handeling extra bevestiging vereist. Cookie-instellingen en browserbeperkingen kunnen zo’n aanval bemoeilijken, maar vervangen de bescherming tegen insluiten niet.

Mogelijke gevolgen zijn onbedoelde wijzigingen in instellingen, het uitvoeren van een actie op de website of het goedkeuren van een handeling. Een extra bevestiging waarvoor de gebruiker bewust moet handelen, verkleint het risico. Alleen een extra knop biedt echter geen gegarandeerde bescherming: de aanvaller kan proberen het slachtoffer door meerdere klikken heen te leiden.

Waarin clickjacking verschilt van phishing en CSRF

Bij phishing doet een oplichter zich doorgaans voor als een vertrouwde partij om gegevens te ontfutselen of iemand tot een bepaalde handeling te bewegen. Bij clickjacking kan de gebruiker juist op een element van de echte website klikken, maar dan verborgen in een misleidende omgeving. Beide technieken kunnen samen worden gebruikt, maar het misleidingsmechanisme verschilt.

CSRF, waarbij een ongewenst verzoek aan een website wordt afgedwongen, maakt zonder bewuste toestemming gebruik van de rechten van een ingelogde gebruiker. Clickjacking richt zich op het onderscheppen van interacties met de interface. Een token dat tegen CSRF beschermt, is niet voldoende om clickjacking te voorkomen, omdat de klik een geldig formulier met het bijbehorende geldige token kan activeren.

Ook HTTPS lost dit probleem niet op. Het versleutelt de verbinding met een website, maar bevestigt niet dat de interface betrouwbaar is of dat de eigenaar goede bedoelingen heeft.

Hoe je je eigen website beveiligt

De belangrijkste bescherming is de HTTP-responsheader Content-Security-Policy met de richtlijn frame-ancestors. Een HTTP-header is informatie die de server samen met de pagina naar de browser stuurt. De richtlijn bepaalt welke bronnen de pagina in frames mogen insluiten.

Als de website helemaal niet mag worden ingesloten, kun je het volgende gebruiken:

Content-Security-Policy: frame-ancestors 'none'

Als insluiten alleen binnen dezelfde oorsprong mag — dezelfde combinatie van protocol, host en poort — is dit de juiste waarde:

Content-Security-Policy: frame-ancestors 'self'

Een ouder mechanisme is X-Frame-Options met de waarde DENY of SAMEORIGIN. Je kunt dit als aanvulling gebruiken voor oudere clients, met instellingen die overeenkomen met het overige beleid. De richtlijn frame-ancestors biedt meer flexibiliteit: je kunt er bijvoorbeeld een specifieke oorsprong van een partner mee toestaan. Deze richtlijn moet als responsheader worden verstuurd. Opname in een meta-tag biedt deze bescherming niet.

De praktische invoering bestaat uit drie stappen:

  1. Bepaal welke pagina’s daadwerkelijk in frames moeten werken, bijvoorbeeld voor een integratie met een partner.
  2. Stel het juiste beleid in op de server, in de applicatie of in een tussenliggende dienst en controleer de headers met de ontwikkelaarstools van de browser.
  3. Test zowel het blokkeren van ongewenst insluiten als de werking van legitieme integraties.

Vertrouw niet uitsluitend op scripts in JavaScript die proberen de pagina uit een frame te halen. Zulke oplossingen hebben beperkingen en kunnen worden omzeild. Gebruik bij gevoelige handelingen ook hernieuwde authenticatie of een bevestiging die duidelijk beschrijft welke handeling wordt uitgevoerd.

Wat je als gebruiker kunt doen

Vermijd pagina’s die een reeks onbegrijpelijke klikken vereisen, vooral onder het voorwendsel dat je een beloning ontvangt, een video ontgrendelt of een zogenaamde verificatie uitvoert. Houd je browser up-to-date, maar bedenk dat een actuele versie de beveiliging van de bezochte website niet vervangt.

Als je vermoedt dat een klik een ongewenste actie heeft uitgevoerd, open de betreffende website dan zelf in plaats van een link op de verdachte pagina te gebruiken. Controleer de activiteitengeschiedenis en gewijzigde instellingen en meld een ongeoorloofde handeling bij de klantenservice. Als website-eigenaar kun je het beste beginnen met het controleren van de header frame-ancestors op de accountpagina’s en in het beheerpaneel.

Zie ook: Wat is Mass Assignment?

Lees ook

Lees hoe PHP-FPM PHP-verzoeken verwerkt, verschilt van een webserver en hoe je processen afstemt op verkeer en hostingcapaciteit.
Ontdek hoe BIND als open DNS-serversoftware domeinen beheert, welke rollen het vervult en wanneer zelf beheren zinvol is.
Lees wat het Poolse REGON-register en -nummer betekenen, hoe ze verschillen van NIP en KRS en hoe je bedrijfsgegevens controleert.