De 802.11 standaard qua beveiliging

Om de huidige, en betere, beveiliging van wifi te appreciëren gaan we terug in de tijd om te kijken hoe de originele IEEE wifi standaard de beveiliging beschreef. Het zal een ietwat horror-achtige tocht worden waarin we gaan ontdekken dat enkele stevige hiaten ervoor gezorgd hebben dat illegale toegang tot bijna ieder wifi netwerk al snel na de eeuwwisseling mogelijk werd, en enkele jaren later zelfs binnen enkele minuten. Lees verder en huiver mee.

De eerste versie van de IEEE 802.11-standaard verscheen in 1997. De herwerkte versie uit 1999, de “ANSI/IEEE Std. 802.11”, is de standaard die de wifi specificaties beschrijft zoals ze met 802.11b doorbraken. Het had als doel “to develop a medium access control (MAC) and physical layer (PHY) specification for wireless connectivity for fixed, portable, and moving stations within a local area.” Hoofdstuk 8 van deze standaard had als titel “Authentication and privacy” en was maar tien pagina’s lang, in vergelijking met de totale grootte van het document (528 pagina’s) was dit misschien wel een voorbode hoe weinig aandacht er aan beveiliging zou worden gegeven.

Voor we dat kleine hoofdstuk gaan openbreken - en ontdekken hoe WEP in de eerste generatie wifi-apparaten een navenante beveiliging aanbood - zullen we eerst bekijken hoe gebruikers met een draadloos netwerk effectief kunnen verbinden. Zoals reeds vermeld, gebeurt dit gebruik makende van de onbeveiligde management frames.

Verbinden met een netwerk

Tip

Vanaf nu zullen we geregeld het woord access point afkorten naar AP. In deze tekst kan een AP zowel een eenvoudig access point zijn als een complexe draadloze router of modem.

Voor digitale stropers actieve aanvallen kunnen starten op een netwerk, dienen ze verbinding te maken met het netwerk. Dit proces bestaat uit vier stappen die doorlopen moeten worden voor legale en illegale gebruikers effectief gebruik kunnen maken van het netwerk en higher-layer datatrafiek kunnen verwerken.

  1. Scannen: passief of actief zoeken naar de netwerken in de buurt.
  2. Verbinden (joining): kiezen met welk netwerk zal verbonden worden.
  3. Authenticatie: bewijzen dat de gebruiker toegang heeft tot het netwerk.
  4. Associatie (association): bijhouden met welk AP de gebruiker verbonden is van het netwerk. Pas vanaf deze stap kan het netwerk gebruikt en misbruikt worden.

Scannen

In deze stap zal de client ontdekken welke netwerken er in de omgeving zijn. Oftewel zoekt de client specifiek naar een netwerk, oftewel wil hij gewoon een oplijsting van alle aanwezige netwerken. Ieder draadloze netwerk heeft een netwerknaam, de SSID (service set identifier) van maximaal 32 bytes (meestal gewoon leesbare tekst), en zal deze op geregeld tijdstip broadcasten voor iedereen die hier nood aan heeft. Naast het SSID zal ieder netwerk ook fysieke parameters uitsturen die de client in de volgende stap zal nodig hebben.

Er zijn meerdere kanalen beschikbaar in het spectrum waar binnen een netwerk mag werken. De client zal bij het scannen daarom steeds enkele milliseconden op een bepaald kanaal luisteren om potentiële SSID broadcasts op te vangen, om dan op het volgende kanaal hetzelfde te doen.

Tip

Sommige gebruikers schakelen het broadcasten van hun netwerknaam (het zogenaamde SSID) uit in de hoop dat zo dat buren, voorbijgangers en wardrivers hun netwerk niet kunnen zien. Helaas is dit zogenaamde snake’s oil: het geeft een vals gevoel van veiligheid. Je kan weliswaar SSID-broadcasting uitzetten (dit is een pakketje dat je access point elke paar seconden uitstuurt om aan iedereen die luistert te zeggen “Hallo, hier is het netwerk met naam X, en dit zijn de parameters die je nodig hebt om met mij te verbinden”) maar het SSID wordt ook in een hoop andere pakketjes de lucht in gestuurd. Een beetje wifi hacker kan dus het SSID ogenblikkelijk uit de lucht plukken, ongeacht dat broadcasting werd uitgeschakeld of niet.

