Wifi is makkelijk en vaak zelfs de enige optie maar er schuilt een serieus privacyprobleem achter. Uw telefoon/laptop zendt voortdurend informatie door de lucht over wifipunten zoals routers en hotspots waar u in het verleden verbinding mee heeft gehad. Die informatie is onversleuteld en voor iedereen in te zien met een beetje moeite. Ik leg uit hoe dit in elkaar zit.

Eerst vertel ik het in begrijpelijke taal zodat de niet-technische gebruiker begrijpt waar het probleem zit. Verderop staat een technische verdieping hoe deze informatie uit de lucht geplukt kan worden.

Voor u als gebruiker

Uw telefoon onthoudt elk wifipunt waar u ooit verbinding mee heeft gehad. Wanneer u bijvoorbeeld met uw telefoon verbinding maakt met de wifi-router thuis dan onthoudt de telefoon dat wifipunt. Dat is handig want als u de volgende keer thuis komt dan hoeft u niet opnieuw dat wifipunt op te zoeken. Op uw telefoon is dan al de naam van het wifipunt en het wachtwoord opgeslagen. Gaat u dan naar uw werk en maakt u verbinding met het wifipunt daar dan gebeurt hetzelfde: de naam van het wifipunt en het wachtwoord wordt opgeslagen op uw telefoon. En vervolgens gaat u op vakantie met de trein (waar u wifi gebruikt) via een vliegveld (waar u wifi gebruikt) naar een hotel (waar u wifi gebruikt). U komt weer thuis en gaat naar een horecagelegenheid (waar u wifi gebruikt) en tenslotte gaat u nog even bij uw familie (waar u wifi gebruikt) langs. Resultaat: uw telefoon bevat een redelijke lijst met wifipunten waar u verbinding mee heeft gehad.

De voorgaande telefoon staat vol met wifipunten waar u verbinding mee heeft gehad. Wat is nu de eigenaardigheid? Uw telefoon probeert elke zoveel minuten alle opgeslagen wifipunten op te zoeken. Grofweg gezegd gooit de telefoon het volgende, bijna letterlijk, de lucht in: ‘Is wifipunt Fam_DeJong ook in de buurt?’ De telefoon hoopt dat het wifipunt Fam_DeJong in de buurt is. Is dat het geval dan antwoordt wifipunt Fam_DeJong bevestigend waarna er verbinding gemaakt wordt. Is het wifipunt niet in de buurt dan probeert de telefoon het volgende wifipunt wat in z’n lijst staat. Heeft u met 5 wifipunten verbinding gehad in het verleden? Dan zal de telefoon voor alle 5 wifipunten in de lijst proberen een verbinding te maken totdat een wifipunt antwoordt. En zelfs nadat de verbinding tot stand is gekomen, blijft de telefoon vaak controleren of de andere wifipunten in de lijst online zijn.

Privacyprobleem

Dat een telefoon zoekt naar wifipunten is op zich niet erg. De telefoon zal toch te weten moeten komen of een wifipunt online is. Maar er is een onderliggende privacykwestie: alle pogingen om een wifipunt op te zoeken, vinden onversleuteld plaats. Iemand die bij u in de buurt is kan met de juiste hard/software eenvoudig de lijst reproduceren van wifipunten waar uw telefoon verbinding mee heeft gehad. Vragen als ‘is wifipunt Fam_DeJong ook in de buurt?’ vliegen letterlijk door de lucht. Heeft u verbinding gehad met 10 wifipunten? Dan vliegen er 10 vragen door de lucht met de naam van het wifipunt. Het probleem hier is dus dat ik eenvoudig kan zien met welke wifipunten u verbinding hebt gehad terwijl ik niets met die informatie te maken heb.

Behalve de lijst met wifipunten, verstuurt de telefoon nog iets anders: het mac-adres van de telefoon. Dat heeft niets te maken het merk van Apple. Een mac-adres is een uniek hardwareadres van de netwerkhardware van uw telefoon. Kortom, het identificeert uw telefoon. In de lijst met wifipunten die uw telefoon verstuurt, staat ook het mac-adres. Zo kan ik uw mac-adres dus koppelen aan de wifipunten waar u verbinding mee heeft gehad. Het mac-adres kán aangepast worden maar normale gebruikers (99.9999%) zullen dat nooit doen.

Volgen en politie

