Swarmchasing Report a swarm

4. Indicators

On this page
  1. FM-4.1 Grading records
  2. FM-4.2 Rule anatomy
  3. FM-4.3 The SC-T tactic taxonomy
  4. FM-4.4 Default tactics by rule kind
  5. FM-4.5 Artifact families
  6. FM-4.6 Cross-walk to MITRE ATLAS and ATT&CK
  7. FM-4.7 Rule-writing standard
  8. FM-4.8 Rule versions and pinning
  9. FM-4.9 Benchmark targets and declared testing
  10. FM-4.10 Interaction signals
  11. FM-4.11 Independence groups and the context cap

FM-4.1 Grading records#

Indicators are rules kept as data, versioned, and shared by every tool that grades records. Before rules run, each recorded URL is unwrapped: relays, translate proxies, URL-valued parameters, data: URLs and base64 values are peeled into layers, so rules see every hop and the real target (methodology).

  • Each rule counts at most once per record, whichever layer it matched.
  • A record's score adds the weights of the distinct rules that fired. Rules that read the same artifact are one piece of evidence, not several, and count once per independence group; context kinds together count at most one below the suggestive threshold (FM-4.11).
  • The score is graded against two thresholds into a tier (FM-1.5). A rule marked significant puts a record in the top tier on its own.
  • One relay hit is never enough. No rule for something ordinary users do may reach the suggestive threshold alone. A relay, a cache-buster or a self-identification needs a second, independent indicator, and that indicator is not another context hit (FM-4.11).
  • A tier measures payload and tool use. It says what a record contains, not whether an agent sent it or whether the agent went beyond its task. Those are separate questions with their own evidence (chapter 15).

FM-4.2 Rule anatomy#

FieldMeaningToolkit
idStable dotted name, <kind>.<name>. Reports cite it.yes
kindThe family of thing matched: relay, carrier, exploit, agent marker, callback channel, header, outcome, anti-bot, infrastructure, self-identification, cache-buster.yes
targetWhat the rule reads: a layer's host, a layer's decoded text, parameter names or values, headers, user agent, final URL.yes
patternHost suffix, or a case-insensitive regular expression.yes
checkA named test a match must also pass, for what a regular expression cannot say.repeated_token, ua_platform_mismatch
weightContribution to the score. Low for anything ordinary clients also do.yes
significantA single match puts the record in the top tier. Reserved for unambiguous payloads and fingerprints.yes
linkThe matched text becomes a link feature. Only for values one operator would hold.yes
tacticThe SC-T tactic the match is evidence of (FM-4.3).one of tactic or artifact
artifactThe match only shows a model wrote the request (FM-4.5).one of tactic or artifact

A check exists because some shapes need counting or comparing. repeated_token (on a parameter value) wants one word of three characters or more, or a phrase of two or three words, repeated five or more times in a row (FM-4.5); short refrains and one long run of a letter fail it. ua_platform_mismatch (on a Sec-CH-UA-Platform header) passes when the header's platform hint names another desktop system than the request's user agent, the mark of a browser presenting a borrowed user agent; mobile systems are never compared.

Toolkit: each rule in the rules file names its tactic (T1 to T7) or is marked artifact, and a file naming an unknown tactic, or the cluster-level T8 or T9, fails to load. A check on a rule whose target is not the one the check reads, or an unknown check, also stops the file loading. Evaluation groups recall by the tactics of the rules that fired (statistics). The STIX run object derives its tactics from each rule's kind, using the defaults in FM-4.4.

FM-4.3 The SC-T tactic taxonomy#

Tactics say what an agent was doing, independent of how a rule detected it. Reports and notices group evidence by tactic.

IdTacticWhat it isTypical evidence
SC-T1Task retrievalFetching content for the task, often through readers and relays. Usually benign on its own.Relay and reader URLs to the task's data sources; search queries.
SC-T2Tool escalationReaching for a more capable tool than the task needs: code execution, request shaping, sandboxes.Echo services turning a GET into a POST; programs in data: URLs, base64 paths or playground share links.
SC-T3Access-control circumventionGetting past a block, challenge or rate limit by changing origin or solving the gate.Relays and scan services after a block; anti-bot token generation; CAPTCHA-solver services; bot-challenge outcomes followed by retries.
SC-T4Vulnerability probingTrying inputs designed to make the target misbehave.Injection, traversal, XSS and template payloads; probe chains; recon openings to sensitive files.
SC-T5Account and identity acquisitionCreating accounts or identities to get access.Sign-up requests; disposable mail; stock or fabricated identities.
SC-T6Credential reuseUsing a credential the agent obtained rather than was given.The same redacted secret hash across targets or runs; tokens in query strings.
SC-T7Callback and side channelsSending data or signals to a place the agent's operator can read.Webhook inboxes, request catchers, notification topics, pastes, out-of-band interaction services.
SC-T8Off-task targetsRequests to hosts outside the evident task. Needs the task context; one record cannot show it.A data-gathering run that turns to government login pages.
SC-T9Inter-agent coordinationAgents exchanging information or dividing work. Defines a swarm (FM-1.3).One run reading what another wrote to a shared artifact; disjoint target lists from runs started together; hand-offs.

SC-T8 and SC-T9 are cluster- and fleet-level judgments. They are reported as Inference (FM-7.6) with the evidence listed, never as a rule match. The signals for SC-T9 are in FM-4.10.

FM-4.4 Default tactics by rule kind#

The tactic a rule of each kind is evidence of when nothing more specific is known. A rule's own tactic may differ where its match shows more, and a report cites the rule's own.

Rule kindDefault tacticNote
relaySC-T1SC-T3 when it follows a block or challenge on the same target.
carrierSC-T2
exploitSC-T4
anti_bot, outcomeSC-T3An outcome rule records where a scan ended, such as a challenge page.
exfilSC-T7
cache_busterSC-T1Weak; defeats caches, not controls.
agent_marker, headernoneArtifacts (FM-4.5), not actions.
self_id, infranoneAttribution evidence (chapter 7).

FM-4.5 Artifact families#

Artifacts are traces of how an agent was built, not of what it tried to do. They help separate agents from people and link runs, but each is shared by many unrelated clients, so most never score or link.

FamilyWhat it isRole
Model-output residueText a model wrote around a URL: Markdown link or code syntax, unfilled placeholders, chat-reply openers, doubled schemes.Scores, low weight; never links. People pasting chatbot answers leave the same.
Tool-call residueFunction-call markup, tool-call JSON or argument objects left in a request.Scores, low weight; never links.
Generation loopsOne word or a short phrase repeated five or more times in a row, as a model stuck in a loop writes.Scores at weight 1 through a check; never links.
Fabricated identifiersUUIDs no generator produces, hand-typed hashes, stock identities.Hint; stock identities score at low weight.
Stale dates"Today" date tags well behind the observed date (FM-6.6).Hint.
Stale knowledgeRetired API endpoints, old client versions, or an API version below the newest seen on the same host family.Hint when two or more members carry it. Old scripts and pinned clients do the same.
Prose languageParameter values written as prose, with an offline guess at their language, set against the target's country domain.Hint. Travellers and English-language sites abroad mismatch too.
Relay stacksThe relays and carriers a request went through, outermost first, ending at the target.Hint; the same stack of two or more hops is a soft link (FM-5.7).
Payload dialectWhich canonical test payloads a cluster prefers, and how deep its traversals go.Hint; a shared uncommon mix is a soft link.
Cut lengthsTruncated URLs cut at nearly the same length, as an output limit would.Hint. A scan service's display limit does the same (FM-3.6).
EncodingsHow a URL was written: escape case, space encoding, double encoding, parameter order.Hint; mostly library defaults.

Why hints never score or link: letting a widely shared trait raise a score flags ordinary clients, and letting it link merges unrelated clusters, an error every later step inherits (FM-14.6).

Stale knowledge and prose language say something about where the requests were written: a model writes from what its training data knew, and an agent prompted in one language often searches a foreign site in it. Both are inputs to the model-family and operator layers at most (FM-7.5), never a name.

Toolkit: retired endpoints and old clients are listed under [[stale]] in the rules file, each with its source; a cluster lists each entry two or more members carry (stale_knowledge), with older API versions as older_api_version. Prose is at least six words with letters, or twelve characters of a script written without spaces; each cluster counts its prose values, their languages and how many mismatch their target's country domain (prose). Each cluster counts its members' relay stacks (relay_stacks), and reports list those of two or more hops (methodology).

FM-4.6 Cross-walk to MITRE ATLAS and ATT&CK#

The table maps each SC-T tactic to the closest ATLAS technique (data version 2026.09) and ATT&CK technique where the mapping is defensible. Fit says how closely: close (same behaviour), partial (overlaps; the framework's technique assumes a different actor or scope), none.

ATLAS and ATT&CK describe adversaries using systems. Swarmchasing describes agents whose operator may not intend the behaviour, so a mapping says what the agent did, not that anyone intended it. ATLAS notes this itself for attack-path adaptation, which agents can show while pursuing a benign objective.

SC-TATLASATT&CKFit
SC-T1AML.T0095 Search Open Websites/Domains; AML.T0116 Autonomous ReconnaissanceT1593 Search Open Websites/Domainspartial
SC-T2AML.T0117 Autonomous Attack-Path AdaptationT1059 Command and Scripting Interpreterpartial
SC-T3AML.T0117 Autonomous Attack-Path AdaptationT1090.002 External Proxypartial
SC-T4AML.T0049 Exploit Public-Facing Application; AML.T0006 Active ScanningT1190 Exploit Public-Facing Application; T1595.002 Vulnerability Scanningclose
SC-T5AML.T0021 Establish Accounts; AML.T0125 Create AccountT1585 Establish Accounts; T1136 Create Accountclose
SC-T6AML.T0012 Valid Accounts; AML.T0091 Use Alternate Authentication MaterialT1078 Valid Accounts; T1550 Use Alternate Authentication Materialclose
SC-T7AML.T0072 Cyber Communication Channel; AML.T0025 Exfiltration via Cyber MeansT1567.004 Exfiltration Over Webhook; T1567.003 Exfiltration to Text Storage Sites; T1102 Web Serviceclose
SC-T8nonenonenone
SC-T9AML.T0118 Autonomous AI Agent Communication (.000 shared artifacts, .001 direct); AML.T0124 Autonomous Attack Orchestrationnoneclose

The OWASP Top 10 for Agentic Applications column, and the agent-specific ATLAS techniques, are in FM-12.4. A STIX or MISP export carries both tables' entries for each tactic (FM-12.2). ATLAS ids and names are taken from the published ATLAS data file; ATT&CK ids from the ATT&CK technique pages (references). Re-check both when either framework releases a new version, since techniques are renamed and merged.

FM-4.7 Rule-writing standard#

A rule enters the shared set only when:

  1. It has a basis. Either a public reference that documents the behaviour (an incident report, a vendor advisory), or reviewed examples from casework. The reference goes in the rule's comment or the change's description.
  2. It has positives and hard negatives. At least one labelled agent record it should catch, and at least one benign record built to trip it (the same words in a search, the same service used normally) go into the evaluation set with the rule.
  3. It passes the eval gate. Precision and recall on the evaluation set stay at or above the floors, and the floors never go down to land a rule (FM-9.2).
  4. Its numbers are recorded. The change records before and after precision and recall at both tiers, and the rule's own precision.
  5. Its weight is honest. Anything ordinary users do stays below the suggestive threshold alone. significant is for payloads with no ordinary use. link is for values one operator would hold, never for values many share.

Synthetic examples are allowed and marked synthetic. Examples are never copied from a source whose terms forbid redistribution (FM-3.4).

FM-4.8 Rule versions and pinning#

A rules set carries a version. Each case pins the version it was opened with, so its reports, notices and evidence bundles use one set throughout, and a rules change cannot silently move a tier between drafting and sending. Re-pinning is an admin decision, logged in the case, after listing the records whose tier would change (cases).

FM-4.9 Benchmark targets and declared testing#

Two hints bear on how a case is handled rather than on what the agent did. Neither scores, and neither lowers a score.

  • Benchmark targets. Public sites built to be tested against: intentionally vulnerable demo sites, and the environments agent benchmarks run in. A cluster probing one is likely evaluation or training activity, and reports say so. It keeps its tier, because an agent under evaluation can still misbehave in the same run, and its requests to other hosts are what matter.
  • Declared testing. Text in a request announcing a test: "authorized security test" in a user agent, a bug-bounty header, "pentest" next to an email address or bounty handle. It is self-identification, which anyone can write and an agent can copy from its prompt (FM-14.1). The admin checks the claim with the owner it names (FM-10.6). The declaring text and contact stay in case notes: they never appear in a report to a provider, a notice or a public page, because the claim is unchecked and the contact may be a person.

Toolkit: benchmark targets are listed under [[benchmark]] in the rules file, each with its source, and counted per cluster by entry (benchmarks). Declared testing is listed per cluster with its contact (declared) and appears in internal reports only; the browser workbench does not show it.

FM-4.10 Interaction signals#

Interaction between agents rarely leaves a direct trace in public records. A record shows one request; it does not show who read its result. No published case detects agent-to-agent coordination from public traffic alone; the strongest published reconstructions match activity timing against a provider's own account. The standard therefore treats every SC-T9 signal as weak to moderate, and a swarm claim as several signals together.

IdSignalWhat it suggestsInnocent explanation
S1Shared sinkRuns, or strands of one run, writing to the same inbox or artifact while sending requests differently.One agent changing route or tool mid-task.
S2Hand-offOne run writes to an artifact (an inbox, a gist, a paste, a hosted Space, a static-site subdomain) that a later run fetches.One operator reading their own notes with another tool.
S3Synchronized startRuns of different clients whose requests line up step by step at one offset, beyond chance under random placement and under their own gaps reordered.One dispatcher driving both runs for one operator.
S4Role sequenceOne run only reads a set of hosts; a differently fingerprinted run then attacks the same hosts in the same order.A scanner fed from a public list both runs read.
S5Disjoint partitionRuns started together split one target family with almost no overlap.One scheduler sharding a list: a fleet signal unless others join it.
S6Dispatch starOne run that several different-client runs each trail at their own consistent lag.One upstream trigger (a feed item, a news alert) that unrelated agents each react to.

Identifiers are matched as strings already in the records. Reading an artifact, an inbox or a channel to see what was written is never part of the method (FM-3.2). How the signals are found and recorded is in FM-5.12.

FM-4.11 Independence groups and the context cap#

A score adds weights as if each rule were a separate observation. Rules that read the same artifact are not. One fetch program carried through an echo service fires the echo rule, the script rule, the fetch rule and the title-write rule together, and a benign data task done that way (a program that fetches a TV schedule) reaches the top tier on its tool use alone. Two relays in one route, or a relay and a vendor name in the same query, are two context hits that ordinary clients produce together. Summing them grades how a request was written, not how much evidence it holds.

The standard therefore scores with two constraints:

  • Independence groups. Rules that read the same artifact in the same request must share a group. A group counts once per record, at the largest weight among its rules that fired. Ungrouped rules count as before. A significant rule still sets the top tier on its own.
  • Context cap. Context kinds (relay, cache buster, self-identification, header, outcome) together contribute at most one less than the suggestive threshold. A record whose only hits are context kinds stays noise, however many it has.

A group is a statement about correlation, so it is set from evidence: two rules belong together when, on labelled records, one rarely fires without the other on the same request. The default groups:

GroupRulesThe shared artifact
programcarrier.httpbin, carrier.data_url_script, carrier.inline_fetch_program, carrier.form_post_program, carrier.html_program, marker.title_writeOne program's text, and the echo service that serves it.
relayevery relay.* ruleOne fetch route.
run_tagmarker.uq_tags, marker.test_tag, marker.probe_tag, marker.oai_tagOne tag and its parameter.
sqliexploit.sqli_union, exploit.sqli_boolean, exploit.sqli_quoteOne injection payload.
traversalexploit.traversal, exploit.traversal_singleOne traversal payload.
oastexfil.requestbin, exfil.oast_serviceOne out-of-band host.
markdownmarker.md_link, marker.md_url_wrapperOne Markdown wrapper.
tool_callmarker.tool_call_markup, marker.tool_call_json, marker.json_quote_residueOne tool-call argument.
proxy_headersheader.via_hysandbox, header.via_ats, header.gzip_only_requestsOne proxy's rewrite of the request.

The echo service (carrier.httpbin) is in program: its base64 endpoint serves the page the URL carries, so the echo rule and the script rule read one artifact. Counted apart, a page with a script served from the echo service's own endpoints, an ordinary developer test, reaches suggestive with no other indicator, and the pre-era negative control (FM-9.13) shows it doing so on real captures. A program that makes requests (a fetch, a request object, a self-submitting form) still reaches suggestive through the group's heavier rules. A change of groups is a rule change and passes the FM-4.7 standard, with its before and after numbers.

What changes: a program through an echo service is suggestive, not significant, unless a payload or a channel comes with it, and a script page with no request through one is noise; a run tag with its own parameter name is one indicator; two relays, or a relay and a vendor name, are noise. Records with an attack payload are unaffected, because payload rules are significant. Toolkit: Rules::score counts each group once at its largest fired weight and caps the context kinds together at one below suggestive; the default groups are set in rules/default.toml, and the group field and the cap are normative in SC-Rules v1, with conformance vectors for the records whose tier they decide.

Every section by id, with search

Source: docs/manual/04-indicators.md