Zum Inhalt springen
EUID Prüfservice & Prüfsiegel, Startseite
Website prüfen lassen

Prüfpunkt software.debug.oeffentlichOffene Türen und Abwehr

Was verraten Debug-Werkzeuge und Statusseiten über Ihre Website?

Frameworks wie Laravel, Symfony und Django bringen Werkzeuge für die Entwicklung mit: eine Leiste, die jede Datenbankabfrage, die Laufzeit und die Einstellungen der Anwendung zeigt. Dazu kommen Statusadressen wie /health, die ein Überwachungsdienst abfragt. Bleiben diese Werkzeuge im Betrieb eingeschaltet, sieht jeder Besucher dasselbe wie der Entwickler. Die Prüfung fragt am Ende des Laufs sieben solche Adressen ab und meldet eine nur, wenn ihr Inhalt Interna zeigt.

Neue Projekte starten oft im Debug-Modus

Bei Django steht DEBUG = True in den Einstellungen jedes neuen Projekts, und Laravel empfiehlt APP_DEBUG=true für die Arbeit am eigenen Rechner. Wer diese Einstellungen auf den Server mitnimmt, nimmt den Modus mit. Django schreibt deshalb, eine Website dürfe nie mit eingeschaltetem DEBUG in Betrieb gehen, weil Dateipfade und Einstellungen Angreifern zusätzliche Auskunft geben. Laravel warnt, sonst könnten vertrauliche Einstellungen bei Besuchern landen.

Der Debug-Modus machte eine bekannte Lücke erst ausnutzbar

Ignition, die Fehleranzeige von Laravel-Websites, hatte vor Fassung 2.5.2 eine Lücke, über die Fremde ohne Anmeldung eigenen Programmcode auf dem Server ausführen konnten (Kennung CVE-2021-3129). Ausnutzbar war sie auf Websites im Debug-Modus mit Laravel vor 8.4.2. Die US-Behörde CISA führt sie seit 2023 in ihrem Katalog tatsächlich ausgenutzter Schwachstellen und vermerkt den Einsatz bei Erpressungsangriffen. Eine vergessene Einstellung machte so die Übernahme des Servers möglich.

Abfragen, Versionen und Servernamen erleichtern einen Angriff

Die Leiste von Laravel Debugbar oder der Profiler von Symfony zeigt die Datenbankabfragen früherer Anfragen, oft mit den Werten darin, dazu die PHP-Version, Einstellungen und Pfade auf dem Server. Eine Statusseite, die Version und Hostnamen nennt, verrät, welche bekannte Lücke einen Versuch wert ist und welcher Server dahinter steht. Die Hersteller warnen selbst: Symfony schreibt, der Profiler im Betrieb führe zu schweren Sicherheitslücken, und laut Anleitung von Laravel Debugbar gibt die Leiste Daten gespeicherter Anfragen preis und gehört nur in die Entwicklung.

Gemessen werden sieben Adressen mit ihrem Inhalt

Die Abrufe gehören zur Tiefenprüfung: sie laufen als letzter Schritt eines Laufs, wenn Indexierung oder Aktualität beauftragt und die Tiefenprüfung für Ihre Website eingeschaltet ist. Abgefragt werden /_debugbar (Laravel Debugbar), /__debug__/ (Django Debug Toolbar), /_profiler/ (Symfony Profiler), /telescope (Laravel Telescope), /actuator/health (Spring Boot), /health und /status. Eine Adresse zählt nur mit Status 200 und einem Merkmal des Werkzeugs im Inhalt, bei Status- und Health-Adressen nur mit Angaben wie "version", "hostname" oder "db". Die Grundeinstellung von Spring Boot, die nur {"status":"UP"} meldet, zählt nicht, ebenso wenig eine Fehlerseite, die die abgefragte Adresse wiederholt. Der Bericht zeigt je Fund Adresse, Status und den Treffer des Musters, nie die Werte dahinter.

Im Betrieb abschalten, Statusseiten kürzen

Ihre Agentur schaltet den Debug-Modus im Betrieb ab: bei Laravel mit APP_DEBUG=false und APP_ENV=production, bei Symfony mit APP_ENV=prod, bei Django mit DEBUG = False. Am sichersten kommen die Pakete für die Entwicklung gar nicht erst auf den Server, bei PHP etwa mit composer install --no-dev. Eine Statusadresse für die Überwachung antwortet mit einem knappen ok; Version, Datenbank und Speicherplatz zeigt sie nur angemeldeten Diensten oder im internen Netz. Bei Spring Boot heißt die Einstellung management.endpoint.health.show-details=when-authorized.

Beispiele

Laravel: Einstellungen für den Betrieb (.env)

Nicht erfüllt
APP_ENV=local
APP_DEBUG=true
Erfüllt
APP_ENV=production
APP_DEBUG=false

Laravel Debugbar schaltet sich nur bei APP_DEBUG=true außerhalb von production ein. Danach baut Ihre Agentur den Zwischenspeicher der Einstellungen neu (php artisan config:cache).

Spring Boot: Details der Statusadresse nur für Berechtigte

Nicht erfüllt
management.endpoint.health.show-details=always
Erfüllt
management.endpoint.health.show-details=when-authorized
management.endpoint.health.roles=ADMIN

Mit always zeigt /actuator/health Datenbank, Speicherplatz und weitere Bestandteile jedem Besucher. Die Grundeinstellung never meldet nur den Zustand, etwa UP.

So gehen Sie es an

  1. Lassen Sie Ihre Agentur die Adressen aus dem Bericht im Browser öffnen: welches Werkzeug antwortet dort?
  2. Sie schaltet den Debug-Modus im Betrieb ab und bringt Pakete für die Entwicklung nicht mehr auf den Server.
  3. Statusadressen für die Überwachung antworten danach mit einem knappen ok oder verlangen eine Anmeldung.
  4. Stand eine Debug-Leiste offen, wechselt sie die Zugangsdaten, die in Abfragen oder Einstellungen zu sehen waren.
  5. Lassen Sie die Website neu messen. Der Bericht zeigt, ob noch eine der Adressen Interna nennt.

Tipps aus der Praxis

  • Bei Django muss beim Abschalten auch ALLOWED_HOSTS gesetzt sein, sonst beantwortet die Website jede Anfrage mit Bad Request (400). Lassen Sie das vorher auf einer Testumgebung ausprobieren.
  • Django merkt sich im Debug-Modus jede Datenbankabfrage, was den Speicher des Servers schnell füllt. Wird eine Website mit der Zeit immer langsamer, lohnt auch dieser Blick.
  • Bei Spring Boot ist über das Web von Haus aus nur /health erreichbar. Steht management.endpoints.web.exposure.include auf mehr, fragen Sie nach dem Grund und nach dem Schutz davor.

Weiter in der Cybersicherheit

Dieser Prüfpunkt gehört zur Cybersicherheit, Unterthema Offene Türen und Abwehr. Gemessen wird er im Prüfbereich Aktualität. Was die Prüfung insgesamt leistet, zeigt die Leistungsseite; wie ein Ergebnis zustande kommt, erklärt das Prüfverfahren.

  • Siegel Digitale Barrierefreiheit
  • Siegel Daten & Recht
  • Siegel Technische Qualität
  • Siegel Digital Excellence
  • Siegel Cyberversicherung

Geprüft. Für eine bessere digitale Zukunft.euid.com