Sicherheitslücken gezielt im Testprozess identifizieren

Sicherheitslücken gezielt bereits im Testprozess identifizieren

Immer wieder wird in den Medien von Sicherheitslücken in Softwareanwendungen berichtet, die es Angreifern ermöglichen, sensible Informationen abzufangen, zu manipulieren oder ganze Systeme außer Betrieb zu setzen.

Für die Betroffenen entsteht dabei oft nicht nur ein finanzieller Schaden, sondern Angreifer sind in der Lage auf sensible (Kunden-)Daten zuzugreifen, was zu einem großen Reputationsschaden führt.

Längst sind Angriffe auf Schutzziele wie Vertraulichkeit, Integrität oder Verfügbarkeit keine Seltenheit mehr.

Klassische Funktionstest einer Webanwendung finden wahrscheinlich nicht alle Schwachstellen. Ein professioneller Softwaretestprozess mit Security-Fokus hat jedoch eine realistische Chance, Schwachstellen bereits vor dem Produktivgang sichtbar zu machen.

Auch Cloud Anwendungen sind betroffen. Im Rahmen des Sicherheitstestprozesses können mögliche Sicherheitsrisiken bereits bei der Testplanung identifiziert werden, um Probleme frühzeitig zu erkennen und zu beheben.

...weiter lesen

Nach aktuellem Kenntnisstand (26.10.2026) wurden die Schwachstellen PHP2Shell (CVE‑2026‑109618 und CVE‑2026‑109619) als Fehler in der PHP-Laufzeitumgebung selbst beschrieben.
Die veröffentlichten Informationen deuten darauf hin, dass es sich um Speicher- und Zustandsfehler innerhalb des PHP-Kerns handelt, die eine Remote-Code-Ausführung ermöglichen können. Die Ausnutzung erfolgt dabei teilweise bereits vor dem eigentlichen Anwendungscode.

Stellen wir uns vor, ein Softwarehersteller entwickelt ein Kundenportal für eine Versicherung.
1 <?php
2 echo "Willkommen im Kundenportal";
3 ?<

Der Quellcode wurde geprüft:

• Funktionstests erfolgreich
• Benutzerverwaltung funktioniert
• Fachliche Anforderungen erfüllt
• Performancetests bestanden

Das Produkt wird anschließend mit PHP 8.x ausgeliefert.

Einige Monate später stellt sich heraus, dass ein Angreifer durch einen speziell manipulierten HTTP-Request die PHP-Laufzeitumgebung selbst kompromittieren kann und dadurch Befehle auf dem Server ausführen kann. Genau ein solches Szenario wird bei PHP2Shell beschrieben.

Die Frage lautet nun: Wie hätte ein strukturierter Testprozess dies möglicherweise schon vor der Freigabe erkennen können?

Was häufig falsch gemacht wird
Oft werden lediglich Funktionstests eingeplant:

»Kann sich der Benutzer anmelden?«
»Kann ein Vertrag gespeichert werden?«

Sicherheitstests werden nicht berücksichtigt.

Was hätte gemacht werden müssen
Bereits in der Testplanung hätte die Risikoanalyse ergeben:
    • Internetanwendung
    • Verarbeitung sensibler Kundendaten
    • Nutzung einer externen Laufzeitumgebung (PHP)
    • hohes Schadenpotenzial bei Serverübernahme

Daraus hätten folgende Testziele abgeleitet werden können:
Geplante Sicherheitstests
    • Penetrationstest
    • Fuzzing-Test
    • Robustheitstest
    • Dependency-Analyse
    • Schwachstellenanalyse der verwendeten Frameworks und Laufzeitumgebungen

Ein Testmanager hätte beispielsweise festlegen können:
»Für alle extern erreichbaren Schnittstellen werden Missbrauchs- und Fuzzing-Tests durchgeführt.«
Genau solche Tests zielen auf Fehler in der Verarbeitung unerwarteter Eingaben ab, wie sie bei Speicherkorruptionen häufig auftreten.

Jetzt werden konkrete Testfälle entwickelt.

Typischer funktionaler Testfall
1 Eingabe:
2 Name = Max Mustermann
3
4 Erwartung:
5 Datensatz wird gespeichert

