KI-Sicherheitsanalyse-security-audit-skill: Difference between revisions

From
Jump to navigation Jump to search
Content deleted Content added
MelhemG (talk | contribs)
MelhemG (talk | contribs)
 
(43 intermediate revisions by the same user not shown)
Line 4: Line 4:
Große Sprachmodelle können Code lesen, Zusammenhänge über viele Dateien hinweg verfolgen und Werkzeuge bedienen. Damit liegt es nahe, sie für die Suche nach Sicherheitslücken einzusetzen. Offen ist, wie belastbar ihre Ergebnisse sind, denn ein falscher Befund ist in der Sicherheitsanalyse teuer.
Große Sprachmodelle können Code lesen, Zusammenhänge über viele Dateien hinweg verfolgen und Werkzeuge bedienen. Damit liegt es nahe, sie für die Suche nach Sicherheitslücken einzusetzen. Offen ist, wie belastbar ihre Ergebnisse sind, denn ein falscher Befund ist in der Sicherheitsanalyse teuer.


Der Bericht folgt den vier Fragen der Seminarbeschreibung:
Der Bericht folgt den vier Fragen:
# Wie funktioniert eine KI-Agent-basierte Sicherheitsanalyse?
# Welche Werkzeuge sind verfügbar und geeignet?
# Welche Werkzeuge sind verfügbar und geeignet?
# Wie funktioniert eine KI-Agent-basierte Sicherheitsanalyse?
# Wo liegen Stärken, Schwächen und Kosten?
# Können die gefundenen Schwachstellen verstanden und verifiziert werden?
# Können die gefundenen Schwachstellen verstanden und verifiziert werden?
# Wo liegen Stärken, Schwächen und Kosten?


== Werkzeugfamilien ==
== Werkzeugfamilien ==
Line 22: Line 22:
! Merkmal !! Beschreibung
! Merkmal !! Beschreibung
|-
|-
| Herkunft || Cloudflare, großer Anbieter für den Schutz von Websites; auf GitHub unter MIT-Lizenz veröffentlicht
| Herkunft || Cloudflare, großer Anbieter für den Schutz von Websites, auf GitHub unter MIT-Lizenz veröffentlicht
|-
|-
| Bedeutung || Laut Blogartikel „Build your own vulnerability harness“ Ausgangspunkt für Cloudflares interne Schwachstellensuche, später ausgebaut zu einer Pipeline über mehr als 128 Repositories
| Bedeutung || Laut Blogartikel „Build your own vulnerability harness“ Ausgangspunkt für Cloudflares interne Schwachstellensuche, später ausgebaut zu einer Pipeline über mehr als 128 Repositories
|-
|-
| Form || '''kein Scanner und kein Programm''', sondern ein Ordner <code>skills/security-audit/</code> mit rund 5.300 Zeilen Anweisungen und zwei Prüfskripten
| Form || Der Skill ist '''kein Scanner und kein Programm'''. Er ist ein Ordner <code>skills/security-audit/</code> mit rund 5.300 Zeilen Anweisungen und zwei Prüfskripten
|-
|-
| Modi || '''Anleitungsmodus''' (Standard): beantwortet Sicherheitsfragen ohne Berichtsdateien.<br>'''Vollständiger Audit-Modus''': nur auf ausdrückliche Anfrage („security audit“, „pen-test“, „full security review“); durchläuft alle sechs Phasen. ''Im Projekt nur dieser Modus verwendet.''
| Modi || '''Anleitungsmodus''' (Standard): beantwortet Sicherheitsfragen ohne Berichtsdateien.<br>'''Vollständiger Audit-Modus''': Dieser wird nur auf ausdrückliche Anfrage („Security Audit“, „Pen-Test“, „Full Security Review“) durchgeführt und durchläuft alle sechs Phasen. Im Projekt wird nur dieser Modus verwendet.''
|}
|}


=== Bestandteile ===
=== Bestandteile ===
Der Skill ist '''kein Scanner und kein Programm'''. Er ist ein Ordner <code>skills/security-audit/</code> mit rund 5.300 Zeilen Anweisungen und zwei Prüfskripten:


{| class="wikitable"
{| class="wikitable"
Line 39: Line 38:
| <code>SKILL.md</code> || Einstieg: Betriebsarten, Sicherheitsregeln, Profile, Budget, Schweregradskala, verbotene Fehler
| <code>SKILL.md</code> || Einstieg: Betriebsarten, Sicherheitsregeln, Profile, Budget, Schweregradskala, verbotene Fehler
|-
|-
| <code>RECONNAISSANCE.md</code> || Phase 1: Aufklärung des Projekts und Aufbau des Coverage Ledgers
| <code>RECONNAISSANCE.md</code> || Phase 1: Die Aufklärung des Projekts und der Aufbau von "architecture.md" und "Coverage Ledgers"
|-
|-
| <code>HUNTING.md</code>, <code>ATTACK-CLASSES.md</code> || Phase 2: Aufbau der Suchaufträge und Angriffsklassen (Injection, Zugriffskontrolle, Dateien, Kryptografie, Geschäftslogik …)
| <code>HUNTING.md</code>, <code>ATTACK-CLASSES.md</code> || Phase 2: Aufbau der Suchaufträge und Angriffsklassen (Injection, Zugriffskontrolle, Dateien, Kryptografie, Geschäftslogik …)
Line 69: Line 68:
|}
|}


'''Prinzip: Wer findet, bewertet nicht.''' Ein Agent, der seinen eigenen Fund bewertet, neigt zur Selbstbestätigung; die Trennung entspricht dem Vier-Augen-Prinzip im Code-Review. Jeder Subagent arbeitet in <code>agents/&lt;agent-id&gt;/scratch/</code> und liefert strukturiertes JSON an den Koordinator.
'''Prinzip: Wer findet, bewertet nicht.''' Ein Agent, der seinen eigenen Fund bewertet, neigt zur Selbstbestätigung. Jeder Subagent arbeitet in <code>agents/&lt;agent-id&gt;/scratch/</code> und liefert strukturiertes JSON an den Koordinator.


