In navolging van Belgian banks & SSL, het blogbericht van Yeri Tiete waarin hij de status van de SSL certificaten van de Belgische banken onder de loep neemt, doen wij hetzelfde voor de headers die onze vertrouwde banken meesturen met hun requests.

Eén winnaar, veel verliezers

De securityheaders.io tool bracht ons op het idee om de banken te testen op veiligheid van de meegestuurde headers. Het is pijnlijk om te zien dat er slechts één bank is die op dit moment voldoet (11/02/2016). Alle lof hiervoor aan KBC met hun vernieuwde KBC touch. Correcte headers meesturen is immers slechts het begin van basisbeveiliging.

Update 17/02/16: we zien inmiddels dat bepaalde banken naar aanleiding van deze blogpost aan de slag gegaan zijn, een initiatief dat we enkel kunnen aanmoedigen. Geupdate banken: Keytrade (van E naar B), Medirect (van F naar E), ING (van B naar A), Recordbank (van B naar A)

Update 26/02/16: Crelan en VDK maken de sprong van D naar A, Hellobank, Fintro, BNP Fortis Paribas en Bpost bank van E naar A, Optimabank van F naar B.

Update 03/03/16: Belfius springt van F naar B. Dat maakt op 3 weken tijd 12 banken die een aanpassing gemaakt hebben.

Update 18/03/16: Nagelmackers maakt de sprong van E naar B.

Update 07/04/16: Belfius en Bank Van Breda geven nog een duwtje, van B naar A.

Update 03/08/16: Argenta Bank springt naar A, Beobank naar D.

We willen niet enkel de banken wijzen op de tekorten, maar willen ze aansporen om tot actie over te gaan. Een oplijsting van wat er zoal kan gedaan worden:

Weg te laten headers

Server

De “server” header wordt meegegeven om aan te duiden welke software er gebruikt werd om het verzoek af te handelen. Vaak staat hier ook nog eens de versienummer in. Op die manier kan er gerichter worden gezocht achter mogelijke kwetsbaarheden in de gebruikte software.

X-Powered-By

Soortgelijk aan de Server header, geeft de X-Powered-By header meer informatie over software die gebruikt werd. Vaak gaat het dan bijvoorbeeld over ASP.NET en PHP. Ook hier wordt vaak de versienummer meegegeven. Ideaal voor statistieken, niet zo ideaal om mogelijke aanvallers af te weren.

X-AspNet-Version

De X-AspNet-Version toont het volledige versienummer van het Microsoft .NET framework. In het geval van Belfius is dat bijvoorbeeld 4.0.30319 (van maart 2012). Niet iets wat je wil laten zien als bank. Zeker niet wanneer er kwetsbaarheden uitkomen voor die versie.

Toe te voegen headers

Content-Security-Policy

De Content Security Policy werd ingevoerd om als website meer controle uit te oefenen op de resources (scripts, styles, images, frames, …) in een website die mogen uitgevoerd worden door de browser. Wanneer er bijvoorbeeld een script wil uitgevoerd worden dat niet aan deze policy voldoet, wordt dat geblokkeerd door de (moderne) webbrowser. Het is een broodnodige maatregel ter bescherming van de gebruiker.

Content Security Policies dus voornamelijk gebruikt om te vermijden dat kwaadaardige scripts kunnen uitgevoerd worden binnen de context van de veilige webpagina. Zo wordt er onder meer extra bescherming geboden tegen aanvallen zoals XSS attacks, clickjacking en dergelijke.

Strict Transport Security

Wanneer een gebruiker naar de website van zijn bank “https://www.bank.be” wil surfen, typt hij veelal “www.bank.be” in in zijn URL balk. Dit wil zeggen dat er eerst een onveilig HTTP verzoek wordt verstuurd naar de website van de bank. De bank stuurt meestal wel een antwoord zoals “nee slimmerik, je moet op onze beveiligde website zijn!”, maar dan kan het al te laat zijn. Op dat moment is de gebruiker namelijk vatbaar voor een Man-in-the-Middle attack waarbij iemand anders zich voordoet als de bank. Onze nietsvermoedende hardwerkende Belg kan dan vervolgens naar een phishing website worden doorverwezen.

Gelukkig bestaat er dus zoiets als “Strict Transport Security”. Dit is een header die aanduidt dat verkeer naar www.bank.be (en mogelijk alle subdomeinen zoals touch.bank.be) altijd via HTTPS moet verlopen. Bij alle volgende bezoeken zal de browser van de bezoeker hier dus rekening mee houden.

Public Key Pins

Door een Public-Key-Pins header mee te geven met de webpagina, geef je aan de browser van de gebruiker een whitelist mee. In deze whitelist staat welke public keys er bij die server horen en dus bij volgende bezoeken moeten worden vertrouwd door de browser. Op die manier kan een hacker niet zomaar even een rogue certificaat genereren wanneer er een private key van een Certificate Authority wordt gelekt.

X-Frame-Options

Met deze header voorkom je dat iedereen zomaar jouw website kan inladen in een frame op zijn webpagina. Dit is een techniek die vaak voorkomt bij clickjacking. Wanneer er op een creatieve manier overlays over die verborgen frame worden gezet, kan een gebruiker worden misleid om op schijnbaar onschadelijke dingen te klikken terwijl hij eigenlijk handelingen aan het verrichten is op de website in de frame.

X-Xss-Protection

Deze header gebruikt men om aan de browser expliciet aan te geven om de ingebouwde XSS bescherming in te schakelen.

X-Content-Type-Options

Wanneer er X-Content-Type-Options: “nosniff” wordt toegevoegd aan de headers, worden Google Chrome en Internet Explorer verhinderd om het mime-type van een bestand automatisch te herkennen. Dit vermoeilijkt onder andere drive-by-downloads.