Je kunt er ook nog op een andere manier naar kijken. Bij mij thuis rijdt elk kwartier een stadsbus van Qbuzz voorbij. In die bus zit een stuk hardware wat exact hetzelfde doet als uw telefoon: zoeken naar bekende wifipunten. Dat kan ik zien zonder dat ik naar buiten hoef te kijken. Uit de lucht haal ik de vraag ‘Is ‘qbuzz-all-ssid’ in de buurt?’. Elke keer dat die vraag voorbij komt in mijn omgebouwde router, weet ik dat een Qbuzz-bus voorbij rijdt. Dat kan ik dus ook doen met mensen en hun telefoon. Anders gesteld: ik kan bijhouden wanneer iemand met een bepaald profiel mijn huis voorbij gaat. Iemand is dus simpelweg te volgen.

Wil je controleren of iemand op locatie X is geweest dan moet je zo’n omgebouwde router op locatie X plaatsen. Houdt de politie iemand aan dan is het interessant om het eerder genoemde mac-adres te vergelijken met wat de omgebouwde router voorbij heeft zien komen op locatie X. Dan heb je al een grote aanwijzing dat de persoon daadwerkelijk op locatie X is geweest. 100% zeker weet je dat niet omdat je het mac-adres kunt aanpassen. Verder kan de politie dus ook eenvoudig inzien op welke plaatsen je grofweg geweest bent aan de hand van de hierboven genoemde lijst met wifipunten.

Hoe eenvoudig kan iemand mijn wifipunten inzien?

Er is niet veel hard/software nodig om te zien met welke wifipunten de telefoon van uw buurman verbinding probeert te maken. Hiervoor noemde ik een omgebouwde router maar de meeste laptops met wifi-functionaliteit voldoen al. Dat betekent dus dat elke op de consumentenmarkt verkrijgbare laptop, voldoet. Er moet wat specifieke software geschreven worden om de wifipunten te verzamelen. Om een groter bereik te behalen en dus van meer mensen een lijst te produceren, gebruik ik zelf hieronder een omgebouwde wifirouter. Mijn punt is echter dat er niet per se specifieke hardware nodig is.

Het volgende filmpje laat zien wat mijn omgebouwde router ziet aan telefoons (en laptops etc.) in de buurt. De namen van de wifipunten zijn gedeeltelijk afgeschermd t.b.v. de privacy maar denk er wel om: ik kan het gewoon wel inzien net als elke ander persoon die z’n best doet. Het is overigens wettelijk geen geheime informatie maar het is wat mij betreft wel privacygevoelig. Dit is dus een lijst met wifipunten die telefoons in de buurt proberen te zoeken en die ze niet kunnen vinden. Al deze telefoons hebben in het verleden contact gehad met de wifipunten die u in dit filmpje ziet. Elk omlijnde kader is één telefoon/laptop/tablet.

Veiligheid

Wat ik wil benadrukken is dat de wachtwoorden niet zijn in te zien door verkeer uit de lucht af te luisteren. Ook als eenmaal verbinding gemaakt wordt, dan vindt dat versleuteld en veilig plaats. Het gaat hier echt om een privacykwestie: het is eenvoudig in te zien waar u geweest bent als de naam van een wifipunt dat laat zien en dit is te koppelen aan een uniek hardware-adres.

Wat kunt u doen?

Sowieso raad ik af om verbinding te maken met onbekende wifipunten. Mobiel dataverkeer is tegenwoordig zó goedkoop in Nederland dat het risico te groot is voor de kosten. Verder gaat het hier ook om bewustwording en niet zozeer om een goede oplossing aan te dragen want die is er niet echt vind ik.

  • Zet de wifi-functionaliteit van uw telefoon/laptop/tablet uit als u geen gebruik gaat maken van wifi. De telefoon verstuurt de hierboven genoemde lijst dan ook niet.
  • Bezoekt u een locatie waarvan u niet wil dat een ander weet dat u er geweest bent? Maak dan geen verbinding met het daar aanwezige wifipunt.
  • Maak bij voorkeur verbinding met wifipunten die niet verraden op welke locatie u bent. ‘CafeHetBiertje_Guest’ is niet goed, ‘Guest_Wifi’ is een stuk beter.
  • Sommige telefoons hebben de mogelijkheid om wifipunten te ‘vergeten’. Maak daar gebruik van zodat uw telefoon geen grote lijst met wifipunten meer door de lucht verzendt.

Weet ook dat uw laptop hetzelfde doet als de hierboven genoemde telefoon. Bij een laptop is het risico iets groter omdat u met een laptop wat sneller gebruik maakt van een wifipunt. Er is simpelweg vaak geen andere mogelijkheid om verbinding te maken met internet als het om een laptop gaat en er geen netwerkverbindingen zijn.

Lijst met wifipunten verwijderen

