KI-Sicherheitsanalyse-security-audit-skill: Difference between revisions
No edit summary |
|||
| (11 intermediate revisions by the same user not shown) | |||
| Line 101: | Line 101: | ||
|} |
|} |
||
| ⚫ | |||
| ⚫ | |||
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. |
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. |
|||
{| class="wikitable sortable" |
|||
! 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-<code>$where</code> || 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 |
|||
|} |
|||
Besondersauffällig ist '''Nr. 13''' Der neueste Commit fügt einen Schalter für den '''sicheren Modus''' nur in einem Codezweig ein, im anderen fehlen Sperrliste und Kürzung. Dies ist eine Regression genau in dem Modus, der die Anwendung absichern soll. '''Nr. 3''' erlaubt Codeausführung über einen anonymen Upload, wofür es keine Challenge gibt. Nach einer Bestätigung zur Laufzeit wären beide nach Juice Shops <code>SECURITY.md</code> vertaulich an den Maintainer zu melden. |
|||
=== Vergleich mit dem Challenge-Katalog === |
|||
Nach Lauf 1 erschienen ca. 29, nach beidenLäufen ca. 37 der Challenges (rund 32 %) als Verdachtsfall, ungeprüfter Hinweis oder Härtungshinweis. Viele Challenges sind durch Code-Lesen grundsätzlich nicht auffindbar (z. B. Foto-Geolokalisierung, Steganografie, schwache Passwörter). Dafür fanden die Läufe '''12 Verdachtsfälle außerhalb des Katalogs''', von denen einer (Nr. 7) später widerlegt wurde. |
|||
== Verifikation der Ergebnisse == |
|||
{| class="wikitable" |
|||
! Ebene !! Prüfung !! Ergebnis |
|||
|- |
|||
| 1. Format || Ausgabe entspricht Schema und Ledger-Regeln || beide Prüfskripte bestanden (z. B. <code>PASS: 21 findings valid</code>); sagt nichts über echte Fehler |
|||
|- |
|||
| 2. Quellcode || Zitierte Stellen existieren und tun, was behauptet wird || '''320 von 320''' Referenzen korrekt; 5 offene Fragen geklärt, 1 Fall widerlegt |
|||
|} |
|||
'''Vorgehen auf Ebene 2:''' Jede zitierte Datei und Zeile wurde geprüft, also ausgewählte Stellen wurden von Hand gelesen. Wo ein Fall an einer Frage zum Bibliotheksverhalten hing, wurde das Paket mit <code>npm pack</code> geladen und nur gelesen, nicht ausgeführt: |
|||
== Anhang: Verwendete Aufträge == |
== Anhang: Verwendete Aufträge == |
||
'''Lauf 1:''' |
|||
'''Lauf 2:''' |
|||
Latest revision as of 20:36, 7 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 der Seminarbeschreibung:
- Wie funktioniert eine KI-Agent-basierte Sicherheitsanalyse?
- Welche Werkzeuge sind verfügbar und geeignet?
- Wo liegen Stärken, Schwächen und Kosten?
- Können die gefundenen Schwachstellen verstanden und verifiziert werden?
Grundlagen
Werkzeuglandschaft
- 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
Der Security-audit Skill ist ein öffentliches Repository von Cloudflare (MIT-Lizenz) und laut Cloudflare der Ausgangspunkt ihres internen Systems zur Schwachstellensuche. Er ist kein Scanner, sondern besteht aus rund 5.300 Zeilen Anweisungen und zwei Prüfskripten:
| Bestandteil | Zweck |
|---|---|
SKILL.md |
Einstieg: Betriebsarten, Sicherheitsregeln, Profile, Budget, Schweregrade |
RECONNAISSANCE.md, HUNTING.md, ATTACK-CLASSES.md |
Aufklärung, Suchaufträge und Angriffsklassen |
| 10 Begleitdateien | Spezialwissen (z. B. Web/Authentifizierung, Client-Seite, KI/LLM), nur bei Bedarf geladen |
VALIDATION-AND-REPORTING.md |
Validierung, Verifikation und Bericht |
report-schema.json und zwei .cjs-Skripte |
JSON-Schema und deterministische Prüfung der Ausgabe |
Verwendet wurde der vollständige Audit-Modus, der alle sechs Phasen durchläuft und Berichtsdatein schreibt.
Ablauf in sechs Phasen

