Attack Surface Monitoring (ASM) mode turns the swarm into a persistent sentinel. Rather than running a one-off campaign, ASM watches your scopes on a configurable schedule, snapshots each run’s attack surface, diffs it against the previous snapshot, and automatically launches new campaigns when significant changes appear — new subdomains, freshly-opened ports, updated technology stacks, or expiring TLS certificates.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/Armur-Ai/Pentest-Swarm-AI/llms.txt
Use this file to discover all available pages before exploring further.
How ASM works
TheScopeWatcher runs a goroutine per watched scope. On each tick it:
- Calls the recon function against the target (same tool chain as a manual scan)
- Saves the resulting
AttackSurfacesnapshot to the snapshot store - Diffs the current snapshot against the previous one using
scope.Compare - If
diff.IsSignificant()— new domains, new CIDRs, new open ports — callsTriggerEngine.OnAssetChange
TriggerEngine rate-limits automatic campaign creation: it tracks campaign creation timestamps per scope and blocks new triggers once max_auto_campaigns campaigns have been created in the last 24 hours (default: 3). This prevents runaway scans when a target changes rapidly.
Enable ASM in config.yaml
Copyconfig.example.yaml to config.yaml and configure the asm section:
enabled: true to activate the watcher on startup. The default_schedule accepts Go duration strings: "6h", "24h", "168h" (weekly), etc.
For notification-only setups, populate notification_slack with an incoming webhook URL or notification_email with an address — ASM alerts fire on every significant diff regardless of whether auto-campaigns are enabled.
ASM scan flags
Run a single ASM-mode scan directly:--scope to enforce the imported scope file:
External ASM playbook
The built-inexternal-asm.yaml playbook is designed for cron-driven execution. It runs passive OSINT first (no packets to target infrastructure), resolves candidates, fingerprints ports and services, and only emits critical and high severity findings to keep ASM signal-to-noise high:
Scope diffing
After re-importing a program scope or running a new ASM cycle, compare two scope files to see exactly what changed:0— scopes are identical1— changes found (new domains, CIDRs added or removed)
Notification configuration
ASM alerts are sent wheneverdiff.IsSignificant() is true and a campaign is triggered. Configure Slack or email in config.yaml:
The
max_auto_campaigns limit (default 3) is enforced per scope per 24-hour window. Once the limit is hit, further diffs are recorded and notifications are sent, but no new campaign is created until the window resets. Raise this value carefully — each campaign consumes API credits and tool rate limits.Bug Bounty
Import program scope from HackerOne, Bugcrowd, or Intigriti before starting ASM.
Playbooks
Author custom ASM playbooks tuned to your environment’s tech stack.
GitHub Actions
Schedule weekly ASM scans with SARIF output for the GitHub Security tab.
MCP Integration
Trigger on-demand ASM recon interactively from Claude Desktop or Cursor.