Gevoelige gegevens gedeeld met analysediensten
CWE-200CWE-359OWASP A05:2021Bijgewerkt 4 september 20264 min leestijd
Scripts van analysediensten, foutrapportage en sessieopnames draaien in uw pagina met dezelfde rechten als uw eigen code. Ze sturen standaard URL's, paginatitels en soms formulierinhoud door. Op een pagina met een dossiernummer, een diagnose of een herstel-token betekent dat een doorgifte van gevoelige gegevens die u niet had beoogd.
Analytics, foutrapportage en sessieopnames worden ingericht door mensen die willen weten hoe de applicatie wordt gebruikt. De scripts die daarvoor worden toegevoegd, draaien echter in uw pagina met dezelfde rechten als uw eigen code, en ze verzamelen standaard meer dan waarvoor ze zijn geplaatst. Hieronder leest u wat er meegaat en hoe u dat inperkt zonder uw inzicht te verliezen.
Wat gaat er mee?
Een analysescript verzamelt standaard de volledige URL van elke bezochte pagina, de titel van die pagina, de verwijzende pagina en een identificatie waarmee bezoeken aan elkaar worden geknoopt. Foutrapportagescripts sturen daarnaast de stacktrace door en vaak de inhoud van variabelen op het moment van de fout. Sessieopnamescripts leggen vast wat de bezoeker daadwerkelijk doet, inclusief wat hij intypt.
Van gevoelige gegevens gedeeld met analysediensten spreken we wanneer daar informatie tussen zit die niet bij een derde partij thuishoort. Dat gebeurt zelden bewust; het gebeurt doordat de standaardinstellingen zijn overgenomen en niemand heeft nagegaan wat er op de betreffende pagina’s in de URL en de titel staat.
De vergelijking die past: u vraagt iemand bij te houden hoeveel bezoekers er langskomen, en hij noteert vervolgens ook waar iedereen naartoe ging en wat er op de formulieren stond. Hij doet niets kwaadaardigs, hij noteert alles, want dat is wat hij standaard doet.
Hoe ziet zo’n analyticsverzoek eruit?
Kwetsbaar:
<!-- Standaardinstallatie, alles wordt doorgegeven -->
<script>
analytics.init({ site: 'PORT-4471' }); // stuurt URL, titel en verwijzer
</script>
Op de meeste pagina’s is dat onschuldig. Op deze niet:
URL : /dossier/38921/uitslag?client=j.dekker%40bedrijf.nl&type=arbeidsconflict
Titel : Uitslag onderzoek | J. Dekker | arbeidsconflict | Voorbeeld B.V.
Beide worden doorgegeven aan de analysedienst. In de rapportage van die partij staat nu een dossiernummer, een e-mailadres en het onderwerp van de zaak: informatie die u nooit hebt willen delen. Ernstiger wordt het op een pagina met een herstel-token in de URL: dat token gaat dan mee naar een externe partij en staat in haar logbestanden, waarmee het geen geheim meer is.
Bij foutrapportage is het patroon vergelijkbaar. Een fout in de communicatie met een externe API neemt vaak het volledige verzoek mee, inclusief de gebruikte sleutel:
{
"message": "Request failed with status 401",
"config": {
"url": "https://api.betaaldienst.example/v2/transacties",
"headers": { "Authorization": "Bearer sk_live_51H8xQ2..." }
}
}
Veilig:
// Bepaal zelf wat er wordt doorgegeven
analytics.init({
site: 'PORT-4471',
automatischPad: false,
});
function meldPagina(pad) {
// Identificaties vervangen door een sjabloon
const schoon = pad
.replace(/\/dossier\/\d+/, '/dossier/:id')
.replace(/\?.*$/, '');
analytics.pagina({ pad: schoon, titel: document.title.split(" | ")[0] });
}
// En foutrapportage die geheimen wegfiltert vóór verzending
foutrapportage.init({
voorVerzending(gebeurtenis) {
delete gebeurtenis.request?.headers?.Authorization;
delete gebeurtenis.request?.cookies;
gebeurtenis.request.url = gebeurtenis.request.url?.split('?')[0];
return gebeurtenis;
},
maskeerVelden: ['wachtwoord', 'bsn', 'iban', 'token'],
});
Het uitgangspunt is omgedraaid: u bepaalt wat er wordt verstuurd in plaats van het script. De statistieken blijven bruikbaar, u ziet nog steeds hoeveel dossierpagina’s er zijn bekeken, maar de identificerende gegevens blijven binnen.
Referrer-Policy beperkt één van die routes en lost het onderliggende probleem niet op.Wat is de impact van gegevensdeling met analysediensten?
De ernst is laag tot middelzwaar, en hangt af van wat er precies weglekt. Gaat het om paginatitels en padnamen zonder identificerende gegevens, dan blijft het bij een privacyaandachtspunt. Zitten er persoonsgegevens, dossiernummers of medische, juridische of financiële aanduidingen in, dan is het een doorgifte waarvoor u onder de AVG verantwoordelijk bent en die u waarschijnlijk niet in uw verwerkingsregister hebt staan.
Het wordt een beveiligingsprobleem zodra er waarden meegaan die toegang verlenen. Een herstel-token of een sessie-identificatie in de URL die bij een externe partij in de logbestanden belandt, is een geheim dat u niet meer beheert. Wie toegang heeft tot die logs (medewerkers van die partij, een aanvaller die haar compromitteert) heeft daarmee toegang tot uw accounts.
Er speelt daarnaast een risico dat losstaat van de gegevens zelf. Deze scripts draaien in uw pagina met volledige rechten. Wordt de leverancier of het distributienetwerk gecompromitteerd, dan draait aangepaste code op uw domein bij al uw bezoekers. Dat is precies waarom integriteitscontrole en een strikte Content Security Policy hier van belang zijn.
Hoe spoor je gegevensdeling met analysediensten op?
Een tester bekijkt het uitgaande netwerkverkeer van de applicatie en inventariseert naar welke externe partijen er gegevens worden gestuurd. Vervolgens wordt per verzoek gekeken wat er precies meegaat: de URL, de titel, de verwijzer, en bij foutrapportage de inhoud van het gemelde object.
De aandacht gaat daarbij naar de gevoelige pagina’s, niet naar de startpagina. Wat staat er in de URL en de titel van een dossierpagina, een uitslag, een betaalbevestiging of een herstelpagina? Wordt daar een identificatie of een token doorgegeven? Ook wordt gekeken of er sessieopnames draaien en of invoervelden daarbij worden gemaskeerd. Verder wordt getoetst of de scripts met integriteitscontrole worden geladen en of ze in de Content Security Policy zijn afgebakend. AssistSec beoordeelt daarnaast of het aantal externe partijen in verhouding staat tot wat de organisatie ervan gebruikt, omdat scripts vaker worden toegevoegd dan verwijderd.
Hoe voorkom je gegevensdeling met analysediensten?
- Bepaal zelf welke gegevens u doorgeeft in plaats van de standaardinstellingen over te nemen.
- Vervang identificaties in paden door een sjabloon en stuur queryparameters niet mee.
- Gebruik neutrale paginatitels die geen namen, dossiernummers of onderwerpen bevatten.
- Filter bij foutrapportage headers, cookies en tokens weg vóór verzending.
- Maskeer invoervelden bij sessieopnames expliciet, en sla wachtwoordvelden altijd over.
- Zet nooit tokens of persoonsgegevens in een URL.
- Laad externe scripts met een integriteitscontrole en beperk ze in uw Content Security Policy.
- Inventariseer periodiek welke externe partijen er meelezen en verwijder wat niet meer wordt gebruikt.
- Neem de doorgifte op in uw verwerkingsregister en beoordeel of er een grondslag voor is.
Bronnen
Veelgestelde vragen
Wat sturen analytics-scripts standaard door?
De volledige URL inclusief parameters, de paginatitel, de verwijzende pagina, schermgegevens, taal en een identificatie waarmee bezoeken aan elkaar worden gekoppeld. Bij foutrapportage komen daar de stacktrace en vaak de inhoud van variabelen bij; bij sessieopnames de daadwerkelijke handelingen op het scherm.
Is dit een beveiligings- of een privacykwestie?
Beide, en welke overheerst hangt af van wat er weglekt. Gaat het om paginatitels, dan is het vooral privacy. Zit er een herstel-token of een sessie-identificatie in de URL, dan is het een beveiligingsprobleem, want die waarden verlenen toegang.
Wat zijn sessieopnames precies?
Scripts die de handelingen van een bezoeker vastleggen en later als film afspelen: muisbewegingen, klikken en ingetypte tekst. Zonder zorgvuldige maskering betekent dat het vastleggen van alles wat iemand invult, inclusief persoonsgegevens en soms wachtwoorden.
Hoe beperk ik dit zonder mijn statistieken te verliezen?
Door te sturen wat u wilt meten in plaats van wat het script standaard verzamelt. Geef een geschoond pad door in plaats van de volledige URL, gebruik neutrale paginatitels, en maskeer velden expliciet. Uw statistieken blijven bruikbaar; alleen het detailniveau bij de externe partij daalt.
Verwante artikelen
- KwetsbaarhedenCWE-693A05:2021Ontbrekende Content Security PolicyZonder Content Security Policy mag de browser scripts van elke bron laden. Lees wat een CSP doet, hoe u er een opstelt en welke fouten hem waardeloos maken.
- KwetsbaarhedenCWE-200A01:2021Information disclosureInformation disclosure uitgelegd: hoe stack traces, .git-mappen, source maps en te ruime API-responses gegevens lekken, en hoe u dat voorkomt.
- KwetsbaarhedenCWE-200A05:2021Ontbrekend Referrer-PolicyZonder Referrer-Policy geeft de browser de volledige URL van uw pagina door aan elke externe site. Lees welke gegevens daarbij weglekken en hoe u dat stopt.
- KwetsbaarhedenCWE-598A07:2021Sessie-identificatie in de URLEen sessie-ID in de URL belandt in logbestanden, browsergeschiedenis en referrer-headers. Lees waarom dat sessies lekt en hoe u het oplost.
- KwetsbaarhedenCWE-353A08:2021Externe scripts zonder integriteitscontroleLaadt u JavaScript van een CDN zonder integrity-attribuut, dan draait elke wijziging daar direct op uw site. Lees hoe SRI dat blokkeert.