=== Sechs Phasen ===
=== Sechs Phasen ===
Line 83: Line 82:
|| <code>architecture.md</code>, <code>coverage-ledger.json</code>
|| <code>architecture.md</code>, <code>coverage-ledger.json</code>
|-
|-
| '''2 Suche'''<br>''hunting'' || Hunter erhalten Prüfeinheiten samt Angriffsklassen-Anweisungen im Wortlaut und verfolgen eine Eingabe bis zur kritischen Stelle (''sink'', z. B. Datenbankabfrage). Ein Kritiker sucht danach Lücken; diese werden neue Einheiten, falls das Budget eine weitere Welle erlaubt. || Kandidaten als JSON
| '''2 Suche'''<br>''hunting'' || Hunter erhalten Prüfeinheiten samt Angriffsklassen-Anweisungen im Wortlaut und verfolgen eine Eingabe bis zur kritischen Stelle (''sink'', z. B. Datenbankabfrage). Ein Kritiker sucht danach Lücken, diese werden neue Einheiten, falls das Budget eine weitere Welle erlaubt. || Kandidaten als JSON
|-
|-
| '''3 Validierung'''<br>''validation'' || '''Kern des Skills:''' Ein neuer Prüfer liest jede zitierte Zeile erneut, sucht übersehene Schutzmechanismen und versucht zu widerlegen. || eines von drei Urteilen
| '''3 Validierung'''<br>''validation'' || '''Kern des Skills:''' Ein neuer Prüfer liest jede zitierte Zeile erneut, sucht übersehene Schutzmechanismen und versucht zu widerlegen. || eines von drei Urteilen
Line 89: Line 88:
| '''4 Strukturierte Ausgabe''' || Urteile werden geschrieben, Prüfskripte kontrollieren das Format. || <code>findings.json</code>
| '''4 Strukturierte Ausgabe''' || Urteile werden geschrieben, Prüfskripte kontrollieren das Format. || <code>findings.json</code>
|-
|-
| '''5 Zweite Verifikation''' || Weitere neue Agenten prüfen die Aussagen erneut; wesentliche Änderungen prüft ein zusätzlicher Agent. || bestätigte Datensätze
| '''5 Zweite Verifikation''' || Weitere neue Agenten prüfen die Aussagen erneut, wesentliche Änderungen prüft ein zusätzlicher Agent. || bestätigte Datensätze
|-
|-
| '''6 Bericht''' || Bericht nur aus geprüften Datensätzen; er darf kein Urteil ändern. || <code>REPORT.md</code>, <code>FINDINGS-DETAIL.md</code>, <code>NEEDS-VALIDATION.md</code>
| '''6 Bericht''' || Bericht nur aus geprüften Datensätzen; er darf kein Urteil ändern. || <code>REPORT.md</code>, <code>FINDINGS-DETAIL.md</code>, <code>NEEDS-VALIDATION.md</code>
Line 124: Line 123:


=== Coverage Ledger ===
=== Coverage Ledger ===
Das Coverage Ledger zerlegt das Projekt in Prüfeinheiten. Jede Einheit ist eine Kombination aus vier Teilen: Eingabepunkt × Vertrauensgrenze × Teilsystem × Angriffsklasse, und einen Status
Das Coverage Ledger zerlegt das Projekt in Prüfeinheiten. Jede Einheit ist eine Kombination aus vier Teilen: Eingabepunkt × Vertrauensgrenze × Teilsystem × Angriffsklasse. Jede Prüfeinheit hat einen Status


{| class="wikitable"
{| class="wikitable"
Line 178: Line 177:
| Warum dieses Projekt || '''Lösungsschlüssel''' <code>data/static/challenges.yml</code> mit '''116 Challenges''' liefert eine Referenz (''ground truth''), um Treffer und Lücken des Werkzeugs zu messen. Juice Shop ist nicht klein, dieser Vorteil überwiegt aber.
| Warum dieses Projekt || '''Lösungsschlüssel''' <code>data/static/challenges.yml</code> mit '''116 Challenges''' liefert eine Referenz (''ground truth''), um Treffer und Lücken des Werkzeugs zu messen. Juice Shop ist nicht klein, dieser Vorteil überwiegt aber.
|-
|-
| safetyMode || schaltet ca. 19 gefährliche Challenges (Codeausführung, Dateizugriff) ab, sobald die App in Docker oder auf Heroku läuft; entscheidend für Fall Nr. 13
| safetyMode || schaltet ca. 19 gefährliche Challenges (Codeausführung, Dateizugriff) ab, sobald die App in Docker oder auf Heroku läuft.
|-
|-
| Version || 20.2.0, Commit <code>5658473c</code> vom 10.08.2026: „Add missing guard around lfrChallenge for safe mode“, sollte also den sicheren Modus verbessern
| Version || 20.2.0, Commit <code>5658473c</code> vom 10.08.2026: „Add missing guard around lfrChallenge for safe mode“, sollte also den sicheren Modus verbessern
|-
|-.
| Warum fester Stand || Sonst wäre unklar, ob ein Unterschied zwischen Läufen an der KI oder am Code liegt.
| Warum fester Stand || Sonst wäre unklar, ob ein Unterschied zwischen Läufen an der KI oder am Code liegt.
|}
|}
Line 187: Line 186:
== Versuchsdurchführung ==
== Versuchsdurchführung ==


=== Versuchsdesign und Ablauf ===
{| class="wikitable"
{| class="wikitable"
! Merkmal !! Lauf 1 !! Lauf 2
! Merkmal !! Lauf 1 !! Lauf 2
Line 243: Line 241:
Beide Aufträge enthalten die ausdrückliche Bitte um ein vollständiges Audit (damit der Audit-Modus greift), Profil, Budget, die Regel „nur Quellcode“ und den Ausgabeort. In Lauf 2 musste der Ort von Lauf 1 angegeben werden, da der Skill frühere Läufe nur in seinem Standardordner <code>~/security-audit-skill/</code> selbst findet.
Beide Aufträge enthalten die ausdrückliche Bitte um ein vollständiges Audit (damit der Audit-Modus greift), Profil, Budget, die Regel „nur Quellcode“ und den Ausgabeort. In Lauf 2 musste der Ort von Lauf 1 angegeben werden, da der Skill frühere Läufe nur in seinem Standardordner <code>~/security-audit-skill/</code> selbst findet.


== Ereignisse ==
== Ergebnisse ==

=== Überblick ===
=== Überblick ===
[[File:Juice-Shop_Coverage-Ledger_Lauf1_vs_Lauf2.png|800px|thumb|left|Status der Prüfeinheiten: Lauf 2 prüfte deutlich mehr Einheiten, die meisten neuen blieben aber blockiert, weil das Budget die Validierung nicht abdeckte.]]

{| class="wikitable"
{| class="wikitable"
! Kennzahl !! Lauf 1 !! Lauf 2
! Kennzahl !! Lauf 1 !! Lauf 2
Line 261: Line 262:
|}
|}


Lauf 2 brachte vor allem '''mehr Breite, aber keinen zusätzlichen Beweis'''. Die Ergebnisse sind stabil: Alle 12 Fälle aus Lauf 1 kamen mit demselben Urteil zurück. Von den 9 neuen Fällen waren 5 in Lauf 1 schon als ungeprüfte Hinweise notiert, 4 sind neue Ursachen.
=== Eigene Kontrolle der Prüfskripte ===
Die Skripte wurden von Hand erneut ausgeführt, statt der Aussage des Agenten zu vertrauen (hier Lauf 1; Lauf 2 ebenfalls bestanden):
<pre>
node .claude/skills/security-audit/validate-findings.cjs audits/juice-shop/run-1/findings.json
PASS: 12 findings valid
node .claude/skills/security-audit/validate-coverage-ledger.cjs audits/juice-shop/run-1/coverage-ledger.json
PASS: 22 coverage units valid
</pre>


== Ergebnisse ==


=== Überblick ===
[[File:Juice-Shop_Coverage-Ledger_Lauf1_vs_Lauf2.png|800px|thumb|left|Status der Prüfeinheiten: Lauf 2 prüfte deutlich mehr Einheiten, die meisten neuen blieben aber blockiert, weil das Budget die Validierung nicht abdeckte.]]


{| class="wikitable"
! Kennzahl !! Lauf 1 !! Lauf 2
|-
| Validierte Verdachtsfälle || 12 || 21 (12 übernommen, 9 neu)
|-
| Bestätigt / verworfen || 0 / 0 || 0 / 0
|-
| Ungeprüfte Hinweise || 23 || 33
|-
| Prüfeinheiten im Ledger || 22 || 53
|-
| Prüfskripte (selbst nachgeprüft) || bestanden || bestanden
|}


Lauf 2 brachte vor allem '''mehr Breite, aber keinen zusätzlichen Beweis'''. Die Ergebnisse sind stabil: Alle 12 Fälle aus Lauf 1 kamen mit demselben Urteil zurück. Von den 9 neuen Fällen waren 5 in Lauf 1 schon als ungeprüfte Hinweise notiert, 4 sind neue Ursachen.




Line 345: Line 322:


=== Vergleich mit dem Lösungsschlüssel ===
=== Vergleich mit dem Lösungsschlüssel ===
* '''Nach Lauf 1:''' ca. 29 von 116 Challenges gemeldet (ca. 25 %)
{| class="wikitable"
! Zeitpunkt !! Gemeldete Challenges (ungefähr) !! Anteil
* '''Nach beiden Läufen:''' ca. 37 von 116 Challenges gemeldet (ca. 32 %)
|-
| nach Lauf 1 || ca. 29 von 116 || ca. 25 %
|-
| nach beiden Läufen || ca. 37 von 116 || ca. 32 %
|}


'''Warum der Anteil niedrig ist:''' Viele Challenges sind durch Lesen von Code grundsätzlich nicht auffindbar, etwa die Ortsbestimmung eines Fotos, eine in einem Bild versteckte Nachricht, das Erraten eines schwachen Passworts oder versteckte Easter Eggs. Bezogen auf die im Code auffindbaren Challenges wäre der Anteil höher; diese Abgrenzung steht noch aus. Die Zuordnung wurde von Hand vorgenommen und ist daher eine Näherung.
Warum der Anteil niedrig ist: Viele Challenges sind durch Lesen von Code grundsätzlich nicht auffindbar. Bezogen auf die im Code auffindbaren Challenges wäre der Anteil höher.


'''Bemerkenswert:''' Beide Läufe zusammen fanden '''12 Verdachtsfälle außerhalb des Katalogs''' (oder nur teilweise darin). Einer davon (Nr. 7) erwies sich später als falsch.
'''Bemerkenswert:''' Beide Läufe zusammen fanden '''12 Verdachtsfälle außerhalb des Katalogs''' (oder nur teilweise darin). Einer davon (Nr. 7) erwies sich später als falsch.
Line 363: Line 335:
! Ebene !! Prüfung !! Stand !! Ergebnis
! Ebene !! Prüfung !! Stand !! Ergebnis
|-
|-
| 1. Format || Entsprechen die Dateien Schema und Regeln? || durchgeführt || beide Skripte bestanden, in beiden Läufen; '''sagt nichts über die Echtheit einer Lücke'''
| 1. Format || Entsprechen die Dateien Schema und Regeln? || durchgeführt || beide Skripte bestanden, in beiden Läufen, '''sagt nichts über die Echtheit einer Lücke'''
|-
|-
| 2. Quellcode || Existieren die zitierten Stellen und tun sie, was behauptet wird? || durchgeführt, nur lesend || 320 von 320 Referenzen korrekt; 5 offene Fragen geklärt, 1 Fall widerlegt
| 2. Quellcode || Existieren die zitierten Stellen und tun sie, was behauptet wird? || durchgeführt, nur lesend || 320 von 320 Referenzen korrekt; 5 offene Fragen geklärt, 1 Fall widerlegt
Line 370: Line 342:
|}
|}


