Skip to main content
A penetration test is run by a team of agents working the way a human tester does: map the surface, form a hypothesis, then try to prove it. The defining rule is that a result becomes a finding only after it has been exploited.

The three phases

1

Surface mapping

An agent maps the attack surface: routes, parameters, authentication flows, roles, technologies and trust boundaries. In a black box run, any API documentation you attach seeds this. In a white box run, your source provides it. The result is a list pairing each component with the vulnerability classes worth testing against it, sized to the package you chose.
2

Discovery

One agent per item on that list, all running in parallel, each proposing concrete candidates. Nothing here is reported. A candidate is a hypothesis, not a finding.
3

Validation

Each candidate goes to a fresh agent that does not know why it was proposed, which is what stops a plausible story surviving on its own momentum. To become a finding, the candidate must yield a working, minimal and non destructive proof of concept. A known vulnerable dependency instead needs its vulnerable version independently confirmed as present.
Confirmed results are deduplicated and written up as findings.

Check statuses

Each item on the list is a check, and the run page shows where every check stands. Candidates never disappear. As each one is validated the check moves on from Candidates to Proving, then either to Ruled out or, once proven, to its findings’ severities. Select View candidates on a check to see every candidate and what became of it.

Re-running on the same target

Every run also re-checks the findings still open on that target. A finding that is proven again exactly as reported stays the same finding, unchanged except for when it was last seen, rather than duplicated. When the original proof no longer works but the same weakness can be exploited another way, the new way is recorded as a new finding linked to the original, and the original is resolved once its own re-check finishes without reproducing it, so a fix that worked never reads as one that did not. A finding whose issue can no longer be reproduced is resolved automatically at the end of the run, with a note saying it was re-checked and could not be reproduced. Reopen it if you believe it is still exploitable. A finding you had already resolved or accepted is left closed; if the same kind of issue reappears later, it is recorded as a new finding with its own history.

Vulnerability classes

Injection and execution

SQL and NoSQL injection, command execution, server side template injection, XML external entities, insecure deserialization, prototype pollution.

Access control

Insecure direct object references, broken function level authorization, mass assignment, authentication and token handling, cross site request forgery.

Server side

Server side request forgery, path traversal, request smuggling, header injection, open redirect, subdomain takeover, information disclosure.

Client and content

Cross site scripting, insecure file upload and download handling, and browser origin isolation such as postMessage validation and iframe sandboxing.

Logic

Business logic abuse and race conditions, including multi step attack paths that chain smaller issues.

AI surfaces and supply chain

Prompt injection against AI features, agentic system and MCP tool security, and known vulnerable components confirmed present.

Engagement types

The engagement is derived from what you configured, and is cumulative. Every finding records the engagement and package that produced it, so a target tested black box once and white box later keeps both results distinguishable.

Authorization and safety

A target cannot run until domain ownership is verified with an organization specific value you publish by DNS record or hosted file. The verification value is unique per organization, so proof of control cannot be transferred. A run against an unverified target is refused.
Every proof of concept must be minimal and non destructive. The package you choose bounds both how deep the testing goes and how much traffic it generates. Staying on target is enforced by the network, not only by instruction. Each target’s runs work in an isolated environment of that target’s own, removed when the target is. Its network reaches the verified target, the public sources its testing tools are installed from, and the callback service used to detect blind vulnerabilities. A request to any other host fails, so a run cannot reach another target, including one being tested at the same time. A login you save for an application is only ever sent to that application’s own hosts, and during a run only to its verified ones.

Evidence on a finding

Vulnerability class, affected endpoint or package, CVSS vector and derived score, CWE, the proof of concept, supporting evidence, and the engagement and package. For a white box finding traced to source, the repository, commit and file are recorded as well; for uploaded source code, the upload’s name, a checksum of the upload, and the file within it. Each finding is scored with both CVSS 3.1 and CVSS 4.0, from the same proven impact. Severity follows the CVSS 3.1 base score. Each finding also lists the OWASP ASVS 5.0 requirements it violates, so you can read the report against the standard. A few kinds of issue, such as subdomain takeover, prompt injection against an AI feature, and agentic system and MCP tool weaknesses, have no ASVS requirement, so their findings list none. Both appear on the finding and in the PDF report, which comes with Deep runs. Findings recorded before CVSS 4.0 and ASVS were added show only CVSS 3.1 until a later run proves them again.

Scheduling

Daily, weekly or monthly, per target and per engagement and package combination. Configuration changes apply to future occurrences. Runs already in flight keep the configuration they started with. See Set up a pentest.