Wat is Path Traversal en hoe voorkom je het?
Auteur: Redactie Domeny.ForSale Gepubliceerd
Kort samengevat: Path Traversal is een beveiligingslek waardoor een applicatie toegang geeft tot bestanden buiten de map die voor het afhandelen van een bepaald verzoek is bedoeld. Meestal wordt het in verband gebracht met het lezen van andermans bestanden, maar bij schrijf- of verwijderfuncties kan het ook mogelijk zijn bestanden te wijzigen of te wissen. Het probleem ontstaat wanneer een applicatie gebruikersinvoer als onderdeel van een bestandspad gebruikt en niet afdoende controleert waar dat pad naartoe leidt.
Wat betekent toegang buiten de toegestane map?
Een pad is het adres van een bestand in het bestandssysteem, bijvoorbeeld /srv/applicatie/documenten/handleiding.pdf. Een applicatie die documenten beschikbaar stelt, hoort alleen downloads vanaf een aangewezen locatie toe te staan, niet van willekeurige bestanden op de server.
Path Traversal, ook wel directory traversal of dot-dot-slash genoemd, houdt in dat die grens wordt overschreden. De naam dot-dot-slash verwijst naar de notatie ../: twee punten staan voor de bovenliggende map en de schuine streep scheidt de onderdelen van het pad. Zo kan deze tekenreeks een bewerking buiten de toegestane map laten plaatsvinden.
Je kunt het vergelijken met een loket waar documenten worden afgegeven. De klant hoort een documentnummer op te geven, waarna de medewerker het document uit de juiste kast haalt. Het gaat mis wanneer de medewerker in plaats van een nummer een instructie accepteert: ‘Ga bij deze kast weg, loop naar de kamer hiernaast en pak het aangegeven bestand.’
Voorbeeld: een document downloaden op bestandsnaam
Stel dat een applicatie openbare documenten opslaat in de map /srv/applicatie/documenten/. De gebruiker kiest een bestand en de browser verstuurt een verzoek:
/download?bestand=handleiding.pdf
Als het programma de waarde van de parameter bestand zonder controle achter het pad naar de documentenmap plakt, ontstaat het pad /srv/applicatie/documenten/handleiding.pdf. Bij een gewone bestandsnaam lijkt dat correct. Het probleem wordt zichtbaar zodra de opgegeven waarde een verwijzing naar de bovenliggende map bevat:
/download?bestand=../konfiguracja.env
Het samengestelde pad /srv/applicatie/documenten/../konfiguracja.env verwijst naar /srv/applicatie/konfiguracja.env, een bestand buiten de documentenmap. Als de applicatie dat bestand kan lezen en de inhoud terugstuurt, worden gegevens blootgelegd.
Dit illustreert het mechanisme, maar garandeert niet dat een aanval slaagt. Het bestand moet bestaan, het applicatieproces moet er toegang toe hebben en de manier waarop het verzoek wordt afgehandeld moet het gebruik van het opgegeven pad mogelijk maken. Test dit uitsluitend in je eigen omgeving of met uitdrukkelijke toestemming.
Welke schade kan Path Traversal veroorzaken?
De gevolgen hangen vooral af van de bewerking die de kwetsbare functie uitvoert en van de rechten die de applicatie binnen het besturingssysteem heeft.
- Bestanden lezen: een downloadfunctie kan configuratiegegevens, gebruikersgegevens, back-ups of toegangsgegevens blootleggen.
- Schrijven en overschrijven: een kwetsbare schrijffunctie kan een bestand buiten de doelmap plaatsen of een bestaand bestand wijzigen.
- Verwijderen: een functie om bestanden te wissen kan bestanden verwijderen die de gebruiker niet zou mogen kunnen aanwijzen.
Onder bepaalde omstandigheden kan het overschrijven van configuratiebestanden of het plaatsen van een bestand dat de server uitvoert, leiden tot verdere overname van de applicatie. Path Traversal betekent echter niet automatisch dat code kan worden uitgevoerd of dat volledige toegang tot de server mogelijk is. Onder meer de rechten van het proces en de beschikbare applicatiefuncties beperken de mogelijkheden.
Het lek beperkt zich niet tot adressen die in de browser zichtbaar zijn. Gegevens die het pad beïnvloeden, kunnen ook afkomstig zijn uit een formulier, een API-verzoek, de naam van een geüpload bestand of een item in een archief dat wordt uitgepakt.
Hoe beperk je het risico doeltreffend?
De veiligste oplossing is voorkomen dat de gebruiker een pad kan opgeven. In plaats van een bestandsnaam of bestandslocatie te accepteren, kan de applicatie een document-ID ontvangen, bijvoorbeeld 482, en zelf het bijbehorende bestand opzoeken. Daarbij moet ze controleren of de gebruiker dat bestand mag downloaden: een ID biedt op zichzelf geen bescherming.
Als het noodzakelijk is om paden te accepteren, moet de beveiliging uit meerdere onderdelen bestaan:
- Strikt afgebakende invoer. Als een functie alleen een bestandsnaam nodig heeft, mag ze geen volledig pad accepteren. Beperk de toegestane namen en extensies tot wat daadwerkelijk nodig is.
- Controle van de uiteindelijke locatie. Nadat de regels van het bestandssysteem zijn toegepast, moet de applicatie controleren of het doel nog steeds binnen de toegestane map ligt. Gebruik hiervoor geschikte functies voor padverwerking, niet simpelweg een tekstvergelijking van het begin van de paden.
- Rekening houden met symbolische koppelingen. Een symbolische koppeling verwijst naar een andere locatie in het bestandssysteem. Een bestand dat binnen de toegestane map lijkt te staan, kan via zo’n verwijzing toch buiten die map uitkomen.
- Minimale rechten. Het proces dat documenten beschikbaar stelt, mag geen toegang hebben tot gegevens die het niet nodig heeft, en geen schrijfrechten op locaties waar leesrechten volstaan.
Alleen de tekenreeks ../ verwijderen biedt onvoldoende bescherming. Verschillen in scheidingstekens, codering en de volgorde van gegevensverwerking kunnen ertoe leiden dat het filter en het bestandssysteem dezelfde waarde anders interpreteren. De controle moet aansluiten bij de manier waarop de applicatie het bestand daadwerkelijk opent.
Waar begin je met het controleren van de applicatie?
Loop de functies voor het downloaden, uploaden, verwijderen en uitpakken van bestanden na. Stel voor elke functie vast of de gebruiker het pad kan beïnvloeden, welke map is toegestaan en of het programma het uiteindelijke doel van de bewerking controleert. Test zowel pogingen om buiten de map te komen als gewone, geldige verzoeken.
Als je vermoedt dat het lek is misbruikt, is alleen de code aanpassen mogelijk niet voldoende. Ga na welke bestanden toegankelijk waren, controleer de logs en vervang de betreffende wachtwoorden of sleutels als toegangsgegevens mogelijk zijn uitgelekt. De eerste praktische stap is vaststellen waar gebruikersinvoer precies wordt omgezet in een bestandspad.
Zie ook: Wat is Apache?