Mit diesem funktionalen Testfall wird jedoch keine Sicherheitslücke entdeckt.

Sicherheitstechnischer Testfall
1 Eingabe:
2 Sehr große HTTP-Header
3
4 Erwartung:
5 Server antwortet ordnungsgemäß
6 Keine Fehlermeldung
7 Kein Absturz

Weiterer Testfall:
1 Eingabe:
2 Ungültige Requests
3 Zufallsdaten
4 Manipulierte Cookie-Werte
5
6 Erwartung:
7 Saubere Fehlermeldung
8 Keine Speicherfehler
9 ``

Noch besser wäre ein Fuzzing-Test:
1 100.000 automatisch erzeugte Requests
2 mit zufälligen Headern,
3 Parametern und Größen

Speicherfehler zeigen sich oft durch:
    • Serverabstürze
    • Speicherzugriffsfehler
    • Segmentation Faults
    • unerwartete Prozessabbrüche

Solche Symptome sind häufig die ersten Hinweise auf kritische Schwachstellen.

Hier werden die Tests tatsächlich ausgeführt.

Beispiel
Das Testteam startet einen Fuzzing-Test gegen den Webserver.
1 Tag 1:
2 50.000 Requests
3 Keine Auffälligkeiten
4
5 Tag 2:
6 75.000 Requests
7 PHP-Prozess stürzt mehrfach ab


Die Logs zeigen:
1 php-fpm crashed
2 worker terminated unexpectedly
3 memory corruption detected


Nun wird ein Defect eröffnet.

Defect-Beispiel
1 ID: SEC-0815
2
3 Beschreibung:
4 PHP-Prozess beendet sich bei
5 speziell aufgebauten Requests.
6
7 Risiko:
8 Mögliche Speicherkorruption
9
10 Priorität:
11 Kritisch


Ein guter Security-Tester würde nun nicht sagen:

"Der Test ist erfolgreich."

Sondern:

"Warum kann ein einzelner HTTP-Request den PHP-Prozess zum Absturz bringen?"

Genau diese Fragestellung führt häufig zur Entdeckung von Zero-Day-Schwachstellen.

Beispiel eines Pentests
Ein Pentester sendet:
1 GET / HTTP/1.1
2 Host: test.local
3 Cookie: [manipulierte Daten]
4 Header: [extrem große Werte]


Der Server zeigt:
1 500 Internal Server Error


Kurze Zeit später:
1 php-fpm restarted


Das allein beweist noch keine Sicherheitslücke.

Aber es beweist:
Eine externe Eingabe kann die Laufzeitumgebung beeinflussen.

Dies wäre bereits ein schwerwiegender Befund gewesen.

Im Testabschluss bewertet der Testmanager die Testergebnisse.

Testabschluss
1 Kritischer Befund:
2
3 Unter Last und bei manipulierten
  Requests wurden mehrere Abstürze des
  PHP-Prozesses festgestellt.
4
5 Ursache ungeklärt.
6
7 Produktivsetzung wird nicht empfohlen.


Das Projekt würde nun zurück in die Fehleranalyse gehen.

Die Entwickler könnten beispielsweise:
    • PHP-Hersteller informieren
    • Proof-of-Concept erstellen
    • Bug reproduzieren
    • Patch entwickeln


Im Idealfall würde die Sicherheitslücke erkannt und behoben, bevor die Software produktiv eingesetzt wird.

...weiteres Beispiel

Ein Beispiel für eine solche Sicherheitslücke ist Cloudbleed. Dabei handelt es sich, ähnlich wie bei Heartbleed1, um einen Sicherheitsfehler, der zu einem Buffer Overflow (Pufferüberlauf) führt, welcher es einem Angreifer ermöglicht, über das Ende eines Puffers hinaus Informationen aus dem Speicher des betroffenen Servers auszulesen.

Cloudbleed wurde im Februar 2017 entdeckt und betraf Reverse-Proxys des amerikanischen Unternehmens für Webinfrastruktur Cloudflare.2

Es konnten u.a. private Informationen wie HTTP-Cookies, Authentifizierungstokens und andere sensible Daten ausgelesen werden.

