Eine lokale Notizen-Anwendung kann ihre Unit-Tests bestehen, obwohl sie zwei Sicherheitslücken enthält. Die Route GET /notes/:id liefert die Notiz 42 aus, sobald ein authentifizierter Benutzer sie anfordert – selbst wenn die Notiz 42 zu einem anderen Konto gehört. Unabhängig davon akzeptiert die Anwendung einen Suchbegriff, der ohne sichere Verarbeitung in eine Datenbankabfrage gelangt. Ein drittes Problem liegt außerhalb des eigenen Codes im Repository: Eine verwendete Paketversion ist von einer veröffentlichten Sicherheitswarnung betroffen. Für die erste Schwachstelle benötigt ein Angreifer lediglich ein gültiges Konto mit eingeschränkten Rechten, für die zweite einen erreichbaren HTTP-Endpunkt, und für das Risiko durch Abhängigkeiten ist kein Zugriff auf den Quellcode erforderlich.
Diese Schwachstellen offenbaren die Angriffsfläche der Anwendung – also jeden Codepfad, jede Laufzeitschnittstelle und jede Grenze zu Abhängigkeiten, über die nicht vertrauenswürdige Eingaben oder vom Angreifer gesteuertes Verhalten das System beeinflussen können. Für Verteidiger stellt sich nicht die Frage, welcher Scanner generell der beste ist. Es gilt zu entscheiden, welche Erkenntnisse statische und dynamische Sicherheitstests (SAST/DAST) sowie die Software-Kompositionsanalyse (SCA) für dieselbe Notizen-Anwendung liefern sollen; anhand dieser Ergebnisse wird dann entschieden, ob eine Änderung veröffentlicht werden darf. Quellcode-Repositories, das HTTP-Verhalten zur Laufzeit und Pakete von Drittanbietern decken jeweils unterschiedliche Aspekte des Risikos auf.
Ein anschauliches Beispiel für den Vergleich der Methoden ist die Anfrage an /notes/42. Eine Analyse des Quellcodes kann die Autorisierungsbedingung identifizieren, bei der das Konto des anfragenden Benutzers nicht mit dem Eigentümer der Notiz abgeglichen wird. Eine Laufzeitanalyse kann als Benutzer eine autorisierte Testanfrage senden und beobachten, ob die Antwort die Notiz eines anderen Benutzers preisgibt. Eine Analyse der Abhängigkeiten kann das Paketmanifest untersuchen, ohne die anfällige Funktion überhaupt aufzurufen. Welche Analysemethode eine Schwachstelle nachweisen kann, hängt davon ab, wo genau der Fehler liegt.
Die Vertrauensgrenzen innerhalb der Notizen-Anwendung zeigen auf, wo die jeweilige Art der Analyse ansetzt und wo ihre Grenzen liegen.
Dieses Diagramm veranschaulicht, warum kein einzelner Scanner Browser-Eingaben, Anwendungslogik, Datenbankaufrufe und Schnittstellen zu externen Paketen gleichermaßen überwacht.
Da die drei Beobachter ein gemeinsames Ziel benötigen, verwendet der Kurs ein Repository mit einer lokal gehosteten Notizen-Anwendung, die absichtlich Sicherheitslücken aufweist. Die Anwendung akzeptiert HTTP-Parameter und JSON-Bodies an der Web-API-Schnittstelle, nutzt eine über die lokale Login-Route etablierte Identität, liefert HTML- oder JSON-Antworten zurück und wickelt Datenbankoperationen über ihre Datenzugriffsschicht ab. Wir scannen ausschließlich diese lokale Labor-Anwendung sowie Umgebungen, die unserer Kontrolle unterliegen. Das Testen von Diensten Dritter ohne schriftliche Genehmigung ist nicht Bestandteil des Kurses und kann gegen Gesetze wie den Computer Fraud and Abuse Act in den USA oder den Computer Misuse Act 1990 im Vereinigten Königreich verstoßen.
Das Repository enthält zwei absichtlich implementierte Schwachstellen. Bei der einen handelt es sich um einen anfälligen Suchpfad (Injection-Risiko), der für CWE-89 steht („Improper Neutralization of Special Elements used in an SQL Command“). Die andere Schwachstelle ist eine fehlerhafte Autorisierung auf Objektebene bei der Route GET /notes/:id; diese Fehlerkategorie wird in den OWASP API Security Top 10 2023 als „API1: Broken Object Level Authorization“ bezeichnet. Zudem führt das Abhängigkeitsmanifest (Dependency Manifest) ein bewusst veraltetes Paket mit einer bekannten Sicherheitslücke auf. Diese Fälle werden getrennt betrachtet, da ein Code-Fund, eine HTTP-Beobachtung und ein Sicherheitshinweis zu einem Paket keine austauschbaren Nachweise darstellen.
Der Snapshot des Repositorys identifiziert die Routen, den Datenzugriff und die Abhängigkeitsdeklarationen, ohne dass dabei ein Scan oder eine Anfrage ausgeführt wird.