Debugmodus ingeschakeld in productie
CWE-489CWE-215OWASP A05:2021Bijgewerkt 3 september 20264 min leestijd
Een applicatie die in productie in debugmodus draait, toont bij elke fout de interne opbouw: bestandspaden, configuratie, omgevingsvariabelen en soms de uitgevoerde queries. Sommige ontwikkelhulpmiddelen bieden zelfs een console waarmee code kan worden uitgevoerd. Dat is geen informatielek meer maar een directe route naar de server.
Debugmodus is gebouwd om zoveel mogelijk prijs te geven: dat is precies het doel ervan tijdens ontwikkeling. Blijft die stand aan in productie, dan doet hij dat werk onverminderd goed, alleen voor een ander publiek. In dit artikel leest u wat er dan zichtbaar wordt en waarom sommige ontwikkelhulpmiddelen niet alleen informatie lekken maar directe toegang geven.
Wat is debugmodus?
Debugmodus is de stand waarin een framework of applicatie zoveel mogelijk informatie toont over wat er intern gebeurt. Bij een fout verschijnt geen nette melding maar een volledige uitleg: de stacktrace met bestandspaden en regelnummers, de waarden van variabelen, de uitgevoerde databasequeries, de geladen configuratie en soms de complete omgevingsvariabelen.
Daarnaast zijn er ontwikkelhulpmiddelen die permanent meelopen, profilers, debugbalken, foutopsporingsconsoles. Die tonen niet alleen wat er misging maar wat er allemaal gebeurde, ook bij een geslaagd verzoek. Ze zijn ontworpen voor een omgeving waar alleen de ontwikkelaar toegang heeft.
Het contrast met de bedoelde situatie is groot. In productie zou een fout een neutrale melding met een referentienummer moeten opleveren. In debugmodus levert diezelfde fout een gedetailleerde beschrijving van uw systeem op, aan wie er ook maar om vraagt.
Wat wordt er zichtbaar?
Kwetsbaar:
// In het configuratiebestand van de productieomgeving
APP_ENV=production
APP_DEBUG=true
Eén verkeerd gezette waarde. Een verzoek dat een fout uitlokt levert nu een pagina op met onder meer:
UnexpectedValueException in /var/www/portaal/src/Factuur/Repository.php:88
Omgevingsvariabelen:
DB_HOST=10.0.4.12
DB_USERNAME=portaal_prod
DB_PASSWORD=Xk29!vRp2mQz
MAIL_PASSWORD=cf83e1357eefb8bd
APP_KEY=base64:9c2f81ad4e7b3f5c...
Dit is geen informatielek meer in de gebruikelijke zin. Het databasewachtwoord staat op het scherm; als de database vanaf buiten bereikbaar is, is dat directe toegang tot alle gegevens. De applicatiesleutel is nog ernstiger: daarmee kunnen sessiecookies worden vervalst en, bij frameworks die objecten in cookies bewaren, kan dat leiden tot code-uitvoering op de server.
Bij een profiler komt daar nog iets bij. Sommige hulpmiddelen bieden een ingebouwde console of een route waarmee willekeurige expressies kunnen worden uitgevoerd. Is die bereikbaar zonder authenticatie, dan is de stap van informatielek naar volledige overname al gezet.
Veilig:
APP_ENV=production
APP_DEBUG=false
// De applicatie weigert te starten in een onveilige combinatie
if (env('APP_ENV') === 'production' && env('APP_DEBUG') === true) {
throw new RuntimeException('Debugmodus is niet toegestaan in productie.');
}
De tweede maatregel is de belangrijkste. Een instelling die alleen goed staat omdat iemand eraan heeft gedacht, staat vroeg of laat verkeerd. Een applicatie die weigert te starten in een onveilige combinatie, maakt de fout onmogelijk in plaats van onwaarschijnlijk. Verwijder daarnaast ontwikkelpakketten volledig uit de productiebuild, zodat een profiler er niet alleen uit staat maar er niet is.
Wat is de impact van debugmodus in productie?
De ernst is hoog tot kritiek, en dat onderscheidt deze bevinding van gewone informatielekken. De reden is dat de blootgestelde informatie meestal geheimen bevat en niet alleen structuurgegevens.
De ernstigste route loopt via de applicatiesleutel. Bij veel frameworks worden sessies en cookies daarmee ondertekend of versleuteld. Wie de sleutel heeft, kan een geldige sessie voor elke gebruiker vervaardigen, inclusief beheerders, zonder ooit een wachtwoord te hoeven kennen. Bij frameworks die geserialiseerde objecten in cookies bewaren, kan dat verder gaan tot het uitvoeren van code op de server.
Daarnaast liggen databasegegevens, sleutels voor betaal- en e-maildiensten en interne netwerkadressen open. Die laatste zijn waardevol voor de volgende stap: ze vertellen een aanvaller welke systemen er achter de applicatie draaien en waar hij zijn aandacht op moet richten.
De bevinding is extra vervelend omdat het vinden ervan geen enkele vaardigheid vereist. Er wordt op grote schaal geautomatiseerd gezocht naar applicaties met een actieve debugmodus, precies omdat de opbrengst zo hoog is.
Hoe spoor je debugmodus in productie op?
Een tester lokt bewust fouten uit (een ongeldige parameterwaarde, een niet-bestaande route, een verkeerd gevormd verzoek) en beoordeelt of het antwoord meer toont dan een neutrale melding. Een stacktrace met bestandspaden is het duidelijkste signaal.
Daarnaast wordt gezocht naar de bekende paden van ontwikkelhulpmiddelen: profilerroutes, debugbalken, statuspagina’s en routes die de configuratie of de geladen modules tonen. Die staan vaak op een voorspelbaar adres en zijn met een gerichte controle snel te vinden. Ook wordt gekeken naar subtielere aanwijzingen: een responsheader die de debugstand verraadt, een HTML-commentaar met de uitvoeringstijd, of een foutpagina die alleen in ontwikkelmodus verschijnt. Verder krijgen acceptatie- en testomgevingen aandacht, omdat die vaak bereikbaar zijn vanaf internet en vrijwel altijd in debugmodus draaien met gegevens die op productie lijken. AssistSec neemt die omgevingen standaard mee in de verkenning, omdat ze vaker een ingang blijken dan de productieomgeving zelf.
Hoe voorkom je debugmodus in productie?
- Zet debugmodus expliciet uit in elke omgeving die vanaf internet bereikbaar is.
- Laat de applicatie weigeren te starten wanneer debugmodus en productie tegelijk zijn ingesteld.
- Verwijder profilers en andere ontwikkelpakketten volledig uit de productiebuild.
- Bewaar geheimen buiten de configuratie die bij een fout kan worden getoond, bijvoorbeeld in een sleutelkluis.
- Roteer alle geheimen wanneer debugmodus onbedoeld aan heeft gestaan.
- Scherm test- en acceptatieomgevingen af met netwerkbeperkingen of authenticatie.
- Gebruik gestructureerde logging met referentienummers in plaats van informatie in het antwoord.
- Controleer de instelling automatisch bij elke uitrol, zodat een handmatige wijziging niet blijft staan.
- Blokkeer bekende debug- en profilerpaden in uw webserver als vangnet.
Bronnen
Veelgestelde vragen
Hoe komt debugmodus in productie terecht?
Meestal doordat een omgevingsvariabele niet is gezet en de standaardwaarde 'aan' is, of doordat een instelling bij het oplossen van een storing tijdelijk is aangezet en daarna is blijven staan. Beide zijn menselijk; de oplossing is dat de productieomgeving de instelling zelf afdwingt in plaats van erop te vertrouwen.
Is een profiler net zo erg?
Vaak erger. Een profiler toont niet alleen de fout maar de volledige uitvoering: alle queries, de sessie-inhoud, de configuratie en soms verzoeken van andere gebruikers. Bij sommige hulpmiddelen zit er bovendien een console bij waarmee code kan worden uitgevoerd.
Kan ik debugmodus beperken tot mijn eigen IP-adres?
Dat is beter dan niets, maar het blijft een risico dat u niet hoeft te nemen. IP-beperkingen zijn te omzeilen wanneer de applicatie het adres uit een header afleidt, en de instelling blijft aan staan tot iemand eraan denkt. Gebruik liever een aparte omgeving met dezelfde opbouw.
Wat als ik informatie nodig heb over een storing in productie?
Gebruik gestructureerde logging en een foutrapportagesysteem met een referentienummer per incident. U krijgt dan dezelfde informatie, maar in uw eigen omgeving in plaats van in het antwoord aan de bezoeker.
Verwante artikelen
- KwetsbaarhedenCWE-1188A05:2021Standaardbestanden van de webserver bereikbaarVoorbeeldpagina's, beheerconsoles en installatiebestanden die na installatie blijven staan, verraden uw platform en zijn soms misbruikbaar.
- 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-16A05:2021Security misconfigurationSecurity misconfiguration uitgelegd: hoe standaardwachtwoorden, debug-modi en open cloud-buckets aanvallers binnenlaten, en hoe u dit voorkomt.
- KwetsbaarhedenCWE-527A05:2021Broncode publiek benaderbaarEen meegepubliceerde.git-map of back-upbestand geeft uw volledige broncode prijs, inclusief wachtwoorden uit oude commits. Lees hoe u dat voorkomt.
- KwetsbaarhedenCWE-209A05:2021Gedetailleerde foutmeldingenStacktraces en databasefouten verraden uw techniek, paden en queries. Lees wat een aanvaller eruit haalt en hoe u fouten netjes afhandelt.