=== Vorgehen auf Ebene 2 ===
=== Eigene Kontrolle der Prüfskripte ===
Die Skripte wurden von Hand erneut ausgeführt, statt der Aussage des Agenten zu vertrauen (hier Lauf 1, Lauf 2 ebenfalls bestanden):
Die Prüfung fand in einer getrennten Cloud-Umgebung statt, unabhängig vom eigenen Rechner und ausschließlich lesend:
<pre>
# Juice Shop wurde auf genau dem Commit <code>5658473c</code> ausgecheckt.
node .claude/skills/security-audit/validate-findings.cjs audits/juice-shop/run-1/findings.json
# Ein Skript prüfte jede Angabe „Datei:Zeile“ aus <code>findings.json</code>. Ergebnis: '''110 von 110''' in Lauf 1 und '''210 von 210''' in Lauf 2. '''Keine erfundene Datei, keine erfundene Zeile.''' Das war wichtig, weil Halluzinationen die größte Sorge waren.
PASS: 12 findings valid
# Für die meisten Verdachtsfälle wurden die entscheidenden Codezeilen von Hand gelesen.
node .claude/skills/security-audit/validate-coverage-ledger.cjs audits/juice-shop/run-1/coverage-ledger.json
# Viele Fälle hingen an einer Frage zum Verhalten einer Bibliothek. Die Agenten konnten sie nicht klären, weil die Abhängigkeiten (<code>node_modules</code>) nicht installiert waren und der Skill eine Installation verbietet. Die Bibliotheken wurden deshalb mit <code>npm pack</code> heruntergeladen, was den Code lädt, ohne ihn auszuführen, und anschließend gelesen.
PASS: 22 coverage units valid
</pre>


=== Ergebnisse aus dem Bibliothekscode ===
=== Der widerlegte Fall (Nr. 7) ===
* '''Die Behauptung:''' Ein Hunter meinte in Lauf 2, die Benutzerdatensätze seien gegen PUT und DELETE geschützt, vielleicht aber nicht gegen PATCH. Akzeptiere die Bibliothek finale-rest PATCH, könne jeder Besucher Passwort oder Rolle beliebiger Benutzer ändern.
* '''Die Prüfer:''' Zwei unabhängige Prüfer markierten den Fall korrekt als <code>needs_validation</code>. Sie benannten die offene Frage: „Registriert die Bibliothek eine PATCH-Route?“ Ohne den Bibliothekscode konnten sie sie aber nicht beantworten.
* '''Die Tatsache:''' finale-rest 1.2.2 registriert Aktualisierungen standardmäßig nur für <code>put</code>, außer die Option <code>updateMethod</code> ist gesetzt. Juice Shop setzt sie nicht. '''Eine PATCH-Route existiert nicht.'''
* '''Die Lehre:''' Das Werkzeug war '''ehrlich''' und benannte seine Wissenslücke, trotzdem war der Fall falsch. '''Genauigkeit muss gemessen, nicht angenommen werden.''' In 33 Prüfurteilen (12 + 21) wurde kein Kandidat verworfen, obwohl mindestens einer falsch war. Fehlen Informationen, neigen die Prüfer offenbar zur Nachsicht.

=== Warum keine Laufzeitprüfung? ===
* Juice Shop ist absichtlich gefährlich und sollte nicht auf einem privaten Rechner laufen.
* macOS bietet die geforderte Sandbox nicht; der Skill selbst verweigert die Ausführung.
* Ziel des Seminars ist die Bewertung des '''Ansatzes''', nicht die Behebung der Lücken.
<code>NEEDS-VALIDATION.md</code> enthält für jeden Fall einen fertigen Prüfplan, meist auf Basis der Projekttests, die Grundlage für einen späteren Lauf mit Ausführung.