Zum Teil handelte es sich dabei um Daten, die im Cache von Suchmaschinen gespeichert waren. Cloudbleed
Die Fragen, die sich in diesem Zusammenhang stellen, sind:

    • Hätte dies verhindert werden können?
    • Hätte der Buffer Overflow Fehler schon frühzeitig, zum Beispiel im Rahmen des Testprozesses, erkannt werden können?
    • Wie ist die Software implementiert? Design und Umsetzung bezüglich Ausnutzung der verfügbaren Ressourcen


1 https://de.wikipedia.org/wiki/Heartbleed
2 https://en.wikipedia.org/wiki/Cloudflare

Um Schwachstellen gezielt zu identifizieren, Risiken zu ermitteln und die Wirksamkeit von bereits bestehenden Schutzmaßnahmen nachzuweisen, können Sicherheitstests eingesetzt werden. Die in diesem Zusammenhang eingesetzten Testverfahren sollten dabei über den gesamten Testprozess hinweg berücksichtigt werden. So können nicht nur potenzielle Sicherheitslücken frühzeitig erkannt und geschlossen werden, sondern Sicherheitsaspekte gezielt bei der Planung, dem Entwurf und der Durchführung von Testaktivitäten berücksichtigt werden.

Der fundamentale Testprozess (nach ISTQB®) gibt einen Überblick darüber, welche Phasen im Rahmen des Testprozesses durchlaufen werden:
    • Testplanung
    • Testüberwachung und -steuerung
    • Testanalyse
    • Testentwurf
    • Testrealisierung
    • Testdurchführung
    • Testabschluss
Fundamentale Testprozess nach ISTQB®

Wie kann „Sicherheit“ nun in diesen Phasen des Testprozesses gezielt berücksichtigt werden?
Welche Aktivitäten sind notwendig, um „Sicherheit“ in den Testprozess zu integrieren?

Im Rahmen der Testplanung muss der Umfang für die durchzuführenden Sicherheitstests festgelegt werden, sowie klare zu erreichende Sicherheitsziele definiert werden.
Grundlage dafür ist eine Analyse der bestehenden Sicherheitsrisiken für die zu entwickelnde Software.
Dabei kann es sich z.B. um potenziell vorhandene Schwachstellen handeln. Auf diese Weise können Komponenten der Software, die ein hohes Sicherheitsrisiko aufweisen, intensiver getestet werden, um diesem Risiko gezielt zu begegnen.
Auch wird in der Testplanung festgelegt, welche Ressourcen speziell für den Sicherheitstest zur Verfügung stehen und es werden Schätzungen und Zeitpläne für die Testdurchführung erstellt.

Im Rahmen der Testüberwachung und -steuerung kann auf die in der Testplanung festgelegten Kenngrößen zurückgegriffen werden, um zu überprüfen, ob die gesteckten Sicherheitsziele erreicht wurden und ggf. Korrekturmaßnahmen erforderlich sind.

In der Phase der Testanalyse wird klassischerweise die Testbasis analysiert, um konkrete Testbedingungen zu identifizieren. Aus diesen werden dann im Rahmen des Testentwurfs Testfälle abgeleitet.

Ergänzend sollten als Basis für die Ableitung von Sicherheitstests Sicherheitsrisikobewertungen, Sicherheitsanforderungen und Sicherheitsrichtlinien in der Testanalyse herangezogen werden.

Auf Basis von Testzielen, Sicherheitsrisiken, Sicherheitsstandards oder bereits bekannten Schwachstellen können so wichtige Erkenntnisse über konkrete Sicherheitsgefährdungen gewonnen werden. Hinsichtlich dieser identifizierten Sicherheitsbedingungen können dann konkrete Sicherheitstestfälle abgeleitet werden.

Im Rahmen der Testrealisierung und -durchführung werden die konzeptuell erstellten Testfälle in manuellen oder automatisierten Tests umgesetzt.
Dabei ist es gerade bei Sicherheitstests sinnvoll, eine Vielzahl von Perspektiven zu berücksichtigen:

    • Welche Gefährdungen ergeben sich durch interne Benutzer?
    • Wie können externe oder böswillige Benutzer meinem System Schaden zufügen oder sensible Informationen abgreifen?