U kunt zelf de lijst met wifipunten verwijderen waar u ooit geweest bent. Dan moet u wel opnieuw verbinding maken met huidige wifipunten maar dat lijkt me een kleine prijs.

Voor iOS (Apple apparatuur) gaat u naar Instellingen > Algemeen > Stel opnieuw in > Herstel netwerkinstellingen.
Voor Android gaat u naar Instellingen > Back-up maken en herstellen > Reset netwerkinstellingen

Tot zover de uitleg voor gebruikers. Mijn doel van het bovenstaande is om u er bewust van te maken dat informatie over de door u gebruikte wifipunten eenvoudig is in te zien door vreemden. Onthoudt goed: elke keer wanneer u verbinding maakt met een wifipunt dan is dat later door anderen te zien. Het is aan fabrikanten om hier een goede oplossing voor te verzinnen.

Technische verdieping

Nu volgt een wat technische uitleg over wat ik nu precies uit de lucht pluk om een lijst met door telefoons gezochte wifipunten te genereren. Telefoons/laptops/tablets en andere wifi clients noem ik vanaf hier mobile stations en wifipunten noem ik access points.

Mobile stations die ooit een geslaagde 802.11 association met een access point hebben gehad, slaan de SSID op van dat access point. Om te begrijpen hoe dat werkt, is het van belang om te begrijpen hoe een klein gedeelte van het association process in zijn werk gaat. Allereerst doet een mobile station een probe request met daarin onder meer de SSID van het access point. Dat doet de mobile station voor álle access points waar het in het verleden een succesvolle association mee heeft gehad. Dan komt daar een probe response op van het access point. Vervolgens wordt er geauthenticeerd. Als dat allemaal in orde is dan wordt de association voltooid. Het proces van authenticatie en association zelf behandel ik verder niet omdat het hier niet verder relevant is. Wat hier belangrijk is: als eenmaal een geslaagde association heeft plaatsgevonden, slaat het mobile stations de SSID van het access point lokaal op.

Gebruikte hardware/software

In dit geval heb ik een TP-Link AC1750 gebruikt. Hiervan heb ik de originele firmware verwijderd en vervolgens er OpenWRT/LEDE overheen geflasht. Op die manier heb ik volledige toegang tot de router. Er draait een Python-script op de router dat voortdurend de output van een tcpdump filtert en daaruit de mac-adressen, SSID’s en signaalsterkes haalt via reguliere expressies. Deze gegevens worden vervolgens in een sqlite3-database opgeslagen samen met het tijdstip waarop voor het laatste een probe request door tcpdump is opgepikt. Op die manier kan ik de data eenvoudig uitlezen en deze verpakken in een user interface. Die interface is in dit geval een eenvoudige PHP-website op de router die de database pollt op nieuwe entries. Zie het eerder getoonde filmpje hoe dit er client-side uitziet.

Instellingen router

De router wordt ‘misbruikt’ om wifi-signalen op te pikken. De WAN-interface is niet noodzakelijk en gebruik ik alleen om even packages te installeren vanaf internet op de router.
De router moet vervolgens via de LAN-bridge aan een laptop/computer gehangen worden zodat je kunt ssh’en naar de router.

De probe requests uit de lucht plukken

Een mobile station blijft probe requests (hierboven stap 1) sturen op basis van de lijst van access points waar eerder verbinding mee is geweest. Zo’n probe request is een management frame. Hiervoor is het van belang dat de wifi-hardware in monitor mode wordt ingesteld. Meestal is zoiets voldoende: ‘iwconfig wlan1 mode monitor’. Vervolgens kan ik met tcpdump de probe requests uit de lucht plukken. In de volgende dump heb ik privacygevoelige info weggestreept. Publieke hotspots heb ik laten staan. Bovenin ziet u hoe ik tcpdump gebruik:

Het resultaat in een sqlite3-database

Zoals gezegd slaat het Python-script de gefilterde output op van tcpdump. Elke keer als een access point al bestaat bij een mac-adres, wordt alleen de timestamp en de signaalsterke overschreven. Op die manier zou je kunnen bijhouden of iemand dichter naar je toe komt of in de buurt aanwezig blijft bijvoorbeeld.

Afsluitend

Veel meer is het niet… In dit Python-script is te zien hoe ik e.e.a. uit de tcpdump haal, hoe de reguliere expressies werken en hoe het uiteindelijk opgeslagen wordt in de database. Vergeet niet dat de SSID’s ongefilterd de database ingaan, dus zonder sanitizing van html/js. Sql injectie zal moeilijker worden omdat ik gebruik maak van parameters.

Speciaal voor de Mac heb ik ook een Python-script geschreven.