Ik kwam er onlangs achter dat de 2D-barcode op PostNL-pakketlabels meer informatie bevat dan je zou verwachten -- je e-mailadres. De data is alleen gecomprimeerd (deflate), niet versleuteld. Iedereen met basiskennis kan dit uitlezen.
WAT ZIT ER IN DE BARCODE?
De code op een PostNL-label begint met een herkenbare prefix (bijv. PNL3STUNM...) gevolgd door een blok base64-gecodeerde data. Als je die base64 decodeert en vervolgens deflate-decompressie toepast (vanaf offset 1), krijg je een binaire structuur met daarin in plain text:
- Achternaam
- Voornaam
- Straatnaam + huisnummer
- Postcode
- Woonplaats
- Datum
- E-mailadres
HOE REPRODUCEER JE DIT?
Neem de lange code van een PostNL-label (de string die begint met PNL3S...). Knip het prefix eraf tot aan het base64-gedeelte (herkenbaar aan de + en = tekens en alfanumerieke karakters). Decode vervolgens:
WAAR KOMT DAT E-MAILADRES VANDAAN?
PostNL vraagt webshops actief om het e-mailadres van de ontvanger mee te sturen bij het aanmaken van een verzendlabel. In hun officiele Labelling API documentatie (https://developer.postnl.nl) staat bij het Contact type:
"Please add the e-mail address of the receiver to improve the
Mijn PostNL experience of your customer."
Dit e-mailadres wordt vervolgens opgenomen in de gecomprimeerde data die in de barcode op het fysieke label terechtkomt. Voor bepaalde producten (avondlevering, ophalen bij PostNL-punt) is het zelfs verplicht om minstens e-mail, SMS-nummer of telefoonnummer mee te sturen.
WAAROM IS DIT EEN PROBLEEM?
1. Geen encryptie
De data is alleen gecomprimeerd, niet versleuteld. Decompressie is triviaal.
2. Meer data dan zichtbaar
Op het label zelf zie je naam en adres in leesbare tekst. Maar het e-mailadres is alleen zichtbaar als je de barcode decodeert. Een consument verwacht niet dat zijn e-mailadres fysiek op een pakketlabel staat.
3. Dataminimalisatie (AVG art. 5 lid 1c)
Het e-mailadres is niet nodig voor de fysieke bezorging. Waarom zit het dan in een barcode die iedereen kan scannen?
4. Transparantie (AVG art. 13/14)
PostNL informeert consumenten niet dat hun e-mailadres in de barcode op het pakket zit. De privacyverklaring noemt het verwerken van e-mailadressen, maar niet dat deze fysiek uitleesbaar op het pakket staan.
5. Praktisch risico
Iedereen die een foto maakt van je pakketlabel -- een buurman, iemand in een sorteercentrum, een voorbijganger bij een stapel retouren -- kan met een simpel script je naam, adres en e-mailadres achterhalen. Dat is een combinatie die bruikbaar is voor gerichte phishing.
WAT IK NIET HEB GEVONDEN
Ik heb uitgebreid gezocht op Tweakers, Radar-forum, Security.nl en in internationale bronnen. Er zijn wel discussies over PostNL en privacy (QR-code scannen bij pakketpunten, metadata van brieven, clipboard-uitlezing door de app), maar het feit dat het e-mailadres onversleuteld in de barcode op het pakketlabel staat lijkt nog nergens publiek beschreven te zijn.
ADVIES
- Scheur altijd het label van je pakket voordat je de doos weggooit
- Overweeg bij webshops een apart e-mailadres te gebruiken voor bestellingen
- PostNL zou de data in de barcode moeten versleutelen, of op z'n minst het e-mailadres eruit moeten halen -- het is niet nodig voor de bezorging
Ik ben benieuwd of anderen dit kunnen bevestigen met hun eigen pakketlabels.
WAT ZIT ER IN DE BARCODE?
De code op een PostNL-label begint met een herkenbare prefix (bijv. PNL3STUNM...) gevolgd door een blok base64-gecodeerde data. Als je die base64 decodeert en vervolgens deflate-decompressie toepast (vanaf offset 1), krijg je een binaire structuur met daarin in plain text:
- Achternaam
- Voornaam
- Straatnaam + huisnummer
- Postcode
- Woonplaats
- Datum
- E-mailadres
HOE REPRODUCEER JE DIT?
Neem de lange code van een PostNL-label (de string die begint met PNL3S...). Knip het prefix eraf tot aan het base64-gedeelte (herkenbaar aan de + en = tekens en alfanumerieke karakters). Decode vervolgens:
code:
Je ziet dan je volledige NAW-gegevens en e-mailadres voorbijkomen.1
2
3
4
5
6
7
8
9
10
| import base64, zlib
b64_data = "<plak hier het base64 gedeelte>"
raw = base64.b64decode(b64_data)
decompressed = zlib.decompress(raw[1:], -15)
for line in decompressed.split(b'\x00'):
text = line.decode('utf-8', errors='ignore').strip()
if len(text) > 2:
print(text) |
WAAR KOMT DAT E-MAILADRES VANDAAN?
PostNL vraagt webshops actief om het e-mailadres van de ontvanger mee te sturen bij het aanmaken van een verzendlabel. In hun officiele Labelling API documentatie (https://developer.postnl.nl) staat bij het Contact type:
"Please add the e-mail address of the receiver to improve the
Mijn PostNL experience of your customer."
Dit e-mailadres wordt vervolgens opgenomen in de gecomprimeerde data die in de barcode op het fysieke label terechtkomt. Voor bepaalde producten (avondlevering, ophalen bij PostNL-punt) is het zelfs verplicht om minstens e-mail, SMS-nummer of telefoonnummer mee te sturen.
WAAROM IS DIT EEN PROBLEEM?
1. Geen encryptie
De data is alleen gecomprimeerd, niet versleuteld. Decompressie is triviaal.
2. Meer data dan zichtbaar
Op het label zelf zie je naam en adres in leesbare tekst. Maar het e-mailadres is alleen zichtbaar als je de barcode decodeert. Een consument verwacht niet dat zijn e-mailadres fysiek op een pakketlabel staat.
3. Dataminimalisatie (AVG art. 5 lid 1c)
Het e-mailadres is niet nodig voor de fysieke bezorging. Waarom zit het dan in een barcode die iedereen kan scannen?
4. Transparantie (AVG art. 13/14)
PostNL informeert consumenten niet dat hun e-mailadres in de barcode op het pakket zit. De privacyverklaring noemt het verwerken van e-mailadressen, maar niet dat deze fysiek uitleesbaar op het pakket staan.
5. Praktisch risico
Iedereen die een foto maakt van je pakketlabel -- een buurman, iemand in een sorteercentrum, een voorbijganger bij een stapel retouren -- kan met een simpel script je naam, adres en e-mailadres achterhalen. Dat is een combinatie die bruikbaar is voor gerichte phishing.
WAT IK NIET HEB GEVONDEN
Ik heb uitgebreid gezocht op Tweakers, Radar-forum, Security.nl en in internationale bronnen. Er zijn wel discussies over PostNL en privacy (QR-code scannen bij pakketpunten, metadata van brieven, clipboard-uitlezing door de app), maar het feit dat het e-mailadres onversleuteld in de barcode op het pakketlabel staat lijkt nog nergens publiek beschreven te zijn.
ADVIES
- Scheur altijd het label van je pakket voordat je de doos weggooit
- Overweeg bij webshops een apart e-mailadres te gebruiken voor bestellingen
- PostNL zou de data in de barcode moeten versleutelen, of op z'n minst het e-mailadres eruit moeten halen -- het is niet nodig voor de bezorging
Ik ben benieuwd of anderen dit kunnen bevestigen met hun eigen pakketlabels.