Es müssen Sicherheitstestfälle, Testszenarien, Testskripte oder andere Testspezifikationen erstellt werden, die genau diesen Herausforderungen begegnen.
Dabei können funktionale Sicherheitstests auf Basis definierter Sicherheitsspezifikationen oder funktionale Sicherheits- und Penetrationstests dank der Kenntnisse und Intuition des Testers durchgeführt werden.

Die Testfälle, Testskripte und Dokumentation über die operative Durchführung der Tests sollte nachhaltig und zentral erfolgen, z.B. in einem Testmanagementwerkzeug.

Nachdem die Sicherheitstests erfolgreich durchgeführt wurden, müssen die Testendekriterien bewertet und ein Abschlussbericht erstellt werden.
Dazu müssen die Ergebnisse des Sicherheitstests evaluiert werden, um konkrete Schwachstellen angesichts der Testergebnisse zu identifizieren. Auch sollte die Sicherheitsrisikostufe auf Basis der durchgeführten Tests evaluiert werden und Zwischen- bzw. Abschlussergebnisse an relevante Stakeholder (z.B. die Geschäftsführung) übermittelt werden.

Um die Testaktivitäten abzuschließen, sollten weiterhin sämtliche Testmittel und Testergebnisse archiviert werden, damit sie verfügbar sind, wenn sie für spätere Sicherheitstests benötigt werden.

Können Sicherheitslücken, wie im Beispiel von Cloudbleed, also gezielt vermieden bzw. behoben werden?

– Wir wissen, dass das möglich ist!

Im Rahmen des Sicherheitstestprozesses werden mögliche Sicherheitsrisiken bereits bei der Testplanung identifiziert.
Dies kann z.B. auf Basis historischer Daten (d.h. bereits aufgetretener Sicherheitslücken) geschehen.

In diesem Blogbeispiel hätte ein möglicher Pufferüberlauf, basierend auf der bereits existierenden Schwachstelle Heartbleed, als mögliches Sicherheitsrisiko erkannt werden können.

Im Rahmen der Testanalyse und des -entwurfs hätten dann gezielte Sicherheitstests und Maßnahmen entworfen werden können, um dem Risiko des Pufferüberlaufs begegnen zu können.
So hätten zum Beispiel Codereviews mit einem Fokus auf sicherer Speicherverwaltung eingesetzt werden können, um Probleme frühzeitig zu erkennen und zu beheben.

Meine Empfehlung: Berücksichtigen Sie daher von Anfang an sicherheitsrelevante Aspekte in der Gestaltung Ihres Testprozesses, um Sicherheitslücken von Anfang an zu vermeiden oder diese zumindest gezielt frühzeitig zu erkennen.

Video

Qualitätsmanagement

Fazit

Im fundamentale Testprozess hätte man PHP2Shell höchstwahrscheinlich nicht durch normale Funktionstests, sondern durch risikoorientierte Sicherheitsmaßnahmen entdecken können:

    1. Testplanung und -steuerung
      • Sicherheitsrisiko identifizieren
      • Security-Tests verpflichtend einplanen
    2. Testanalyse und -entwurf
      • Missbrauchs-, Robustheits- und Fuzzing-Testfälle entwickeln
    3. Testrealisierung und -durchführung
      • Manipulierte Requests erzeugen
      • Speicherfehler, Abstürze und Anomalien überwachen
    4. Testabschluss
      • Abstürze als kritische Sicherheitsindikatoren bewerten
      • Produktfreigabe bis zur Ursachenklärung verweigern

Die entscheidende Erkenntnis lautet: PHP2Shell wäre vermutlich nicht durch die normale Überprüfung der Geschäftslogik entdeckt worden, sondern durch systematische Security-, Fuzzing- und Robustheitstests der PHP-Laufzeitumgebung selbst.

Genau solche Verfahren werden eingesetzt, um bislang unbekannte Schwachstellen bereits im Entwicklungs- und Testprozess aufzudecken.



Blog & Posts

Lade...