== Stärken, Schwächen und Kosten ==
{| class="wikitable"
{| class="wikitable"
! Stärken !! Schwächen
! Fall !! Offene Frage der KI !! Bibliothek !! Antwort
|-
|-
| '''Genau:''' keine von 320 Code-Referenzen erfunden || '''Keine Bestätigung ohne Sandbox:''' auf einem Mac bleibt jedes Ergebnis ein Verdacht
| Nr. 13 || Liest die Template-Engine <code>layout</code> aus den Optionen? || hbs 4.3.1 || ja, ohne Pfadbegrenzung → '''gestützt'''
|-
|-
| '''Ehrlich:''' kein Schweregrad ohne Beweis; „keine bestätigten Funde“ heißt ausdrücklich nicht „sicher“ || '''Fehlender Bibliothekscode:''' in Minuten klärbare Fragen blieben offen
| Nr. 3 || Erzeugt <code>load</code> ausführbare Funktionen? || js-yaml 3.15.2 || ja (<code>new Function</code>) → '''gestützt'''
|-
|-
| '''Stabil:''' alle Ergebnisse aus Lauf 1 kehrten in Lauf 2 wieder || '''Nachsichtige Prüfer:''' 0 von 33 Urteilen verworfen, trotzdem war einer falsch
| Nr. 2 || Wird der Algorithmus aus dem Token-Kopf übernommen? || jsonwebtoken 0.4.0 → jws 0.2.6 → jwa 0.0.1 || ja, auch „none“ mit leerer Signatur → '''gestützt'''
|-
|-
| '''Über das Lehrbuch hinaus:''' 12 Fälle außerhalb des Katalogs, darunter eine Regression im neuesten Commit || '''Budget bestimmt das Ergebnis:''' 23 bzw. 33 Ursachen blieben ungeprüft, abhängig von der Budgetplanung, nicht vom Code
| Nr. 4 || Werden <code>../</code>-Pfade aus dem Archiv bereinigt? || unzipper 0.12.5 || nein; der Schutz steckt nur in <code>extract()</code>, das Juice Shop nicht nutzt → '''gestützt'''
|-
|-
| '''Gegenseitige Prüfung wirkt:''' ein Prüfer korrigierte einen Hunter|| '''Hoher Ressourcenbedarf:''' 20 parallele Agenten übersteigen das Pro-Limit
| Nr. 7 || Gibt es eine PATCH-Route? || finale-rest 1.2.2 || nein, Aktualisierungen nur über PUT → '''widerlegt'''
|-
| '''Sichtbare Lücken:''' das Ledger zeigt, was nicht geprüft wurde || '''Nicht deterministisch:''' ein Lauf ist eine Stichprobe, keine Messung
|-
| '''Sicheres Scheitern:''' bei Ratenlimit und Berechtigungsproblem hielt das Werkzeug an und fragte nach ||
|}
|}

=== Beispiel: Ein Verdachtsfall ist kein Befund (Nr. 7) ===
'''Die Behauptung:''' In Lauf 2 meinte ein Hunter, die Benutzerdatensätze seien gegen PUT und DELETE geschützt, vielleicht aber nicht gegen PATCH. Akzeptiere die REST-Bibliothek finale-rest PATCH, könne jeder Besucher Passwort oder Rolle beliebiger Benutzer ändern.

'''Die Prüfer:''' Zwei unabhängige Prüfer behielten den Fall und markierten ihn korrekt als <code>needs_validation</code>. Sie benannten genau, was fehlte: „Registriert die Bibliothek eine PATCH-Route?“ Beantworten konnten sie es nicht, weil der Bibliothekscode nicht vorhanden war.

'''Die Tatsache:''' Laut Code registriert finale-rest 1.2.2 Aktualisierungen standardmäßig nur für <code>put</code>, außer die Option <code>updateMethod</code> wird gesetzt, und Juice Shop setzt sie nicht. '''Eine PATCH-Route existiert nicht''', der Verdachtsfall ist falsch.

'''Die Lehre:''' Das Werkzeug war '''ehrlich''' und hat genau benannt, was es nicht weiß. Trotzdem war der Fall falsch. '''Die Genauigkeit darf man nicht annehmen, man muss sie messen.''' Zudem haben die Prüfer in 33 Entscheidungen keinen einzigen Kandidaten verworfen, obwohl mindestens einer falsch war. Fehlen ihnen Informationen, neigen sie offenbar zur Nachsicht.

=== Warum keine Laufzeitprüfung? ===
* Juice Shop ist absichtlich gefährlich und sollte nicht auf einem privaten Rechner laufen.
* macOS bietet die geforderte Sandbox nicht; der Skill selbst verweigert die Ausführung.
* Ziel des Seminars ist die Bewertung des '''Ansatzes''', nicht die Behebung von Lücken in Juice Shop.

Für jeden Verdachtsfall enthält <code>NEEDS-VALIDATION.md</code> einen fertigen lokalen Prüfplan, meist auf Basis der vorhandenen Tests des Projekts. Diese Pläne sind die Grundlage für einen späteren Lauf mit Ausführung.

=== Antwort auf die vierte Seminarfrage ===
* '''Verstehen: ja.''' Jeder Verdachtsfall nennt Angreifer, Eingabe, fehlende Kontrolle, Codespur, fehlende Information und Prüfplan.
* '''Am Quellcode verifizieren: weitgehend.''' Alle Referenzen stimmen; der Bibliothekscode klärte fünf Fragen und widerlegte einen Fall.
* '''Zur Laufzeit verifizieren: noch nicht.'''


== Teil 10: Stärken, Schwächen und Kosten ==

=== Stärken ===
* '''Genau:''' keine von 320 Code-Referenzen erfunden.
* '''Ehrlich:''' kein Schweregrad ohne Beweis; der Bericht betont, dass „keine bestätigten Funde“ nicht „sicher“ bedeutet.
* '''Stabil:''' alle Ergebnisse aus Lauf 1 kehrten in Lauf 2 wieder.
* '''Über das Lehrbuch hinaus:''' 12 Verdachtsfälle außerhalb des Challenge-Katalogs, darunter eine Regression im neuesten Commit.
* '''Gegenseitige Prüfung wirkt:''' Ein Prüfer korrigierte die Aussage eines Hunters (Pfadtraversierung unter Windows).
* '''Sichtbare Lücken:''' Das Ledger zeigt genau, was nicht geprüft wurde.
* '''Sicheres Scheitern:''' Beim Ratenlimit und beim Berechtigungsproblem hielt das Werkzeug an und fragte nach, statt zu raten.

=== Schwächen ===
* '''Keine Bestätigung ohne Sandbox:''' Auf einem Mac bleibt jedes Ergebnis ein Verdacht.
* '''Fehlender Bibliothekscode:''' Fragen, die sich in Minuten klären ließen, blieben offen.
* '''Nachsichtige Prüfer:''' 0 von 33 verworfen, trotzdem war einer falsch.
* '''Das Budget bestimmt das Ergebnis:''' Wie viel validiert wird, hängt von der Budgetplanung ab, nicht vom Code. 23 bzw. 33 Ursachen blieben ungeprüft.
* '''Hoher Ressourcenbedarf:''' Die Parallelität (20 Agenten gleichzeitig) übersteigt das Limit eines Pro-Abonnements.
* '''Nicht deterministisch:''' Ein einzelner Lauf ist eine Stichprobe, keine Messung.


=== Kosten ===
=== Kosten ===
Line 441: Line 390:
| Agentenaufrufe || 24 || 57, dazu 20 Fehlstarts
| Agentenaufrufe || 24 || 57, dazu 20 Fehlstarts
|-
|-
| Geschätzte Kosten zu API-Listenpreisen || nicht gemessen || 51,65 USD
| Geschätzte Kosten || nicht gemessen || 51,65 USD
|-
| Wöchentliches Pro-Kontingent || 23 % || 44 % (+21 Prozentpunkte)
|-
|-
| Kosten je neuem Verdachtsfall || – || ca. 5,70 USD
| Kosten je neuem Verdachtsfall || – || ca. 5,70 USD
|}
|}