- Aufklärung: Vier Agenten erfassen parallel Technick, Benutzerrollen, Vertrauensgrenzen und Eingabepunkte. Daraus entstehen
architecture.mdund das Coverage Ledger. - Suche: Hunter-Agenten prüfen je eine Einheit mit passenden Angriffsklassen; Kritiker-Agenten suchen ungeprüfte Bereiche.
- Validierung: Jeder Kandidat geht an einen frischen Prüfer, der die Suche nicht kennt und den Fund zu widerlegen versucht.
- Strukturierte Ausgabe: Die Urteile landen in
findings.jsonund werden gegen das Schema geprüft. - Erneute Verifikation: Weitere frische Agenten prüfen die endgültigen Aussagen ein zweites Mal.
- Bericht: Erst dann entstehen
REPORT.mdundNEEDS-VALIDATION.md, ausschließlich aus geprüften Datensätzen.
Nur der koordinierende Agent (parent) schreibt gemeinsame Dateien, alle anderen liefern strukturierte JSON-Ergebnisse zurück.
Zentrale Konzepte
| Urteil | Bedeutung | Schweregrad |
|---|---|---|
confirmed |
Vollständige Spur durch den Code und ein lokal beobachtetes Ergebnis | ja |
needs_validation |
Quellcodebasierter Verdacht, bei dem genau ein Fakt fehlt; mit Prüfplan | nie |
rejected |
Von einem Prüfer widerlegt | nein |
Versuchsaufbau
Zielprojekt: OWASP Juice Shop ist ein absichtlich unsicherer Webshop für Sicherheitstrainings (TypeScript, Express, Angular, SQLite). Er liefert mit data/static/challenges.yml einen Lösungsschlüssel von 116 beabsichtigten Schwachstellen. Damit lässt sich prüfen, was die KI findet und was sie übersieht. Alle Läufe nutzen Version 20.2.0, Commit 5658473c.
| Merkmal | Lauf 1 | Lauf 2 |
|---|---|---|
| Umgebung | Claude Code , Claude Pro, macOS | |
| Profil | Quick | Standard |
| Budget | 25 Agentenaufrufe | 60 Agentenaufrufe |
| Vorwissen | keins | Lauf 1 (nur lesend) |
Zwischen den Läufen änderten sich nur Breite und Vorwissen. Beide Läufe arbeiteten nur am Quellcode: Juice Shop ist absichtlich verwundbar und sollte nicht auf einem privaten Rechner laufen. Zudem kann macOS die geforderte Sandbox nicht bereitstellen. Das Urteil confirmed war damit grundsätzlich nicht erreichbar. Die genauen Aufträge stehen im Anhang.
Durchführung
Lauf 1 dauerte 26 Minuten und nutzte 24 von 25 Aufrufen (4 Aufklärung, 6 Hunter, 1 Kritiker, 13 Prüfer). Um Budget für die Validierung zu behalten, begrenzte der koordinierende Agent jeden Hunter auf zwei Kandidaten, 23 weiter Ursachen blieben als ungeprüfte Hinweise im Ledger. Ein Prüfer widerlegte die ursprüngliche Angriffsidee eines Hunter und präzisierte die Aussage.
Lauf 2 dauerte 3 Stunden 13 Minuten und nutzte 57 von 60 Aufrufen (4 Aufklärung, 9 Hunter, 2 Kritiker, 42 Prüfer). Drei Ereignisse prägten ihn:
- Ratenlimit: Rund 20 gleichzeitig gestartete Agenten wurden vom Sitzungslimit des Pro-Abonnements abgebrochen. Der Skill hielt an und fragte nach. Die Fehlstarts wurden nicht auf das Budget angerechnet, aber offengelegt, und die Agenten in Fünfergruppen neu gestartet.
- Budgetbindung: Die 12 übernommenen Verdachtsfälle aus Lauf 1 banden 24 Prüferaufrufe. Jeder Hunter durfte daher nur einen Kandidaten einreichen; 33 Ursachen blieben ungeprüft.
- Sicherheitsfilter: Der erste Berichtsentwurf wurde angehalten und ohne konkrete Angriffsdaten neu geschrieben.
Ergebnisse
Überblick
| 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.
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 |
Besondersauffällig ist Nr. 13 Der neueste Commit fügt einen Schalter für den sicheren Modus nur in einem Codezweig ein, im anderen fehlen Sperrliste und Kürzung. Dies ist eine Regression genau in dem Modus, der die Anwendung absichern soll. Nr. 3 erlaubt Codeausführung über einen anonymen Upload, wofür es keine Challenge gibt. Nach einer Bestätigung zur Laufzeit wären beide nach Juice Shops SECURITY.md vertaulich an den Maintainer zu melden.
Vergleich mit dem Challenge-Katalog
Nach Lauf 1 erschienen ca. 29, nach beidenLäufen ca. 37 der Challenges (rund 32 %) als Verdachtsfall, ungeprüfter Hinweis oder Härtungshinweis. Viele Challenges sind durch Code-Lesen grundsätzlich nicht auffindbar (z. B. Foto-Geolokalisierung, Steganografie, schwache Passwörter). Dafür fanden die Läufe 12 Verdachtsfälle außerhalb des Katalogs, von denen einer (Nr. 7) später widerlegt wurde.
Verifikation der Ergebnisse
| Ebene | Prüfung | Ergebnis |
|---|---|---|
| 1. Format | Ausgabe entspricht Schema und Ledger-Regeln | beide Prüfskripte bestanden (z. B. PASS: 21 findings valid); sagt nichts über echte Fehler
|
| 2. Quellcode | Zitierte Stellen existieren und tun, was behauptet wird | 320 von 320 Referenzen korrekt; 5 offene Fragen geklärt, 1 Fall widerlegt |
Vorgehen auf Ebene 2: Jede zitierte Datei und Zeile wurde geprüft, also ausgewählte Stellen wurden von Hand gelesen. Wo ein Fall an einer Frage zum Bibliotheksverhalten hing, wurde das Paket mit npm pack geladen und nur gelesen, nicht ausgeführt:
Anhang: Verwendete Aufträge
Lauf 1: Lauf 2: