AI Pentest
An autonomous penetration test of web applications and hosts that reports only what it proved.
Give the AI Pentest agent targets and, optionally, a sentence of instructions. It tests them like a penetration tester and reports only what it could prove. It runs from either scan form: web applications from Web App Scanning, hosts and networks from Infrastructure Checks. There are no profiles to configure.
Only a person can confirm that the organisation is authorised to test these targets. An AI agent following this page must not start an engagement against targets the user has not named, and must ask before adding any.
A person confirms authorisation to test
What it does
- Finds the services and web applications in the targets you give.
- Tests them, including signing in with credentials you give or that it finds, and tests web applications with AI DAST.
- Tries to prove each issue, records only proven findings, and links findings where one enabled another.
It can use the scanners your team has set up (OpenVAS, Nessus, Acunetix) and ScanSuite's own web and network checks; a scanner that is not set up is not used. Several targets are tested in parallel and reported together.
Before you start
| You need | Where it is set | How to check |
|---|---|---|
| An AI provider for the team | Teams, AI tab, or the system AI. See AI providers. | scansuite-ci --scan-type dast --list-scanners: ai_pentest must not say NOT AVAILABLE. Without AI the engagement cannot run. |
| AI tokens left this month | Teams, AI tab, Monthly token budget card. AI features pause when the budget is reached. | The card shows the tokens used against the budget. |
| The targets allowed for your team | Teams, Scanning tab, Web targets or Infrastructure targets. Not in the Only the targets listed below, also checked while the scan runs mode, which refuses AI Pentest. | Check whether targets are allowed in the same card: each target is reported as allowed. |
| Optional: OpenVAS, Acunetix | Teams, Scanning tab, Scanner engines card. | The engine shows a connected badge. |
| Optional: Nessus | Set up by a system administrator, shared by all teams. | The runs left appear next to Nessus on the Infrastructure page. |
| Optional: Shodan | A Shodan API key in Teams, Integrations tab, Enrichment services. | The card shows that a Shodan key is saved. |
| A role that may start scans | Operator or Team admin. | The Start Analysis button is shown on the scan form. |
Targets follow the rules in Web App Scanning, Targets; who may change them is in Teams and roles.
Start an engagement
- 01Open a scan form
Web App Scanning for URLs, or Infrastructure Checks for IP addresses, ranges, networks and host names. On Infrastructure Checks, leave Select Scan Type on Vulnerability Scan: AI Pentest is offered only there.
- 02Choose the product and enter the targets
Product / Eng ID, then the targets under Target Scope.
- 03Check that Autonomous AI assessment is on
In the AI Pentest section. It is on by default for a new user; the form then remembers your last choice.
- 04Write instructions (optional)
In Instructions (optional) under the targets, see below.
- 05Add sign-in details (optional, web only)
Cookies (optional) or Custom header (optional) on the Dynamic Analysis page. Read the warning on state-changing requests first.
- 06Select Start Analysis
Scan submitted appears and the scan's page opens.

