Skip to main content

Security scanning

Agents fail in ways ordinary code doesn't. A prompt can be hijacked by text the agent reads. A tool can be talked into sending email to an attacker. A Python tool can reach a URL it was never meant to.

Convolution Labs scans your agents for these problems while you're still building — not after an incident. Run a scan from Dashboard → Security, or from an individual agent's security tab.

Two kinds of scan

Static scan

Analyses the agent's graph without executing anything: nodes, edges, configuration, prompts, and the source of any custom Python tools. It's fast, deterministic, and free.

Nine checks run today:

CheckWhat it catches
static.injection.unsanitized_inputUser input flowing into a prompt with no sanitization
static.injection.indirect_tool_feedbackTool output fed back into a prompt — the indirect injection path
static.disclosure.secret_in_promptCredentials or keys hardcoded in a prompt
static.ssrf.unfiltered_httpHTTP tool calls with an attacker-influenceable URL
static.agency.email_from_public_inputSend-email reachable from public input
static.output.unvalidated_sinkModel output flowing into a sink without validation
static.sandbox.python_presentCustom Python present — flags the expanded attack surface
static.dos.unbounded_iterationsLoops with no iteration ceiling
static.dos.unbounded_delayDelay nodes with no bound

Dynamic scan

Actually attacks your agent — through its normal execution path, using the same queue and worker as a real run. Each probe plants a server-generated canary and a detector inspects the output and trace for evidence the attack landed.

ProbeAttack
dynamic.injection.canaryInjects instructions and checks whether the agent obeys them
dynamic.disclosure.prompt_leakTries to make the agent reveal its system prompt
dynamic.jailbreak.refusalTests whether safety refusals can be bypassed
dynamic.ssrf.canaryTries to make the agent fetch an attacker-chosen URL
note

Dynamic scans execute your agent, so they consume credits for any tool calls and use your LLM provider keys — exactly like a normal run. They only ever target agents you own.

Findings

Every finding carries:

  • Category — one of eight, mapped to the OWASP LLM Top 10 and NIST AI RMF
  • SeverityCRITICAL, HIGH, MEDIUM, LOW or INFO
  • Evidence — the specific node and snippet that triggered it
  • Remediation — what to change

Categories

CategoryMeaning
PROMPT_INJECTIONUntrusted text steering the agent's behaviour
SENSITIVE_INFO_DISCLOSURESecrets or system prompts leaking out
INSECURE_OUTPUT_HANDLINGModel output trusted by a downstream sink
EXCESSIVE_AGENCYThe agent can take actions beyond what it should
SSRFServer-side request forgery through outbound calls
SUPPLY_CHAIN_SANDBOXRisk introduced by custom code and dependencies
UNBOUNDED_CONSUMPTIONLoops or delays with no ceiling — cost and availability
JAILBREAKSafety constraints bypassed

Triage

Each finding has a status you control:

  • OPEN — counts against your score
  • ACKNOWLEDGED — seen, accepted for now
  • RESOLVED — fixed
  • FALSE_POSITIVE — not applicable to your case

Only OPEN findings affect the score, so triaging honestly raises it.

The security score

A deterministic 0–100 score, explainable rather than a black box. Start at 100 and subtract a fixed penalty per open finding:

SeverityPenalty
CRITICAL−40
HIGH−20
MEDIUM−8
LOW−3
INFO0

The score floors at 0, and maps to a grade:

ScoreGrade
90–100A
75–89B
50–74C
25–49D
0–24F

Because the model is fixed, you can always explain a score — "−40 from one critical finding" — and see exactly what fixing an issue would recover.

Reference

Dashboard → Security → Reference documents every category: what the weakness is, how it shows up in this platform specifically, an illustrative example payload, and which checks detect it. Both the OWASP LLM Top 10 and NIST views render from that catalog.

Limits

Scans are rate-limited to 10 per hour per user.