Tijdlijn:
- 12 augustus 2020: Probleem ontdekt en eerste poging tot contact per telefoon. De verantwoordelijke contactpersoon is niet aanwezig, mijn contactgegevens worden voor hem achtergelaten. De impact is mij onbekend, ik heb niet onderzocht wat voor mogelijkheden dit lek biedt. Dit is juridisch gezien waarschijnlijk niet de bedoeling, tevens vind ik het onethisch.
- 13 augustus 2020: Tweede poging tot contact, dit keer per email naar de juiste contactpersoon. Probleem wordt erkend, maar niet met prioriteit opgelost. Op een vervolgmail met vragen en aandringen om het probleem direct op te lossen, ontvang ik helaas geen reactie.
- 17 augustus 2020: Extern persoon geconsulteerd die ervaring heeft met het melden van dit soort beveiligingslekken.
- 27 augustus 2020: Het probleem is nog steeds aanwezig op de website.
- 28 augustus 2020: Bedrijf heeft gebeld om toelichting te bieden over het probleem en duidelijkheid te scheppen over de situatie en dit blog. Ze hebben toegezegd het probleem op te lossen. Ik heb aangegeven de beste intenties te hebben bij het schrijven van dit blog en mijn excuses aangeboden als dit tot problemen heeft geleid. Ik zal de naam van het bedrijf niet in dit blog vermelden zodat de intenties niet verkeerd geïnterpreteerd kunnen worden.
Beveiligingslek
Op 12 augustus 2020 was ik aan het zoeken naar een nieuwe laptop voor mijn werk en voor mijn studie. Mijn huidige wordt wat warm en is 4,5 jaar oud*. Ondanks de leeftijd doet hij het relatief nog goed, op wat enorme CPU-throttling na soms. Toen ik op de website van de winkel aan het kijken was naar nieuwe laptops stond er de optie om direct te zien wat de inruilwaarde zou zijn van je oude apparatuur. Dit sprak mij wel aan, dus ik besloot op deze optie te klikken. Er gebeurde echter niks. Als webdeveloper en nieuwsgierige student nam ik daar geen genoegen mee, dus ik dook de ontwikkelaarstools van mijn webbrowser in om te onderzoeken wat de knop zou moeten doen. Hierbij stuitte ik op 2 URLs waarbij de namen van de PHP-scripts mij duidelijk maakten dat ze geen standaardonderdelen waren van de ecommerce-software die de winkel gebruikt.
De twee scripts hadden ieder hun eigen functie:
- Het genereren van een PDF met daarin een waardeschatting van het door een gebruiker gekozen apparaat, en het opslaan van deze PDF op de webserver.
- Het versturen van de eerder gegenereerde PDF naar een e-mailadres naar keuze, zoals deze van de consument.
Het probleem zat echter al gedeeltelijk in script 1: Bij het opvragen was er geen validatie op de invoer van gebruikers, dus ik kon een lege PDF laten genereren, met enkel wat toelichting, de logo van het bedrijf en geen enkel product vermeld in de gegenereerde prijzentabel.
Script 1 gaf echter de PDF niet terug als bestand, maar het pad naar de PDF in de vorm van JSON: De bestandsnaam op schijf, het pad naar de PDF op de server en de publieke URL naar de PDF, de laatstgenoemde vermoedelijk zodat gebruikers deze direct konden bekijken in hun browser. Het pad naar de PDF op de server werd vervolgens gebruikt om naar script 2 te sturen, samen met een e-mailadres.
De oplettende lezer heeft helaas al door waar dit naartoe leidt. Script 2 accepteert het volledige pad naar een bestand op de schijf en een e-mailadres waar dit bestand naartoe gestuurd moet worden. Er is geen validatie aanwezig die controleert of het enkel de PDFs zijn die worden uitgelezen en bijgevoegd aan de e-mail, of alle andere bestanden die een kwaadwillende zou kunnen opvragen.
Na mijn theorie geverifieerd te hebben door te testen of script 2, script 1 naar mij zou mailen, trok ik de conclusie dat het een foute boel was. Ik heb direct gebeld naar de klantenservice van de winkel en aangegeven dat ik een urgent lek had ontdekt in hun website. De betreffende contactpersoon was echter niet aanwezig op kantoor, dus mijn contactgegevens werden voor hem achtergelaten.
De volgende dag, op 13 augustus, had ik nog niets vernomen van de winkel. Hierop besloot ik per WhatsApp nogmaals de urgentie aan de klantenservice duidelijk te maken, waarop ik het e-mailadres van de verantwoordelijke contactpersoon kreeg.
Ik heb direct een e-mail met hoge prioriteit verstuurd, waarop ik redelijk vlot een kort antwoord ontving in één regel: Het probleem werd erkend, ik werd bedankt en het onderdeel om de inruilwaarde zou in de volgende sprint van de website verwijderd worden. Ik had nog aangeboden om te telefonisch contact te hebben in mijn eerste mail, zodat ik het probleem beter kon toelichten en zodat ik vragen kon stellen over een eventuele vergoeding (ze hebben geen openbaar beleid hierover), de mogelijkheid tot een afstudeerstageplek (niet geschoten is altijd mis).
Ik heb deze vragen in een vervolgmail gesteld en erbij vermeld dat ik het raadzaam vind om de onveilige code zo snel mogelijk van hun website te verwijderen, niet om te wachten op het einde van de volgende sprint – ik heb geen idee wat de precieze impact van dit lek precies is, maar ik vind het onhandig om een gemeld beveiligingsprobleem gedurende de duur van een hele sprint (wekenlang?) te laten liggen. Op deze e-mail heb ik helaas geen antwoord meer ontvangen.
Op 28 augustus ben ik gebeld door het bedrijf met toelichting over het probleem en de gang van zaken. Er is wel snel naar mijn melding gekeken, maar helaas is dit niet meer teruggekoppeld aan mij destijds. Het probleem werd ingeschat als niet ernstig, waardoor het is bewaard tot een latere datum om op te lossen. Ik geloof ook dat het probleem geen grote impact heeft, want gegevens van een webwinkel zijn normaalgesproken ook niet opgeslagen op een toegankelijke manier voor de webserver - uiteraard heb ik dit niet getest en zullen zij dit zelf nog moeten nagaan, maar nogmaals, met de beste intenties, geloof ik dat de impact inderdaad beperkt blijft. Ze hebben dus niet het probleem laten liggen, daarbij trek ik mijn eerdere conclusie in de vorige paragraaf terug.
Ze gaan het probleem zo snel mogelijk verhelpen. Tevens gaan ze ervoor zorgen dat er interne processen in de plaats komen die verhinderen dat dit soort problemen in de toekomst weer kunnen optreden, een hele goede actie van het bedrijf.
Ze hebben mij bedankt voor de melding en vonden het fijn om te horen dat ik enkel goede intenties had. Ik zal de naam van het bedrijf uit dit bericht onthouden omdat het niet mijn intentie is ze een slechte naam te bezorgen.
*Nog geen week later is het mij duidelijk geworden dat mijn accu's zijn opgezwollen en mijn laptop nodig aan vervanging toe is. Ik werk nu helaas op een soort eufemisme voor een tijdbom, dus heb noodgedwongen een nieuwe besteld voordat mijn studie op 31 augustus begint. Dus bedrijf, als jullie meelezen, een vergoeding voor het melden zou niet misstaan 😉. Ze zijn zo vriendelijk geweest om mij een kleine vergoeding in de vorm van een cadeaubon toe te zeggen 😊.
Bovenstaande stootkussentjes zouden mooie platte batterijen moeten zijn.