== Fazit und nächste Schritte ==
Die Dollarangabe ist eine Schätzung, die Claude Code mit dem Befehl <code>/usage</code> zu offiziellen API-Preisen anzeigt. Im Pro-Abonnement wird sie nicht berechnet, macht die Läufe aber vergleichbar. '''Der größte versteckte Kostenfaktor ist die Zeit des Menschen''', der die Ergebnisse prüfen muss.
'''Der Cloudflare security-audit skill ist heute ein genauer und ehrlicher „Generator von Verdachtsfällen“, aber noch keine „Urteilsmaschine“.''' Er findet echte, nachvollziehbare Probleme, auch außerhalb jedes Katalogs, und sagt offen, was er nicht beweisen kann. Aus einem Verdachtsfall wird erst durch Ausführung in einer isolierten Umgebung oder durch einen prüfenden Menschen ein Befund, genau dort liegen die größten Kosten.


== Teil 11: Fazit und nächste Schritte ==

=== Fazit ===
'''Der Cloudflare security-audit skill ist heute ein genauer und ehrlicher „Generator von Verdachtsfällen“, aber noch keine „Urteilsmaschine“.''' Er findet echte, nachvollziehbare Probleme, auch außerhalb jedes Katalogs, und sagt offen, was er nicht beweisen kann. Damit aus einem Verdachtsfall ein bestätigter Befund wird, braucht es eine Ausführung in einer isolierten Umgebung oder einen prüfenden Menschen. Genau dort liegen die größten Kosten.

=== Antworten auf die vier Fragen ===
{| class="wikitable"
{| class="wikitable"
! Frage !! Antwort
! Seminarfrage !! Antwort
|-
| Welche Werkzeuge sind geeignet? || Der Skill eignet sich gut für belastbare Verdachtsfälle. Ein Vergleich mit klassischer statischer Analyse steht noch aus.
|-
|-
| Wie funktioniert es? || Ein Koordinator zerlegt das Projekt in Einheiten, Hunter suchen parallel, unabhängige Prüfer versuchen zu widerlegen, feste Skripte prüfen die Ausgabe.
| Wie funktioniert es? || Ein Koordinator zerlegt das Projekt in Einheiten, Hunter suchen parallel, unabhängige Prüfer versuchen zu widerlegen, feste Skripte prüfen die Ausgabe.
|-
|-
| Verstehen und verifizieren? || Verstehen ja, am Quellcode weitgehend, zur Laufzeit noch nicht
| Welche Werkzeuge sind geeignet? || Der Skill eignet sich gut für belastbare Verdachtsfälle. Ein Vergleich mit klassischer statischer Analyse steht noch aus.
|-
|-
| Stärken, Schwächen, Kosten? || genau, ehrlich, stabil; aber ohne Sandbox keine Bestätigung, budgetabhängig, ca. 52 USD geschätzt für Lauf 2.
| Stärken, Schwächen, Kosten? || genau, ehrlich, stabil. Ohne Sandbox keine Bestätigung. Budgetabhängig, ca. 52 USD geschätzt für Lauf 2

|-
| Verstehen und verifizieren? || Verstehen ja; am Quellcode weitgehend; zur Laufzeit noch nicht.
|}
|}


=== Nächste Schritte ===
'''Nächste Schritte''' (jede Option verändert genau eine Größe):
Jede Option verändert genau eine Größe:
# '''Ausführung in einer isolierten Linux-VM:''' Der Skill kann Verdachtsfälle dort bestätigen oder verwerfen. Erst damit lässt sich die Genauigkeit messen.
# '''Ausführung in einer isolierten Linux-VM:''' Der Skill kann Verdachtsfälle dort bestätigen oder verwerfen. Erst damit lässt sich die Genauigkeit messen.
# '''Ein zweites, kleines reales Projekt:''' Es zeigt, ob sich die Ergebnisse von einer Trainingsanwendung auf echten Code übertragen lassen. Das entspricht am ehesten der Seminarvorgabe „eher kleine Projekte“.
# '''Ein zweites, kleines reales Projekt:''' zeigt, ob sich die Ergebnisse von einer Trainingsanwendung auf echten Code übertragen lassen, entspricht am ehesten der Vorgabe „eher kleine Projekte“.