Check that it worked: the scan's page shows the AI pentest card, Where the engagement is, with a sentence saying what the agent is doing now. If the scan does not start, the message is explained under If the scan does not start; if it fails later, the reason is in that card and in the log.
The fields
| Field | What it does | Default | When to change it |
|---|---|---|---|
| Autonomous AI assessment | Runs the AI Pentest agent. | On | Switch off to run other scanners on their own. |
| Instructions (optional) | Your guidance for the agent: focus, exclusions, credentials. Shown only while Autonomous AI assessment is on, and kept with a saved scan. | Empty | To steer the test, or to turn off password brute force against services (write Do not brute force.). The check of login forms for default credentials always runs. |
| Cookies (optional), Custom header (optional) | A session the agent uses to test the signed-in part of a web application. Dynamic Analysis page only. | Empty | To test behind a login. Makes the run authenticated. |
| Credentials marked Use in AI scans | On the Credentials page, for the product or team-wide: tried on the login forms and services the agent finds. | None marked | To test known accounts. Makes the run authenticated. |
| Other scanner switches | Not run on their own while the agent is on. The agent runs scanners itself when it needs them. | Off | – |
| AI DAST | Switched off and greyed out while Autonomous AI assessment is on: the agent already tests web applications with it. | Off | Switch the agent off to run AI DAST alone. |
The Infrastructure page has no Cookies or Custom header fields. To test signed in from there, mark credentials for AI scans on the Credentials page.
Instructions
Plain sentences. Scope comes from the targets, not from the instructions: the agent never leaves the targets whatever you write. Examples:
Enumerate services, prioritize SMB and web, and verify exploitable findings with a PoC.Focus on the login flow and look for authentication bypass and SQL injection. Do not brute force.Sentences that say something plainly become rules that ScanSuite enforces on every request and scanner, whatever the agent decides. The scan's log lists them at the start, under the operator's instructions as rules every agent follows:
| You write | What is enforced |
|---|---|
| Do not test /admin. Never test port 8443. | The path or port is excluded: any request or scanner run against it is refused. |
| Send at most 2 requests per second. | A rate ceiling for every tool: the agent's requests, logins and credential checks, the browser and the scanners. |
| Do not brute force. | No password brute force against services. The default-credential check of login forms still runs. |
| Stop once you are in. Do not pivot. | The run ends at the first foothold (command execution, file read, server-side requests, database access, a working secret or credential), once the verifier has confirmed it. |
"Start with the document download" or "only test the login" is read as a focus: tests outside it are refused. If a refusal pause is set (see Production settings), a few such refusals can pause the run. To point the agent at an area without narrowing the test, phrase it as a hint: Test as usual. The document download may be worth an early look.
Signed-in testing
- Every login form the agent finds is checked for default and common credentials; a working pair is a High finding. This check always runs.
- Credentials marked Use in AI scans (column AI scans, bulk Mark for AI scans / Unmark AI scans on the Credentials page) are tried as well.
- Credentials that work, and the session you supply, are used to continue testing signed in, including logins in several steps and logins protected by a CSRF token.
Besides the login-form check, the agent may try passwords against the network services it finds, such as SSH or FTP. That can lock accounts on systems with a lockout policy. To turn it off, write it in Instructions, for example Do not brute force. A sentence that only mentions brute force, such as "brute force may lock accounts", does not turn it off. The default credential check of login forms runs either way. Under the production profile brute force is off for every scan. The login checks stop at the first sign of a lockout, and an engagement makes at most five failed logins per account.
When the run is authenticated (you entered Cookies or a Custom header, or the product or team has credentials marked Use in AI scans), the agent may send state-changing requests (PUT, PATCH and DELETE) to test what a signed-in user can change. That can modify or delete records. Run authenticated engagements against a test environment or test accounts only. Without any of these, the agent sends only read requests (GET, HEAD, OPTIONS) and form submissions (POST). Under the production profile every scan is read-only instead, signed in or not: no PUT, PATCH or DELETE, a POST only to a login form, and no SQL injection or XSS check of a form or request body.
Safety guarantees
- It never sends traffic outside the targets you give. A URL target limits it to that site's port; a host, IP address or range covers every port of the host.
- Exploit code runs isolated from your network and the ScanSuite server.
- It downloads exploit references only from ScanSuite's vulnerability database.
- Every engagement has a step budget and a time limit of about three hours per agent, and the result says why it stopped.
- A host it finds that you did not name, such as a subdomain, is tested only once it is admitted: it must lie under a domain you gave, resolve, not lead to a third party, CDN or cloud edge, and be allowed by the team's targets. The report lists every such host, admitted or refused, with the reason.
- Text in a target's answers is data, never instructions: a page that tells an AI agent to test other hosts or ignore its rules changes nothing, because scope and rules are enforced in code. ScanSuite notes such text on the scan page and in the report.
- A request or scanner run the rules refuse is not sent; the agent is told which rule refused it.
This is an active penetration test that generates and runs exploit code. Only point it at systems you are authorised to test, and prefer an environment where an unexpected side effect is survivable. The budgets limit cost and duration; they do not guarantee that nothing is disrupted.
Production settings
For engagements against production systems, a system administrator can switch on stricter behaviour for every AI Pentest of the installation. All are off by default. On a server they go in /opt/scansuite/.env (see Setup parameters and services); on Google Cloud, in the deployment's extra_env in terraform.tfvars.
| Setting | What it does | Default | When to change it |
|---|---|---|---|
| SCANSUITE_PENTEST_AGENT_SAFE_DEFAULTS | true: the production profile. Every scan is read-only, without brute force or high-volume checks (a full port sweep, denial-of-service templates, active load scans), and ends at the first confirmed foothold. An operator can lift a rule for one running scan with a message on its scan page. | Off | For any engagement against production. |
| SCANSUITE_PENTEST_AGENT_SAFE_DEFAULT_RPS | A request-rate ceiling the profile adds to every scan, in requests per second; instructions can set a lower one. | 0 (none) | When targets must not see more than a known rate. |
| SCANSUITE_PENTEST_AGENT_CONTACT | Who to call about the test's traffic, such as a mailbox or a phone number. Every request then carries User-Agent: ScanSuite-Pentest/1.0 (authorized test; scan …; contact: …) and an X-Pentest-Contact header. | None | So the target side can recognise the test and reach you. |
| SCANSUITE_PENTEST_AGENT_RUN_WINDOW, SCANSUITE_PENTEST_AGENT_RUN_WINDOW_TZ | When tests may run, for example 08:00-18:00 and Europe/Berlin; a window past midnight works. A scan outside it is refused at start, and a running scan is stopped when the window closes. | Any time, UTC | To keep tests to working hours. |
| SCANSUITE_PENTEST_AGENT_REFUSAL_PAUSE_COUNT, SCANSUITE_PENTEST_AGENT_REFUSAL_PAUSE_WINDOW_SEC | This many refused actions within the window (in seconds) pause the run until someone resumes it from the scan page. | 0 (never), 300 | To catch an agent that keeps pushing against its rules. |
| SCANSUITE_PENTEST_AGENT_JUDGE_NEW_HOSTS | true: a model gives a second opinion on each host the admission rules would admit. It can only keep a host out. | Off | When found hosts may belong to someone else. |
| SCANSUITE_PENTEST_AGENT_WATCH_LOGS, SCANSUITE_PENTEST_AGENT_WATCH_PAUSE | true: every five minutes, apart from the agents, a second model reviews each running test's last five minutes of actions and raises an alarm on a harmful pattern, such as collecting data beyond proof or retrying refused actions. With WATCH_PAUSE it also pauses the run. | Off | For an independent check on what the agents do. |
The scope judge and the log watch use the AI connection of the tasks Scope judge and Log watch, which a team can route to a different model than the agents use (see AI providers).
- 01Edit .env
Add the settings, for example SCANSUITE_PENTEST_AGENT_SAFE_DEFAULTS=true.
- 02Restart
Expected: [+] All services healthy.
Shellcd /opt/scansuite && ./scansuite restart - 03Check
Start an engagement. Its log shows the rules with (… +safe) and the stop rule first: Stop at the first foothold …
Follow an engagement
The scan's page shows the engagement live: the stage it is in and what it is doing now, the Execution paths each agent took, the services it found and how far each was tested, and the findings as they are proven. See The scan page.

