AI Security

Exploit Path Synthesis: Griffin AI vs Mythos

Finding a bug is not the same as proving it is exploitable. How Griffin AI synthesises concrete exploit paths and why pure-LLM scanners rarely get past the sketch stage.

Shadab Khan
Security Engineer
6 min read

A finding without an exploit path is a report asking someone else to do the hard work. The security engineer who receives it still has to figure out whether the attacker can actually reach the sink, what input will light it up, and whether any framework-level defence sits in the way. If the tool's answer to "is this exploitable?" is a shrug or a textbook paragraph, the tool has given you a lead, not a finding. Exploit path synthesis is the step that turns a lead into something a reviewer can accept or refute in minutes rather than hours.

Griffin AI and Mythos-class tools both claim to produce exploit paths. They do not mean the same thing by the phrase.

The minimal specification

An exploit path worth the name has four fields. A source description concrete enough to be weaponised (HTTP method, endpoint, authentication state, headers, body schema). A trace through the program that names the relevant functions and files in the order data traverses them. A set of constraints on the attacker-controllable input that, if satisfied, cause the sink to fire. And a witness, either literal or symbolic, that satisfies those constraints. Anything less is an exploit sketch.

Griffin produces the full specification for most injection-class, deserialisation, and SSRF findings. The source is described at the HTTP layer with concrete field names the reviewer can paste into a curl command. The trace cites the actual functions in the actual files. The constraints are expressed as conditions on the input, often with a concrete example that satisfies them. The witness is not always a byte-for-byte payload, especially for bugs where the exact byte sequence depends on runtime state, but it is usually close enough that a penetration tester can finish the last 10 percent in a few minutes.

Mythos-class tools produce something much thinner. The "exploit path" is typically a sentence or two of English describing the conceptual exploit. It might say "an attacker could send a crafted JSON payload that includes a malicious deserialised object" without naming the endpoint, the field, the serialiser, or the constraint that bypasses the type check. The reader is being given the premise for an exploit, not the exploit.

Why synthesis is hard without grounding

The difficulty of synthesising a concrete exploit path is that the constraints are interdependent. The attacker has to satisfy the route matcher, the middleware chain, the input validators, and the serialisation layer, all before the input reaches the vulnerable sink. Each of those stages has its own constraint: a regex on a header, a JSON schema on a field, a CSRF token check, a mutual authentication assertion. A free-running language model has no structured representation of those constraints. It infers them from prose comments or variable names and fills in the gaps with plausibility.

Grounded synthesis is tractable because the engine has already modelled the constraints. The route matcher is a concrete pattern. The middleware chain is a concrete sequence of function calls. The JSON schema has been parsed. The CSRF check has been identified as either reachable on this route or not. When the model is asked to synthesise an input that satisfies the whole chain, it is solving a constraint system the engine built, not a constraint system it imagined.

The 2024 research from the Center for AI Safety on program-aware exploit generation (their ICML paper on "Grounded Exploitation" is the clearest write-up I have read) formalises this distinction. The synthesis success rate jumps sharply when the model is given structured constraints rather than asked to enumerate them from code reading. Griffin's architecture is effectively an industrial implementation of that finding.

Where synthesis fails honestly

Some bug classes resist synthesis even with grounding. Timing-sensitive races need runtime state the static pipeline cannot represent. Memory-corruption bugs require heap layout information that only a dynamic run can supply. Logic bugs in authorisation often depend on data values that the engine does not know (who owns which resource, which roles are configured in this tenant). Griffin's honest behaviour on these classes is to emit a partial exploit path with the missing constraints flagged explicitly, rather than to invent values. I would rather have a finding that tells me "the exploit requires a race window of less than 8 ms, I cannot demonstrate this statically" than a finding that fabricates a timing witness.

Mythos-class tools almost never flag missing constraints. They narrate through the gap, producing an exploit path that sounds complete because it is grammatically complete but is factually unanchored. A reviewer has to mentally audit every claim to figure out which ones are grounded and which are fabricated.

Triage as a function of synthesis quality

My triage time per finding is roughly proportional to how much of the exploit path I have to reconstruct by hand. When the tool gives me the full specification with a concrete witness, I spend five to ten minutes confirming it and either accepting or downgrading. When the tool gives me an exploit sketch, I spend thirty to sixty minutes reconstructing the rest, and I am often doing it twice because the sketch steered me wrong the first time.

On a 300-finding batch, the difference compounds to the level of a full engineering week. Exploit path synthesis quality is not a cosmetic feature; it is the primary determinant of how many findings per week a triage team can realistically process.

What a good witness looks like

A witness for a CWE-918 SSRF against an internal metadata endpoint should specify the exact HTTP request (method, path, headers, body), the redirect chain that carries the request from the attacker-facing endpoint to the internal sink, and the response shape that confirms the sink fired. Griffin's SSRF witnesses in my experience typically include the curl one-liner, the intermediate DNS state if relevant, and a note on which response indicators would confirm successful retrieval of the metadata response. A Mythos-class "witness" for the same bug is usually a sentence saying "the attacker supplies a URL pointing to 169.254.169.254," with no detail on how the URL survives whatever validation the application does.

How Safeguard Helps

Safeguard surfaces Griffin AI's full exploit path specification for every finding that supports one: source, trace, constraints, and witness. Reviewers can reproduce the exploit in a sandboxed test environment directly from the UI, and the tool captures the reproduction result so future reviewers do not have to repeat the work. Findings without a full witness are clearly marked, so no one is tricked into assuming a synthesis is complete when it is not. The result is a triage queue where reviewers accept or downgrade findings from evidence, not from prose.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.