Verbinden

Wanneer de gebruiker gekozen heeft met welk SSID er moet verbonden worden zal in deze stap de wifi-netwerkkaart ingesteld worden op de juiste fysieke parameters (frequentie kanaal, snelheid, etc.) zodat als het ware AP en client synchroon lopen (en dus op de juiste moment iets tegen elkaar kunnen zeggen zonder elkaars signalen te storen). In de scan-stap keken we als het ware goed rond, in deze stap richten we onze blik nu op een bepaald netwerk.

Authenticatie

Opmerking

Deze en de voorgaande stappen gebeuren volledig automatisch indien de gebruiker eerder heeft geopteerd om automatisch met een netwerk te verbinden.

In een bedraad netwerk zit authenticatie impliciet vervat in het fysiek aspect: wanneer je de kabel in je laptop kan steken dan is de kans groot dat je een legale gebruiker bent in het gebouw en dus is er geen extra authenticatie nodig (kort door de bocht gezien, weliswaar). Dat is niet zo met draadloze netwerken die voorbije de grenzen van het gebouw hun signaal uitsturen. Er is daarom een extra stap nodig voor we het netwerk kunnen betreden.

In de 802.11 standaard staan twee mogelijke authenticatie-methoden beschreven (die we verderop zullen toelichten):

  • Open-system authentication
  • Shared-key authentication

Origineel was deze authenticatie een enkelrichtingstraat. Enkel de client dient zich te authenticeren. Hierdoor bestaat dus de kans dat de gebruiker verbindt met een rogue of fake AP (daar er geen mutual authentication bestaat in de originele standaard).

Naast voorgaande twee methoden is er nog een derde, die niet in de standaard staat beschreven maar die wel door veel fabrikanten werd aangeboden in hun wifi-apparaten:

  • MAC Address Authentication gebruik makend van een MAC-ACL: hierbij kan de beheerder van een AP een access control list (ACL) aanleggen waarin alle MAC-adressen staan van toegelaten apparaten. Net zoals het verbergen van de SSID is dit vooral schijnveiligheid: MAC-adressen vliegen onversleuteld door de lucht, dus een stroper kijkt even welke adressen toegelaten zijn en spooft er vervolgens eentje (zie identity spoofing eerder).

Open-system authentication

Deze vorm van authenticatie werd eerst gezien als de versie om te zeggen: “er is geen authenticatie nodig op dit netwerk”.

Om op netwerken met deze modus te authenticeren, worden er exact twee frames tussen client en AP uitgewisseld:

  1. Eerst vraagt de client aan het AP toegang.
  2. Vervolgens stuurt het AP naar de client een “Welkom” frame.

Meer gebeurt er niet in deze modus.

Als er in dit soort netwerk geen encryptie wordt toegepast dan kan dus eender welk apparaat in de omgeving verbinding maken met dit netwerk. Als er wél WEP encryptie wordt gebruikt, dan zal het bezit van de WEP-sleutel als een soort toegangscontrole werken: je kan namelijk wel authenticeren (daar het AP iedereen toelaat in deze authenticatie-fase) maar vervolgens kan je geen data lezen en versturen tenzij je een geldige WEP-sleutel hebt (zie verder).

Verderop zullen we ontdekken dat - oh ironie - deze authenticatie-methode veiliger is dan de shared-key authentication die we zo meteen gaan uitleggen.

Shared-key authentication

In deze modus moet je bewijzen dat je in het bezit bent van een geldige WEP-sleutel voor dit netwerk. Het AP zal daarom een challenge-response authenticatie opstarten bestaande uit volgende sequentie van frames:

  1. Het AP maakt een random string aan, de challenge, en stuurt deze in plaintext naar de client.
  2. De client encrypteert deze string met z’n WEP-sleutel en stuurt dit terug naar het AP (de response).
  3. Het AP zal nu de response decrypteren met z’n eigen WEP-sleutel en het resultaat vergelijken met de challenge-string. Als beiden gelijk zijn weet het AP dat de client een geldige WEP-sleutel heeft en dus toegelaten mag worden op het netwerk.

De shared-key authentication aan de start van de verbinding.

De shared-key authentication aan de start van de verbinding.
Tip

