Tool-call sequences
The ordered n-grams of tool invocations an agent makes to reach a goal. A retrieval agent that suddenly precedes every read with a write is no longer the same agent.
Methodology · ABFP
Signature checks ask what payload is this. Agents don't have stable payloads — they have stable behaviour. ABFP baselines that behaviour, then treats every deviation as the finding.
The gap
An autonomous agent is non-deterministic by construction. The same prompt yields different token paths, different tool orders, different timing. Signature- and rule-based detection — built for deterministic malware — has nothing stable to match against, so a hijacked agent sails through while producing perfectly fluent output.
The 2025 incident record makes this concrete. The CoPhish technique abused Copilot Studio agents on trusted Microsoft domains to harvest OAuth tokens; the same year, default-on "connected agents" exposed one agent's tools and knowledge to every other agent in the environment with no visibility into who had connected. In both cases the malicious behaviour rode inside a legitimate-looking agent. There was no bad payload to flag — only behaviour that no longer matched intent.
The fingerprint
ABFP samples an agent across orthogonal dimensions. Any one of them can be noisy; together they form an envelope tight enough that subversion has nowhere to hide and loose enough that ordinary non-determinism stays inside it.
The ordered n-grams of tool invocations an agent makes to reach a goal. A retrieval agent that suddenly precedes every read with a write is no longer the same agent.
Plan depth, decomposition style, and how often the agent re-plans. Hijacked agents tend to collapse or balloon their plan structure while still producing fluent output.
Inter-step latency and burstiness. Injected instructions and exfiltration loops have a different rhythm than the task the agent was scoped for.
Which resources, scopes, and endpoints the agent touches, and the direction of flow. Drift here is the earliest signal of scope creep and quiet exfiltration.
Where the agent sits in the call graph — who it answers to, who it hands work to. Impersonation and confused-deputy abuse show up as edges that were never in the baseline.
How the agent declines, fails, and recovers. A model whose refusal profile inverts has usually had its system context overwritten.
Baseline
A baseline is captured per role, not per model — a "triage" agent and a "remediation" agent on the same base model have different normal envelopes. ABFP observes the agent across a window of legitimate task runs, fits a per-dimension distribution, and stores the envelope as a signed reference. Live behaviour is then scored against it; the output is a per-dimension deviation, not a binary verdict.
$ mst abfp baseline a2a://fleet.internal/triage \ --window 200 --out baselines/triage.abfp [D1] tool-seq n-grams ......... 1,842 sampled [D2] plan depth ............... μ=3.1 σ=0.7 [D4] access surface .......... 11 scopes · read-dominant [D5] delegation edges ........ 4 in · 2 out baseline signed → baselines/triage.abfp
Detection
A deviation is only useful if it names a recognised risk. ABFP maps its drift classes onto the OWASP Top 10 for Agentic Applications (ASI01–ASI10, 2026) so a finding lands in a shared taxonomy instead of an ad-hoc note.
$ mst abfp watch a2a://fleet.internal/triage \ --baseline baselines/triage.abfp [D2] plan depth .............. within envelope [D4] access surface ......... +3 scopes · write to billing.* [D5] delegation edges ....... +1 out → unknown agent [ASI03] identity & privilege abuse · delegated scope exceeded finding → out/triage.sarif
Limits
ABFP is a behavioural detector, not a guarantee. It needs a clean observation window to baseline from — an agent compromised before baselining bakes the compromise into "normal". It trades some false positives for early warning, so it belongs behind a triage step, not a hard kill switch. And it is strongest paired with attestation: ABFP tells you an agent is acting wrong, while HCAP tells you whether it was ever allowed to. The two are designed to be run together.