Warum Pattern-Matching nicht ausreicht
Die Seite zu Deep Code Analysis fasst das Problem in drei Sätzen zusammen: „SAST kann ein Muster markieren. Ein LLM kann Code erklären. Keines von beiden zeigt, wie eine Schwachstelle die Anwendung tatsächlich beeinträchtigt.“ Diese Lektion zeigt, was das für deine tägliche Triage bedeutet.
Was ein Muster-Scanner sieht
Nimm einen Login-Handler, der über zwei Dateien verteilt ist:
# routes/auth.py
@app.post("/login")
def login():
username = request.form["username"]
user = find_user(username)
# services/users.py
def find_user(username):
query = "SELECT * FROM users WHERE name = '" + username + "'"
return db.execute(query)
Eine Musterregel erkennt eine String-Verkettung, die in db.execute fließt, und meldet eine SQL-Injection in services/users.py. Der Treffer stimmt. Trotzdem bleiben genau die Fragen offen, die über deinen nächsten Schritt entscheiden:
- Stammt
usernameaus dem HTTP-Request oder aus einer Konstante in einem Batch-Job? - Wird der Wert unterwegs irgendwo bereinigt oder parametrisiert?
- Ist der Handler geroutet und deployt, und kann jemand aus dem Internet den Service erreichen?
- Welche Daten könnte ein Angreifer darüber auslesen?
Ohne diese Antworten tappen Teams in eine von zwei Fallen. Die einen behandeln jeden Treffer als dringend und gehen im Rauschen unter. Die anderen fangen an, Treffer zu ignorieren, und übersehen genau den, auf den es ankommt.
Was eine KI-Erklärung beiträgt und was nicht
Ein Large Language Model kann find_user lesen und einen überzeugenden Absatz darüber schreiben. Eine flüssige Erklärung ist aber keine Evidenz. Ein Modell kann einen Aufrufpfad beschreiben, den es nicht gibt, eine Zeile zitieren, die nicht in der Datei steht, oder eine Eingabe als tainted einstufen, die zwei Funktionen vorher bereinigt wurde. Wenn niemand diese Behauptungen gegen dein Repository prüft, hast du nur Scanner-Rauschen gegen KI-Rauschen getauscht.
Schwachstellen ganz ohne Muster
Sieh dir jetzt eine Rechnungs-API an:
// GET /api/invoices/:id
router.get("/api/invoices/:id", requireLogin, async (req, res) => {
const invoice = await Invoice.findById(req.params.id);
res.json(invoice);
});
Hier wird keine gefährliche Funktion aufgerufen, und der Aufrufer ist angemeldet. Die Schwachstelle ist etwas, das fehlt: Nichts prüft, ob die Rechnung zum Konto des Aufrufers gehört. Jeder Kunde kann die Rechnungs-IDs der Reihe nach durchgehen und die Abrechnungsdaten aller anderen lesen. Das ist eine Insecure Direct Object Reference (IDOR), auch Broken Object Level Authorization (BOLA) genannt. Es gibt keinen Sink, auf den ein Muster passen könnte. Finden lässt sich diese Schwachstelle nur, wenn man durchdenkt, was der Code eigentlich erlauben soll.
Wo Deep Code Analysis ihren Platz hat
Plexicus nennt seinen Ansatz Proof-Driven AppSec: Validieren (AI Swarm Pentest), Verstehen (Deep Code Analysis), Beheben (Remediation). Deep Code Analysis ist der Schritt Verstehen. Sie ergänzt einen Befund um den betroffenen Ablauf, um die Angabe, ob ein Angreifer ihn erreichen kann, und um die Schwachstellenklasse. Außerdem prüft sie zentrale KI-Aussagen gegen deinen Code: AI Scan-Befunde müssen eine echte Zeile zitieren, und von der KI erzeugte Trace-Schritte müssen zu deinem Repository passen. Anderer KI-Text, etwa die Schilderung unter Attack scenario in Risk & exposure, wird nicht auf diese Weise geprüft. Das Produkt kennzeichnet ihn, damit du ihn selbst gegen den Code-Trace prüfst.
Was Deep Code Analysis einem Befund hinzufügt
Modul 4 hat die Signale an einem Befund vorgestellt. Diese Lektion zeigt, woher sie stammen, damit du weißt, wie weit du jedem einzelnen trauen kannst.
| Kontext | Welche Frage er beantwortet | Wo du ihn siehst |
|---|---|---|
| Betroffener Ablauf | Welche Eingabe, welcher Codepfad und welche Operation sind betroffen? | Code & taint trace |
| Erreichbarkeit und Exposition | Kommt ein Angreifer daran heran, und von wo aus? | Erreichbarkeits-Badge, Internet path, Abschnitt Exposure |
| Schwachstellenklasse | Um welche Art von Schwachstelle handelt es sich? | Zuordnung zu CWE und OWASP Top 10, Compliance & OWASP |
| Priorität | Wie dringend ist der Befund im Vergleich zu allem anderen? | Prioritäts-Score in Risk & exposure |
Datenfluss von Source zu Sink und Taint-Trace
Der Abschnitt Code & taint trace beginnt mit einem Dataflow & Taint Trace: nummerierten Schritten, die nicht vertrauenswürdige Daten von einer Source wie request.form["username"] über die Stationen der Propagation bis zu einem Sink wie db.execute(query) verfolgen. Jeder Schritt trägt ein Herkunfts-Badge:
| Badge | Bedeutung |
|---|---|
| Scanner dataflow | Eine Scanner-Regel im Taint-Modus hat den Schritt erzeugt. |
| AI-verified | AI False-Positive Detection hat den Schritt erzeugt, und der Schritt wurde gegen dein Repository geprüft. |
| AI-inferred (unverified) | Ein Label, das die Trace-Ansicht für einen nicht verifizierten Schritt unterstützt. Falls du es je siehst, behandle den Schritt als Hypothese, nicht als Evidenz. |
Ein von der KI erzeugter Schritt gilt nur dann als verifiziert, wenn seine Datei in deinem Repository existiert und die zitierte Zeile in dieser Datei vorkommt. Besteht die Source oder der Sink diese Prüfung nicht, wird der gesamte Trace verworfen; ein Zwischenschritt, der durchfällt, wird entfernt. Einen vollständigen Scanner-Trace überschreibt die KI nie.
Erreichbarkeitsurteile
| Badge | Worauf es beruht |
|---|---|
| Reachable | Bei Code: „Dataflow from source to sink confirmed.“ Bei einer Abhängigkeit: „Vulnerable symbol is invoked from application code.“ |
| Not reachable | Evidenz dafür, dass der verwundbare Code nicht genutzt wird. |
| Unknown reachability | Weder in die eine noch in die andere Richtung bewiesen. Fahr in der Befundliste mit der Maus über das Badge: Der Tooltip sagt dir, ob es sich um eine transitive Abhängigkeit handelt, deren Nutzung sich nicht bestätigen lässt, oder um einen Auswertungsfehler, der erneut versucht wird. In der Detailansicht des Befunds steht bei fehlendem Urteil Not analyzed yet. |
| N/A | Kein Abhängigkeitsbefund und noch kein Erreichbarkeitsurteil. |
Die Regeln hinter den Badges sind bewusst vorsichtig. Eine Abhängigkeit, die an einer echten Aufrufstelle in deinem Code aufgerufen wird, ist Reachable. Eine Abhängigkeit, die nur importiert oder nur in einem handgeschriebenen Manifest deklariert ist, bleibt Unknown. Auch jeder Fehler, jeder fehlgeschlagene Clone und jede abgebrochene Prüfung ergibt Unknown, nie Not reachable. Ein Code-Befund wird Reachable, wenn AI False-Positive Detection ihn als echt bestätigt und sein verifizierter Trace sowohl eine Source als auch einen Sink enthält.
Je nachdem, welche Prüfung gelaufen ist, kann eine transitive Abhängigkeit Not reachable zeigen (sie kommt nur in einem generierten Lockfile vor und nirgends in deinem Quellcode) oder Unknown (ihre Nutzung ließ sich weder bestätigen noch ausschließen).
Expositionsanalyse
Der Abschnitt Exposure beantwortet eine andere Frage: Lässt sich der Workload hinter diesem Befund aus dem Internet erreichen? Die Expositionsanalyse liest deine Deployment-Konfiguration und listet vier Prüfungen auf, die jeweils zeigen, was sie gefunden haben, oder Not analyzed yet: den Expositionspfad vom Ingress über den Service bis zum Deployment, die Expositionsfläche (Load Balancer, offene Network Policies, ausgehender Datenverkehr), den Sicherheitskontext (privilegierte Container, gemountete Service-Account-Tokens) und ein kontextbezogenes Urteil.
Ob eine öffentliche Route gefunden wurde, siehst du in der Zelle Internet path der Kopfleiste (exposed oder none) und in der Zeile Internet path unter Risk & exposure. Die Statusanzeige oben im Abschnitt Exposure (Exposed, Not exposed, Not analyzed yet) folgt derzeit dem Erreichbarkeitsergebnis des Befunds. Lies sie deshalb zusammen mit Internet path. Solange kein Urteil vorliegt, stellt Run analysis einen neuen Validierungslauf in die Warteschlange.
Exposition verändert die Priorität, nie den Schweregrad. Für eine Sicht über das ganze Repository nutzt du die Zeilenaktion Exposure Map: Assets Repo Scan Exposure Map . Sie zeigt für das Repository Services mapped, Publicly exposed, Privileged und Last analysis, einen Graphen, der das Internet mit den Services des Repositorys verbindet, sowie alle Proven exposure chains.
Erkennungsmodi von AI Scan und die Regel des wortgetreuen Belegs
Plexicus AI Scan, im Produkt mit AI SAST beschriftet, ist statische Analyse auf Basis eines Large Language Models. Die Engine ist als experimentell gekennzeichnet, und Plexicus schaltet sie je nach Plan pro Organisation frei. Vor dem Scan baut AI Scan einen semantischen Index deines Repositorys auf. Danach arbeitet sich ein KI-Agent von der Suche über den Datenfluss und die Auswirkung bis zur Bestätigung im Quellcode vor, statt jede Datei der Reihe nach zu lesen.
Die drei Erkennungsmodi
| Wert für Detection Mode | Wonach er sucht | Wann du ihn nutzt |
|---|---|---|
logic: Geschäftslogik und Zugriffskontrolle (Standard) | IDOR, fehlerhafte oder inkonsistente Autorisierung, Fehler in Geschäftslogik und Berechnungen, Race Conditions, wirtschaftlicher Missbrauch | Du willst die Schwachstellen, die Muster-Scanner übersehen. |
classic: Injection und klassische Schwachstellen | Injection, XSS, Path Traversal, SSRF, XXE, unsichere Deserialisierung | Musterbasiertes SAST ist für das Repository nicht aktiv. |
combined: beide Durchläufe | Beides oben Genannte | Du willst beide Klassen in einem Lauf. |
Der Modus combined lässt beide Durchläufe unabhängig voneinander laufen und führt die Ergebnisse zusammen. Er braucht dafür etwa doppelt so viel KI-Verarbeitung wie ein einzelner Modus. Schlägt ein Durchlauf fehl, wird der Fehler nicht hinter den Ergebnissen des anderen versteckt. Jeder AI Scan-Befund trägt einen Tag mit dem Durchlauf, der ihn erzeugt hat, logic oder classic, sodass du nach Tags filtern oder gruppieren kannst. Taucht dieselbe Schwachstelle in einem Lauf zweimal auf, auch je einmal pro Durchlauf, fasst Plexicus sie zu einem Befund zusammen.
Kein Modus meldet hartcodierte Secrets oder CVEs in Abhängigkeiten, denn dafür sind die Engines für Secrets und SCA zuständig. Die Engine setzt das durch: Befunde außerhalb des Scopes eines Durchlaufs werden verworfen, selbst wenn das Modell sie meldet.
Die Regel des wortgetreuen Belegs
Jeder AI Scan-Befund muss die verwundbare Zeile wortgetreu zitieren. Die Engine gleicht dieses Snippet mit der Datei ab, validiert den Dateipfad und verwirft jeden Befund, dessen Snippet sie nicht findet. Diese Regel zielt auf den häufigsten Fehler bei KI-gestützten Code-Reviews: einen plausiblen Befund über Code, den es nicht gibt.
AI Scan behandelt außerdem Repository-Inhalte und Tool-Ausgaben als nicht vertrauenswürdige Daten. Ein Kommentar wie „security reviewed, skip this file“ ist nur Text in einer Datei, keine Anweisung an den Agenten. Und lässt sich der Index auch nach wiederholten Versuchen nicht aufbauen, wird der Lauf als fehlgeschlagen markiert. Er erscheint nie als sauberes Ergebnis mit null Befunden.
Schwachstellen in Geschäftslogik und Autorisierung
Im Modus logic muss jeder Befund die verletzte Invariante und ein konkretes Missbrauchsszenario nennen. Für die Rechnungs-API aus der ersten Lektion sieht das so aus:
- Invariante: Ein Kunde kann nur Rechnungen lesen, die zu seinem eigenen Konto gehören.
- Missbrauchsszenario: Melde dich als beliebiger Kunde an, frage
/api/invoices/mit fortlaufenden IDs ab und erhalte die Rechnungen anderer Kunden. - Evidenz: die zitierte Zeile
const invoice = await Invoice.findById(req.params.id);
Derselbe Modus deckt das Umgehen von Limits und Kontingenten ab, ebenso Workflow-Schritte, die sich überspringen, wiederholen oder umsortieren lassen, etwa eine Bestellung zu bestätigen, ohne zu bezahlen. Außerdem erfasst er Time-of-Check-to-Time-of-Use-Races (zwei gleichzeitige Abhebungen, die ein Guthaben zweimal ausgeben), Rechenfehler (negative Beträge, Rundung) und wirtschaftlichen Missbrauch (doppelt eingelöste Gutscheine, Erstattungsschleifen).
AI Scan vergibt Schweregrade mit folgender Bedeutung:
| Schweregrad | Typischer AI Scan-Befund |
|---|---|
| Critical | Ohne Authentifizierung ausnutzbar, etwa eine SQL-Injection an einem öffentlichen Endpunkt, oder die Umgehung der Authentifizierung selbst |
| High | Remote Code Execution, SQL-Injection oder Auth-Bypass hinter einer Authentifizierung; IDOR bei sensiblen Daten; Double Spend |
| Medium | XSS, CSRF, Open Redirect, Offenlegung von Informationen, Umgehung von Limits, Rechenfehler |
| Informational | Fehlkonfiguration oder begrenzte Auswirkung |
Die IDOR in der Rechnungs-API legt Abrechnungsdaten für jeden angemeldeten Nutzer offen und würde deshalb typischerweise als High eingestuft.
AI False-Positive Detection: Opt-in, nur lesend, vom Menschen überstimmbar
AI False-Positive Detection prüft Befunde nach jedem Scan und entscheidet für jeden einzelnen, ob er echt ist. Sie erzeugt auch die AI-verified Taint-Traces und die Erreichbarkeitsurteile für Code-Befunde. Vier Eigenschaften bestimmen, wie weit du ihr vertrauen kannst.
Opt-in
Die Einstellung ist standardmäßig deaktiviert, und deine Organisation entscheidet, ob sie sie aktiviert.
Nur lesend
AI False-Positive Detection analysiert eine Kopie deines Repositorys und hat die Anweisung, Quelldateien niemals zu verändern. Sie pusht keine Commits, öffnet keine Pull Requests und greift nicht in laufende Systeme ein. Das Einzige, was sie ändert, ist der Status des Befunds in Plexicus. Vorschläge für Fixes kommen von Remediation, das Modul 7 behandelt.
Streng bei der Frage, was als False Positive gilt
Die KI darf einen Code-Befund nur dann als False Positive markieren, wenn sie einen ausdrücklichen Indikator nennt:
- Die Datei liegt unter einem Pfad für Tests, Fixtures, Beispiele, Demos, Proofs of Concept oder Dokumentation.
- Der markierte Code ist nachweislich toter Code.
- Die Eingabe wird vor dem Sink bereinigt, auch durch sichere APIs wie parametrisierte Abfragen oder Shell-Quoting.
- Die Schwachstellenklasse trifft nicht zu.
Ohne einen dieser Indikatoren bleibt der Befund bestehen. Würde der Login-Handler aus der ersten Lektion db.execute(query, params) mit einer parametrisierten Abfrage verwenden, wäre das ein gültiger Indikator. Ein vages „sieht gut aus“ ist keiner.
Plexicus ergänzt weitere Prüfungen, bevor ein KI-Urteil einen Befund ausblendet. Wie streng sie sind, hängt aber von der Konfiguration ab, betrachte sie also nicht als Garantie. Lass KI-Urteile zu Befunden mit Critical oder High sowie zu erreichbaren oder exponierten Befunden von einem Menschen prüfen.
Eine menschliche Entscheidung hat immer Vorrang
Der Abschnitt AI verdict zeigt bei jedem Befund, der nicht als False Positive markiert ist, Kept as real. Prüf also, ob AI False-Positive Detection aktiviert ist, bevor du das als Bestätigung durch die KI liest. Daneben steht eine Stufe für AI confidence:
- „Low — heuristic rule. Follow the trace before acting.“
- „Medium — corroborated by more than one signal.“
- „High — strong agreement across signals.“
Eine Konfidenz mit der Markierung Estimated wurde aus dem Schweregrad abgeleitet, nicht gemessen. Derselbe Abschnitt zeigt Severity — scanner vs AI. Die KI-Validierung kann einen Schweregrad um höchstens eine Stufe anheben: Aus einem Medium des Scanners kann High werden, aber nie Critical. Sie kann einen Schweregrad auch senken, wenn der Code-Kontext die Auswirkung begrenzt. Vergleich beide Werte, bevor du handelst.
Das letzte Wort hast immer du. In der Detailansicht des Befunds heißt der Button unter der Abschnittsliste Mark as false positive oder, wenn der Befund schon markiert ist, Revert false positive. Die Änderung gilt sofort und schließt außerdem alle offenen Fix-Pull-Requests für den Befund. Ein menschliches Urteil ist in beide Richtungen maßgeblich, und spätere KI-Durchläufe rühren es nicht an. Deine False-Positive-Entscheidung wirkt auch weiter: Spätere Scans in deiner Organisation unterdrücken automatisch dieselbe Regel, wenn sie bei strukturell identischem Code anschlägt. In eine andere Organisation wird sie nie übertragen.
Die Analyse lesen und danach handeln
Dieser ganze Kontext mündet in eine Zahl und eine Entscheidung: woran dein Team als Nächstes arbeitet.
Der Prioritäts-Score
Jeder Befund erhält einen Prioritäts-Score von 0 bis 100. Schweregrad und Auswirkung fließen am stärksten ein. Die Ausnutzbarkeit kommt hinzu, mit dem von der KI bewerteten Wert, falls es einen gibt, sonst mit EPSS. Danach wird das Ergebnis nach Erreichbarkeit und Konfidenz angepasst. Reachable bekommt keinen Abschlag, Unknown einen kleinen und Not reachable einen deutlichen. Niedrige Konfidenz senkt den Score, aber nur bis zu einer Untergrenze. Anschließend erhöht die Expositionsanalyse die Priorität exponierter Workloads und senkt sie bei gering exponierten, ohne den Schweregrad zu verändern.
Im aktuellen Modell erreicht ein Critical-Befund mit Reachable, hohem EPSS und hoher Konfidenz etwa 96. Derselbe Befund mit Not reachable kommt auf etwa 34. Er rutscht in deiner Queue nach unten, bleibt aber drin.
Eine Triage-Routine, die die Analyse nutzt
- Fang mit dem an, was Angreifer erreichen können: Findings Repo All filters Real risk Reachable oder klick in der Zeile Triage auf den Chip Reachable.
- Arbeite dich nach Priorität vor, nicht nach rohem Schweregrad.
- Öffne einen Befund und lies seine Abschnitte der Reihe nach: Code & taint trace (Ist der Pfad echt, und woher stammt er?), AI verdict, Risk & exposure und dann Exposure.
- Entscheide: beheben (Modul 7), zur Laufzeit validieren (Modul 6) oder als False Positive markieren.
Für einen Blick auf die Sicherheitslage öffnest du Dashboard DevSecOps Reachability Split . Das Widget zeigt, wie sich deine Befunde auf Reachable, Unreachable und Unknown verteilen.
Zwei Prüfungen. Eine belastbare Grundlage.
Statische Analyse sagt dir, wo eine Schwachstelle sitzt und warum sie wichtig ist. Sie kann nicht beweisen, dass sich die Schwachstelle in deiner laufenden Anwendung ausnutzen lässt. Das übernimmt AI Swarm Pentest. Im Produkt erscheint er als AI Pentest im Bereich Pentest. Er testet die laufende Anwendung innerhalb eines schriftlich vereinbarten Scopes und folgt einer Regel: Ohne reproduzierbaren Nachweis kein verifizierter Befund.
Die beiden Prüfungen greifen nacheinander. Deep Code Analysis liefert den Kontext. AI Swarm Pentest validiert die priorisierten Pfade. Reviewer sehen die Evidenz und den Scope, und dein Team erhält eine umsetzbare Übergabe.
Zurück zur Rechnungs-API. AI Scan meldet die IDOR als High. AI False-Positive Detection hat sie behalten und req.params.id (Source) bis Invoice.findById (Sink) verfolgt. Sie ist also Reachable, und ihr Internet path zeigt exposed. Damit ist sie ein starker Kandidat für den Scope des Pentests. Reproduziert der Pentest sie, hast du sowohl die Codezeile als auch den Laufzeitnachweis. Wenn du ein Quell-Repository mit dem Pentest verknüpfst, erhält der Agent standardmäßig deinen Code für einen White-Box-Lauf. Pentest-Befunde erscheinen unter Findings App Pentest , mit einem Abschnitt Evidence & attack path anstelle des Taint-Trace.
Keine der beiden Prüfungen ersetzt dein Team. Menschen prüfen die Evidenz und entscheiden, und in der Produktion ändert sich nichts automatisch. Dein Team behält bei jedem Fix die Kontrolle über den Merge.
Das Wichtigste in Kürze
- Ein Mustertreffer sagt dir, dass eine Regel angeschlagen hat. Deep Code Analysis ergänzt den betroffenen Ablauf, die Angabe, ob ein Angreifer ihn erreichen kann, und die Schwachstellenklasse. AI Scan-Befunde und AI-verified Trace-Schritte werden gegen dein Repository geprüft, und anderer KI-Text, etwa das Attack scenario in Risk & exposure, ist gekennzeichnet, damit du ihn selbst prüfst.
- Lies das Herkunfts-Badge an jedem Schritt des Taint-Trace. Ein leerer Trace bedeutet, dass kein verifizierter Pfad vorliegt, nicht, dass der Befund unbedenklich ist.
- AI Scan läuft standardmäßig im Modus
logic;classicundcombinedmusst du ausdrücklich wählen. Befunde ohne wortgetreues Snippet werden verworfen, und Secrets sowie CVEs in Abhängigkeiten bleiben den dafür zuständigen Engines überlassen. - AI False-Positive Detection ist Opt-in und nur lesend. Sie braucht einen ausdrücklichen Indikator, um einen Befund als False Positive einzustufen, Kept as real ist kein Beweis dafür, dass sie gelaufen ist, und deine menschliche Entscheidung hat immer Vorrang.
- Erreichbarkeit und Exposition verändern die Priorität, nie die Sichtbarkeit oder den Schweregrad. Prüf die Evidenz, bevor du dich auf Not reachable verlässt, behandle Unknown als unbewiesen und bestätige die Exposition über Internet path.
- Deep Code Analysis liefert den Kontext und AI Swarm Pentest den reproduzierbaren Nachweis. Erst beide Prüfungen zusammen ergeben eine belastbare Grundlage.
Wissenscheck
Teste dein Verständnis
Übungsfragen zu diesem Modul. Sie zählen nicht für die Zertifizierung. Bestanden ab 4 richtigen Antworten.