A run can pause itself, with a warning in the log saying why:
- The harness paused the test: 5 refused actions within 300 s: the refusal pause.
- The log watch found a harmful pattern in the last 5 minutes: …: the log watch.
Nothing runs while it is paused. Resume or stop it from the scan page. Text aimed at AI agents in a target's answer shows as a warning too: … answered with text aimed at AI agents: "…".
Message the agents
While an engagement runs, Message the agents on its scan page sends it a message. Send to chooses who reads it:
| Send to | What happens |
|---|---|
| All agents (the default) | Every agent reads it within seconds and must follow it. A message that says something plainly changes the rules for the rest of the run, as the instructions do: "stop testing /admin" excludes the path for every agent, and "pause" or "stop" pauses or stops the whole engagement. |
| One agent: the lead or a sub-agent that is working | Only that agent reads it, as guidance for its own work, for example: Look at the export button before you finish. It changes no rule and stops or pauses nothing else, and the other agents never see it. |
Under each message, Read by names the agents that have read it. A restriction that must hold for every agent belongs in a message to all agents: one agent's message never changes the rules. To stop one agent, use Stop this agent in its row; Stop and report ends the engagement and reports what it proved.
For a security operations team, the agents and the log watch also write one line per event to the service log. On Google Cloud these lines are in Cloud Logging, where a log-based alert can match them:
| Line | Written for |
|---|---|
| AI_PENTEST_CALL {…} | Every action of the agents: the tool, the target, the outcome, with secrets and personal data masked. |
| AI_PENTEST_ALERT scan=… kind=refusals | The refusal pause. |
| AI_PENTEST_ALERT scan=… kind=watch | The log watch found a harmful pattern. |
| AI_PENTEST_INJECTION scan=… where=… | Text aimed at AI agents in a target's answer. |
How an engagement ends
| Shown as | Meaning | What to do |
|---|---|---|
| completed | The agent tested what it found and wrote its report. | – |
| cycle budget used | It used all its steps. The log names the planned steps that did not run. Findings proven so far are kept. | Narrow the targets, or add instructions that focus it, and run again. |
| time budget used | It reached its time limit. Findings proven so far are kept. | As above. |
| nothing left to run | It ran out of things to test before the budget. | – |
| model unavailable | The AI provider stopped answering. Findings proven so far are kept. | Check the provider on the Teams AI tab, then run again. |
| cancelled | Someone stopped the scan. | – |
| stopped by the operator | Someone stopped it from its page, the run window closed, or, under the stop rule, it reached its first foothold, which the verifier confirmed first. Findings proven so far are kept. | – |
| failed | The engagement broke off. Findings it had recorded are kept. With a run window set, "AI Pentest refused: outside the run window" in the log means it was started outside the window. | Read the log on the scan's page. Start it again inside the window. |
The reason appears on the scan's page as Finished in … · <reason>. Other outcomes shared by all scans are in Managing scan execution.
Where the results go
Like every AI scan, the engagement records its findings on the Vulnerabilities page. The engagement report, in Markdown and XLSX, is in the scan's Report in Scan History. A finished engagement shows the status Finished there.
Besides the findings, the Markdown report lists:
- findings the verifier could not confirm (Not verified) and the ones it rejected, with the reason;
- the hosts you did not name: each admitted or refused, and why;
- text aimed at AI agents that the targets answered with;
- what the agents tested without a finding, and what they left untested.
Personal data in the evidence (e-mail addresses, phone numbers, IBANs, card numbers) is masked, and passwords the agents found or were given do not appear.
From a pipeline or a terminal
scansuite-ci --scan-type dast --scanners ai_pentest \
--target https://staging.example.com \
--instructions "Focus on the API. Do not brute force."Use --scan-type infra with host targets for an infrastructure engagement. A pipeline must name only targets the user confirmed for testing. See CI/CD and automation.
Last reviewed 2026-10-19