Merk op dat aanvallers die deze handshake sniffen, twee interessante frames zien passeren. Eerst zien ze een plaintext, ogenblikkelijk gevolgd door de bijhorende ciphertext ervan (indien ze een gebruiker sniffen met een geldige WEP-sleutel). Dit heet in cryptanalyse een gekende plaintext aanval. Dit zal interessante informatie blijken verderop in dit horrorverhaal, waarin we zullen tonen waarom WEP niet zo veilig bleek te zijn als gehoopt.

Associatie

Na een succesvolle authenticatie krijgt de client een association ID toegewezen. Dit ID gebruikt het netwerk om te weten waar in het netwerk de client zich bevindt. Veel draadloze netwerken bestaan namelijk uit meerdere AP’s en via dit ID weet het netwerk met welk AP de client momenteel verbonden is en zal alle data voor de client dan naar dat AP sturen.

Vanaf dit punt kan de gebruiker dus de bronnen van het netwerk beginnen gebruiken en wordt het tijd om deze communicatie te beveiligen (tenzij het om een publieke hotspot gaat waar iedereen alles van elkaar kan zien).

WEP

Om potentiële aanvallers ervan te weerhouden dat ze trafiek kunnen sniffen (of zelf op het netwerk zetten) voorziet de 802.11 standaard vanaf de associatie de optie om encryptie te voorzien. Dit gebeurt aan de hand van WEP, wat staat voor wired equivalent privacy. Een naam die veel beloofde maar niet zo goed was: het idee was dat WEP even veilig zou zijn als een bedraad netwerk. WEP was bovendien optioneel, en veel netwerken gebruikten het dan ook gewoon niet.

Hoe werkt WEP?

Het hart van WEP is het RC4-algoritme dat we reeds zagen in het crypto-hoofdstuk. De WEP-sleutel doet dienst als de seed voor de keystream generatie. Deze keystream wordt op zijn beurt ge-XOR’d met het te encrypteren frame.

WEP in de 802.11-stack: een optionele stap in de MAC-laag, vlak voor de frames de lucht in gaan.

WEP in de 802.11-stack: een optionele stap in de MAC-laag, vlak voor de frames de lucht in gaan.

Confidentiality en integriteit worden tegelijkertijd afgehandeld in WEP. Vlak voor het frame via de XOR-operatie wordt geëncrypteerd, gaat het eerst door een integrity check algoritme: CRC-32, een oude getrouwe op het gebied van foutdetectie. CRC-32 berekent een soort checksum die de ontvanger kan gebruiken om te zien of het frame werd aangepast na verzenden. Deze checksum, de Integrity Check Value (ICV), wordt mee geëncrypteerd door RC4. Het idee: een aanvaller kan het frame niet aanpassen zonder daarmee ook de ICV ongeldig te maken. We zullen zien dat dit idee niet klopt.

WEP frame lay-out.

WEP frame lay-out.

De IV

Origineel ondersteunde WEP enkel 40-bit sleutels (later 104-bit). Toen de standaard werd geschreven besefte men al dat er een probleem zou zijn: ieder frame dat met dezelfde sleutel wordt geëncrypteerd, gebruikt ook dezelfde keystream. En bij een streamcipher is dat, zoals we in het crypto-hoofdstuk zagen, uit den boze. Daarom werd gekozen om te werken met een initialisatie vector (IV) van 24 bit. Door ieder frame een andere IV te geven, gebruikt ieder frame een andere keystream: WEP-sleutel + IV wordt de nieuwe seed per frame. De originele standaard beschreef echter niet hoe die IV moest veranderen, wat nefaste gevolgen zal hebben.

Omdat de ontvanger dezelfde keystream moet kunnen genereren, moet hij ook de IV kennen. De IV gaat daarom als plaintext mee in de header van het frame.

Tip

Dit concept van een sleutel verlengen met een arbitrair getal heet salting en zullen we in het hoofdstuk omtrent wachtwoorden en authenticatie verderop in de cursus nog zien terugkomen.

WEP encryptie in z’n geheel: sleutel en IV als seed voor RC4, CRC-32 voor de ICV.

WEP encryptie in z’n geheel: sleutel en IV als seed voor RC4, CRC-32 voor de ICV.