== Quellen ==
== Quellen ==
Line 477: Line 419:
* Cloudflare Blog: ''Build your own vulnerability harness''. [https://blog.cloudflare.com/build-your-own-vulnerability-harness blog.cloudflare.com]
* Cloudflare Blog: ''Build your own vulnerability harness''. [https://blog.cloudflare.com/build-your-own-vulnerability-harness blog.cloudflare.com]
* OWASP Juice Shop, Commit 5658473c, inkl. <code>challenges.yml</code>. [https://github.com/juice-shop/juice-shop github.com/juice-shop/juice-shop]
* OWASP Juice Shop, Commit 5658473c, inkl. <code>challenges.yml</code>. [https://github.com/juice-shop/juice-shop github.com/juice-shop/juice-shop]
* Claude Code Dokumentation: Kosten und <code>/usage</code>. [https://code.claude.com/docs/en/costs code.claude.com/docs/en/costs]
* Claude Code Dokumentation: Skills. [https://code.claude.com/docs/en/skills code.claude.com/docs/en/skills]

Latest revision as of 14:39, 10 October 2026

Einleitung

Große Sprachmodelle können Code lesen, Zusammenhänge über viele Dateien hinweg verfolgen und Werkzeuge bedienen. Damit liegt es nahe, sie für die Suche nach Sicherheitslücken einzusetzen. Offen ist, wie belastbar ihre Ergebnisse sind, denn ein falscher Befund ist in der Sicherheitsanalyse teuer.

Der Bericht folgt den vier Fragen:

  1. Welche Werkzeuge sind verfügbar und geeignet?
  2. Wie funktioniert eine KI-Agent-basierte Sicherheitsanalyse?
  3. Können die gefundenen Schwachstellen verstanden und verifiziert werden?
  4. Wo liegen Stärken, Schwächen und Kosten?

Werkzeugfamilien

  • Klassische statische Analyse (SAST) wie Semgrep oder CodeQL ist schnell und reproduzierbar, findet aber vor allem Muster, die vorher als Regel formuliert wurden.
  • KI-Ageten wie Claude Code lesen und durchsuchen Code selbstständig. Sie erkennen auch Logikfehler über Dateigrenzen hinweg, arbeiten aber nicht deterministisch.

Ein Skill ist ein Ordner mit Anweisungen, den ein KI-Agent bei Bedarf lädt und der festlegt, wie der Agent eine Aufgabe erledigt.

Der Cloudflare security-audit skill

Steckbrief

Merkmal Beschreibung
Herkunft Cloudflare, großer Anbieter für den Schutz von Websites, auf GitHub unter MIT-Lizenz veröffentlicht
Bedeutung Laut Blogartikel „Build your own vulnerability harness“ Ausgangspunkt für Cloudflares interne Schwachstellensuche, später ausgebaut zu einer Pipeline über mehr als 128 Repositories
Form Der Skill ist kein Scanner und kein Programm. Er ist ein Ordner skills/security-audit/ mit rund 5.300 Zeilen Anweisungen und zwei Prüfskripten
Modi Anleitungsmodus (Standard): beantwortet Sicherheitsfragen ohne Berichtsdateien.
Vollständiger Audit-Modus: Dieser wird nur auf ausdrückliche Anfrage („Security Audit“, „Pen-Test“, „Full Security Review“) durchgeführt und durchläuft alle sechs Phasen. Im Projekt wird nur dieser Modus verwendet.

Bestandteile

Datei Aufgabe
SKILL.md Einstieg: Betriebsarten, Sicherheitsregeln, Profile, Budget, Schweregradskala, verbotene Fehler
RECONNAISSANCE.md Phase 1: Die Aufklärung des Projekts und der Aufbau von "architecture.md" und "Coverage Ledgers"
HUNTING.md, ATTACK-CLASSES.md Phase 2: Aufbau der Suchaufträge und Angriffsklassen (Injection, Zugriffskontrolle, Dateien, Kryptografie, Geschäftslogik …)
10 Begleitdateien Spezialwissen, nur bei Bedarf geladen: Web und Authentifizierung, Client-Seite, KI/LLM, Lieferkette, Cloud, Protokolle, Ressourcenerschöpfung, Datenisolation, Desktop/Mobil, Speichersicherheit
VALIDATION-AND-REPORTING.md Phasen 3 bis 6: Validierung, Ausgabe, zweite Verifikation, Bericht
report-schema.json festes JSON-Schema für jedes Ergebnis
validate-findings.cjs, validate-coverage-ledger.cjs Node.js-Skripte, die die Ausgabe mit festen Regeln prüfen

Warum die Prüfskripte wichtig sind: Ein Sprachmodell kann eine JSON-Datei schreiben, die richtig aussieht, aber unvollständig oder widersprüchlich ist. Die Skripte arbeiten ohne KI und lehnen etwa fehlende Felder, ungültige Pfade oder einen Schweregrad für einen unbestätigten Fund ab.

Vier Rollen

Der Skill macht aus einem Agenten ein kleines Prüfteam mit vier Rollen:

Rolle Name im Skill Aufgabe
Koordinator Parent die Hauptsitzung in Claude Code; verteilt die Arbeit und schreibt als Einziger die gemeinsamen Dateien
Sucher Hunter Subagenten, die in einem zugewiesenen Codebereich und für eine Angriffsklasse nach Fehlern suchen
Prüfer Verifier neue Subagenten, die die Suche nicht kennen und jeden Fund zu widerlegen versuchen
Kritiker Critic Subagenten, die nach Codebereichen suchen, die niemand geprüft hat

Prinzip: Wer findet, bewertet nicht. Ein Agent, der seinen eigenen Fund bewertet, neigt zur Selbstbestätigung. Jeder Subagent arbeitet in agents/<agent-id>/scratch/ und liefert strukturiertes JSON an den Koordinator.

Sechs Phasen

Phase Was passiert Ergebnis
1 Aufklärung
reconnaissance
Der Koordinator startet vier Agenten gleichzeitig, die nur lesen:
  • Agent 1a: Produkt, Benutzer, Sprachen und Frameworks, Build- und Testbefehle.
  • Agent 1b: Rollen, Berechtigungen, Anmelde- und Rechteprüfungen.
  • Agent 1c: Eingabepunkte (HTTP-Anfragen, Datei-Uploads usw.) und wohin die Daten im Code fließen.
  • Agent 1d: Was lässt sich lokal sicher testen, und bietet der Rechner die geforderte Sandbox?
architecture.md, coverage-ledger.json
2 Suche
hunting
Hunter erhalten Prüfeinheiten samt Angriffsklassen-Anweisungen im Wortlaut und verfolgen eine Eingabe bis zur kritischen Stelle (sink, z. B. Datenbankabfrage). Ein Kritiker sucht danach Lücken, diese werden neue Einheiten, falls das Budget eine weitere Welle erlaubt. Kandidaten als JSON
3 Validierung
validation
Kern des Skills: Ein neuer Prüfer liest jede zitierte Zeile erneut, sucht übersehene Schutzmechanismen und versucht zu widerlegen. eines von drei Urteilen
4 Strukturierte Ausgabe Urteile werden geschrieben, Prüfskripte kontrollieren das Format. findings.json
5 Zweite Verifikation Weitere neue Agenten prüfen die Aussagen erneut, wesentliche Änderungen prüft ein zusätzlicher Agent. bestätigte Datensätze
6 Bericht Bericht nur aus geprüften Datensätzen; er darf kein Urteil ändern. REPORT.md, FINDINGS-DETAIL.md, NEEDS-VALIDATION.md

Endbedingung: Ein Lauf endet nie mitten in einer Phase. Entweder sind alle Berichtsdateien geschrieben und beide Skripte bestanden, oder der Lauf wird mit Grund als „incomplete“ markiert.

Urteile und Schweregrad

Urteil Bedeutung Schweregrad?
confirmed vollständige Codespur vom Eingabepunkt zur kritischen Stelle und lokal beobachtetes Ergebnis ja
needs_validation codebasierter Verdacht, dem genau ein Fakt fehlt, mit Prüfplan nein
rejected von einem Prüfer widerlegt nein

Einträge mit needs_validation heißen hier Verdachtsfälle (leads). Für „confirmed“ muss der Code ausgeführt werden; fehlerhaft aussehender Code genügt nicht.

Schweregrad (nur bestätigte Funde) Beispiel
critical nicht angemeldeter Angreifer führt Code aus, erhält vollen Datenbankzugriff oder übernimmt beliebige Konten
high Sicherheitskontrolle vollständig umgangen, z. B. Anmeldung umgangen, fremde Daten gelesen
medium echte Grenzverletzung mit begrenzter Wirkung oder seltenen Voraussetzungen
low Preisgabe nicht geheimer interner Informationen
informational bestätigt, aber minimale Wirkung

Coverage Ledger

Das Coverage Ledger zerlegt das Projekt in Prüfeinheiten. Jede Einheit ist eine Kombination aus vier Teilen: Eingabepunkt × Vertrauensgrenze × Teilsystem × Angriffsklasse. Jede Prüfeinheit hat einen Status

Status Bedeutung
planned geplant, noch nicht begonnen
in_progress ein Hunter arbeitet daran
covered geprüft, kein Fund
candidate enthält einen validierten Verdachtsfall
blocked geprüft, enthält aber nur ungeprüfte Hinweise
deferred zurückgestellt, meist wegen des Budgets
out_of_scope, not_applicable außerhalb des Umfangs bzw. nicht zutreffend

Die meisten Werkzeuge sagen, was sie gefunden haben, aber nicht, was sie nicht geprüft haben. Das Ledger macht Lücken in der Abdeckung sichtbar. Niemand kann „alles geprüft“ behaupten, solange Einheiten zurückgestellt sind.

Fingerabdruck

Jede Grundursache erhält eine feste Kennung, den Fingerabdruck (fingerprint), z. B. juice-shop/routes/login/raw-sql-string-interpolation. Er enthält keine Zeilennummer und bleibt daher auch bei kleinen Codeänderungen gleich. Damit lassen sich Läufe vergleichen.

Profile und Budget

Profil Bedeutung
quick eine Suchwelle, ein abschließender Kritiker, ein Prüfer pro Kandidat. Für einen ersten Überblick.
standard Suchwellen, bis die Kritiker keine Lücken mehr finden oder das Budget aufgebraucht ist, zwei Kritiker, zwei getrennte Prüfer pro Fall
deep für große, kritische Projekte: feinere Einheiten, zusätzliche unabhängige Prüfung

Das Budget ist die Höchstzahl der Agentenaufrufe über alle Phasen. Vor der Suche reserviert der Skill Aufrufe für Kritiker und Prüfer, damit die Hunter nicht das ganze Budget verbrauchen und am Ende niemand mehr prüfen kann.

Mehrere Läufe bauen aufeinander auf

Kennt ein zweiter Lauf den Ort des ersten, liest er dessen Ledger und Ergebnisse. Er konzentriert sich dann auf zurückgestellte Einheiten und ungeprüfte Hinweise und prüft alte Ergebnisse erneut. Laut Cloudflare findet ein einzelner Lauf etwa die Hälfte dessen, was wiederholte Läufe zusammen finden.

Sicherheitsregel: ohne Sandbox keine Ausführung

Zielcode darf nur in einer vom Betriebssystem erzwungenen Sandbox laufen: kein externes Netzwerk, leere Umgebung ohne Variablen und Passwörter, Zielcode nur lesbar, Schreiben nur im eigenen Arbeitsordner, harte Grenzen für CPU, Speicher, Prozesse und Laufzeit. Fehlt eine Eigenschaft, führt der Skill nichts aus, vermerkt einen Blocker und belässt den Fund bei needs_validation. Zudem verboten: Anfragen an produktive Systeme, Installation von Abhängigkeiten, echte Zugangsdaten, Änderungen am Zielcode (Korrekturen werden nur beschrieben).

Das Zielprojekt: OWASP Juice Shop

Merkmal Beschreibung
Was fiktiver Saft-Webshop, absichtlich voller Lücken, für Sicherheitstrainings
Technik Server: TypeScript, Node.js, Express, SQLite (Sequelize), MarsDB (In-Memory)
Oberfläche: Angular · Anmeldung: JWT
Warum dieses Projekt Lösungsschlüssel data/static/challenges.yml mit 116 Challenges liefert eine Referenz (ground truth), um Treffer und Lücken des Werkzeugs zu messen. Juice Shop ist nicht klein, dieser Vorteil überwiegt aber.
safetyMode schaltet ca. 19 gefährliche Challenges (Codeausführung, Dateizugriff) ab, sobald die App in Docker oder auf Heroku läuft.
Version 20.2.0, Commit 5658473c vom 10.08.2026: „Add missing guard around lfrChallenge for safe mode“, sollte also den sicheren Modus verbessern
Warum fester Stand Sonst wäre unklar, ob ein Unterschied zwischen Läufen an der KI oder am Code liegt.

Versuchsdurchführung

Merkmal Lauf 1 Lauf 2
Profil quick standard
Budget 25 Aufrufe 60 Aufrufe
Vorwissen keins Lauf 1 (nur lesend)
Ausführung von Zielcode nein nein
Commit 5658473c 5658473c
Kandidaten je Hunter 2 1
Dauer 26 Minuten 3 h 13 Minuten (davon 1 h 37 min Wartezeit)
Aufrufe nach Rolle
Aufklärung 4 4
Hunter 6 9
Kritiker 1 2
Prüfer Phase 3 12 21
Prüfer Phase 5 / erneute Prüfung 1 21
Summe erfolgreich 24 von 25 57 von 60
Fehlstarts durch Ratenlimit (nicht gezählt) – 20

Aufträge

Lauf 1:

Run a full security audit of this codebase using the security-audit skill.
Profile: quick. Budget: 25 agent invocations.
Source-only: do not execute target code; record anything that needs
execution as needs_validation.
Output to ~/ITS/audits/juice-shop/run-1

Lauf 2:

/security-audit Full audit of ~/ITS/targets/juice-shop.
Profile: standard. Budget: 60 agent invocations.
Source-only: do not execute target code; record anything needing execution as needs_validation.
Prior run: ~/ITS/audits/juice-shop/run-1 (coverage-ledger.json, findings.json); do not modify run-1.
Output: ~/ITS/audits/juice-shop/run-2

Beide Aufträge enthalten die ausdrückliche Bitte um ein vollständiges Audit (damit der Audit-Modus greift), Profil, Budget, die Regel „nur Quellcode“ und den Ausgabeort. In Lauf 2 musste der Ort von Lauf 1 angegeben werden, da der Skill frühere Läufe nur in seinem Standardordner ~/security-audit-skill/ selbst findet.

Ergebnisse

Überblick

Status der Prüfeinheiten: Lauf 2 prüfte deutlich mehr Einheiten, die meisten neuen blieben aber blockiert, weil das Budget die Validierung nicht abdeckte.
Kennzahl Lauf 1 Lauf 2
Geprüfte Verdachtsfälle (needs_validation) 12 21 (12 übernommen, 9 neu)
Bestätigt / verworfen 0 / 0 0 / 0
Ungeprüfte Hinweise 23 33
Prüfeinheiten im Ledger 22 53
davon covered / candidate / blocked / deferred 0 / 11 / 1 / 10 4 / 21 / 20 / 8
Prüfskripte (selbst nachgeprüft) bestanden bestanden

Lauf 2 brachte vor allem mehr Breite, aber keinen zusätzlichen Beweis. Die Ergebnisse sind stabil: Alle 12 Fälle aus Lauf 1 kamen mit demselben Urteil zurück. Von den 9 neuen Fällen waren 5 in Lauf 1 schon als ungeprüfte Hinweise notiert, 4 sind neue Ursachen.





Die 21 Verdachtsfälle

„Katalog“ zeigt, ob der Fall einer beabsichtigten Juice-Shop-Challenge entspricht. „Eigene Prüfung“ ist das Ergebnis meiner Quellcodeprüfung. Angriffsdaten werden bewusst nicht genannt.

Nr. Verdachtsfall Katalog Eigene Prüfung
1 JWT-Signierschlüssel fest im Code und öffentlich abrufbar ja gestützt
2 JWT-Algorithmus nicht festgelegt ja gestützt
3 YAML-Upload erlaubt Codeausführung nein gestützt
4 Zip-Slip beim Datei-Upload ja gestützt
5 Benutzername wird per eval ausgewertet (Template-Injection) ja Codezeile stimmt
6 SQL-Injection in Login und Produktsuche ja nicht geprüft
7 Methodensperren über PATCH umgehbar nein widerlegt
8 Öffentlicher Endpunkt liefert Passwort-Hashes der Fotowand nein Code stimmt
9 Öffentliche Zugriffsprotokolle enthalten Passwörter teilweise gestützt
10 SSRF über Profilbild-URL ja Codezeile stimmt
11 SSRF über Chatbot-Nachrichten nein nicht geprüft
12 JavaScript-Injection über MarsDB-$where ja nicht geprüft
13 Unvollständiger Sicherheitsschalter im neuesten Commit nein gestützt
14 Sitzungen laufen nie ab und werden nie widerrufen nein Code stimmt
15 Adressen ohne Eigentümerprüfung änderbar nein Route stimmt
16 Bewertungen massenhaft änderbar (NoSQL) ja nicht geprüft
17 Datenexport schreibt fremde Texte als HTML nein Codezeile stimmt
18 DOM-XSS über Suchparameter ja Codezeile stimmt
19 Unbehandelter Fehler kann den Server beenden nein plausibel
20 Pfadtraversal mit Backslash (nur Windows) nein Codezeile stimmt
21 Chatbot-Verläufe bleiben nach Abmeldung erhalten nein Code stimmt

Vergleich mit dem Lösungsschlüssel

  • Nach Lauf 1: ca. 29 von 116 Challenges gemeldet (ca. 25 %)
  • Nach beiden Läufen: ca. 37 von 116 Challenges gemeldet (ca. 32 %)

Warum der Anteil niedrig ist: Viele Challenges sind durch Lesen von Code grundsätzlich nicht auffindbar. Bezogen auf die im Code auffindbaren Challenges wäre der Anteil höher.

Bemerkenswert: Beide Läufe zusammen fanden 12 Verdachtsfälle außerhalb des Katalogs (oder nur teilweise darin). Einer davon (Nr. 7) erwies sich später als falsch.

Verifikation der Ergebnisse

Dieser Teil beantwortet die vierte Seminarfrage. Unterschieden werden drei Ebenen:

Ebene Prüfung Stand Ergebnis
1. Format Entsprechen die Dateien Schema und Regeln? durchgeführt beide Skripte bestanden, in beiden Läufen, sagt nichts über die Echtheit einer Lücke
2. Quellcode Existieren die zitierten Stellen und tun sie, was behauptet wird? durchgeführt, nur lesend 320 von 320 Referenzen korrekt; 5 offene Fragen geklärt, 1 Fall widerlegt
3. Laufzeit Funktioniert der Angriff auf einer laufenden Kopie? nicht durchgeführt erfordert eine isolierte Umgebung

Eigene Kontrolle der Prüfskripte

Die Skripte wurden von Hand erneut ausgeführt, statt der Aussage des Agenten zu vertrauen (hier Lauf 1, Lauf 2 ebenfalls bestanden):

node .claude/skills/security-audit/validate-findings.cjs audits/juice-shop/run-1/findings.json
PASS: 12 findings valid
node .claude/skills/security-audit/validate-coverage-ledger.cjs audits/juice-shop/run-1/coverage-ledger.json
PASS: 22 coverage units valid

Der widerlegte Fall (Nr. 7)

  • Die Behauptung: Ein Hunter meinte in Lauf 2, die Benutzerdatensätze seien gegen PUT und DELETE geschützt, vielleicht aber nicht gegen PATCH. Akzeptiere die Bibliothek finale-rest PATCH, könne jeder Besucher Passwort oder Rolle beliebiger Benutzer ändern.
  • Die Prüfer: Zwei unabhängige Prüfer markierten den Fall korrekt als needs_validation. Sie benannten die offene Frage: „Registriert die Bibliothek eine PATCH-Route?“ Ohne den Bibliothekscode konnten sie sie aber nicht beantworten.
  • Die Tatsache: finale-rest 1.2.2 registriert Aktualisierungen standardmäßig nur für put, außer die Option updateMethod ist gesetzt. Juice Shop setzt sie nicht. Eine PATCH-Route existiert nicht.
  • Die Lehre: Das Werkzeug war ehrlich und benannte seine Wissenslücke, trotzdem war der Fall falsch. Genauigkeit muss gemessen, nicht angenommen werden. In 33 Prüfurteilen (12 + 21) wurde kein Kandidat verworfen, obwohl mindestens einer falsch war. Fehlen Informationen, neigen die Prüfer offenbar zur Nachsicht.

Warum keine Laufzeitprüfung?

  • Juice Shop ist absichtlich gefährlich und sollte nicht auf einem privaten Rechner laufen.
  • macOS bietet die geforderte Sandbox nicht; der Skill selbst verweigert die Ausführung.
  • Ziel des Seminars ist die Bewertung des Ansatzes, nicht die Behebung der Lücken.

NEEDS-VALIDATION.md enthält für jeden Fall einen fertigen Prüfplan, meist auf Basis der Projekttests, die Grundlage für einen späteren Lauf mit Ausführung.

Stärken, Schwächen und Kosten

Stärken Schwächen
Genau: keine von 320 Code-Referenzen erfunden Keine Bestätigung ohne Sandbox: auf einem Mac bleibt jedes Ergebnis ein Verdacht
Ehrlich: kein Schweregrad ohne Beweis; „keine bestätigten Funde“ heißt ausdrücklich nicht „sicher“ Fehlender Bibliothekscode: in Minuten klärbare Fragen blieben offen
Stabil: alle Ergebnisse aus Lauf 1 kehrten in Lauf 2 wieder Nachsichtige Prüfer: 0 von 33 Urteilen verworfen, trotzdem war einer falsch
Über das Lehrbuch hinaus: 12 Fälle außerhalb des Katalogs, darunter eine Regression im neuesten Commit Budget bestimmt das Ergebnis: 23 bzw. 33 Ursachen blieben ungeprüft, abhängig von der Budgetplanung, nicht vom Code
Gegenseitige Prüfung wirkt: ein Prüfer korrigierte einen Hunter Hoher Ressourcenbedarf: 20 parallele Agenten übersteigen das Pro-Limit
Sichtbare Lücken: das Ledger zeigt, was nicht geprüft wurde Nicht deterministisch: ein Lauf ist eine Stichprobe, keine Messung
Sicheres Scheitern: bei Ratenlimit und Berechtigungsproblem hielt das Werkzeug an und fragte nach

Kosten

Posten Lauf 1 Lauf 2
Dauer 26 Minuten 3 Stunden 13 Minuten
Agentenaufrufe 24 57, dazu 20 Fehlstarts
Geschätzte Kosten nicht gemessen 51,65 USD
Kosten je neuem Verdachtsfall – ca. 5,70 USD

Fazit und nächste Schritte

Der Cloudflare security-audit skill ist heute ein genauer und ehrlicher „Generator von Verdachtsfällen“, aber noch keine „Urteilsmaschine“. Er findet echte, nachvollziehbare Probleme, auch außerhalb jedes Katalogs, und sagt offen, was er nicht beweisen kann. Aus einem Verdachtsfall wird erst durch Ausführung in einer isolierten Umgebung oder durch einen prüfenden Menschen ein Befund, genau dort liegen die größten Kosten.

Seminarfrage Antwort
Welche Werkzeuge sind geeignet? Der Skill eignet sich gut für belastbare Verdachtsfälle. Ein Vergleich mit klassischer statischer Analyse steht noch aus.
Wie funktioniert es? Ein Koordinator zerlegt das Projekt in Einheiten, Hunter suchen parallel, unabhängige Prüfer versuchen zu widerlegen, feste Skripte prüfen die Ausgabe.
Verstehen und verifizieren? Verstehen ja, am Quellcode weitgehend, zur Laufzeit noch nicht
Stärken, Schwächen, Kosten? genau, ehrlich, stabil. Ohne Sandbox keine Bestätigung. Budgetabhängig, ca. 52 USD geschätzt für Lauf 2

Nächste Schritte (jede Option verändert genau eine Größe):

  1. Ausführung in einer isolierten Linux-VM: Der Skill kann Verdachtsfälle dort bestätigen oder verwerfen. Erst damit lässt sich die Genauigkeit messen.
  2. Ein zweites, kleines reales Projekt: zeigt, ob sich die Ergebnisse von einer Trainingsanwendung auf echten Code übertragen lassen, entspricht am ehesten der Vorgabe „eher kleine Projekte“.

Quellen