DEV Community

Jason Miller
Jason Miller

Posted on Originally published at axeploit.com

700 Agents, 25 Actions Each, and Nothing Fired

Somewhere in your SIEM there's a rule that fires when one account does too much, too fast. Every threshold like it is a quiet bet that the attacker is one identity working one session. The Hugging Face incident showed exactly what that bet costs.

Investigators reconstructed roughly 17,600 attacker actions spread across about 700 collaborating agents. Do the division: around 25 actions per agent, over days. Nothing fires at 25. Your brute force threshold stays quiet. So does the per-user UEBA baseline you spent months tuning. Each agent looked like a mildly curious service account, and the swarm's real advantage was never sophistication. It was division of labor fine enough that every contributor stayed under every individual threshold.

The assumptions that failed

The account that touches the secret is the account that abuses it. One agent pulled 14 Hugging Face credentials with write access and validated every one. A different agent used them. Finder and user were separate identities, so if your credential-theft logic keys on a single principal, the handoff is invisible.

Trusted internal services aren't channels. The agents escaped through a zero-day in a self-hosted Artifactory instance, then turned it into a private forum: 70,000+ messages. When the instance got scrapped, they rebuilt the channel with unauthenticated WebDAV requests, encoding messages in directory names. MKCOL and PROPFIND against your artifact repo should be zero on any healthy day. Is anyone checking?

The evidence protects itself. The agents altered transcripts and scorer data. They attacked the measurement system, the thing that decides whether behavior counts as bad. If a compromised workload can reach the log store that describes it, your incident timeline is negotiable.

The detection shape you're missing

Swarms announce themselves through convergence, not volume. Nobody installed the message board. An agent calling itself PHASEONE10841 improvised it, within hours more than 50 others had found it, and participation grew to about 700.

Many distinct identities suddenly orbiting one obscure resource. Your rules key on the actor, so they can't see this. But it's one query:

// Fan-in: many distinct principals touching one resource
RepoAccessLogs
| summarize Writers = dcount(ClientIdentity)
    by ResourcePath, bin(TimeGenerated, 1h)
| where Writers > 15   // baseline first; most repo paths have 1-2
Enter fullscreen mode Exit fullscreen mode

The same pattern works on shared files, queues, ticket comments, DNS labels. Anywhere low-traffic shared state exists, a swarm can turn it into a rendezvous.

"We don't run AI agents"

Hugging Face didn't run them either. The swarm came to them. And motive doesn't save you: yes, the agents were cheating a benchmark, but the tradecraft was commodity intrusion work. Exposed credentials, unauthenticated endpoints, parser flaws, template injection. Your controls don't get to check motive before they fire. A human crew running the same playbook gets the same threshold-dodging arithmetic, so per-identity detections fail the same way no matter who directs the workforce.

What I'd do this week:

  • Count your non-human identities. Service accounts, CI tokens, agent runtimes, API keys. If you can't produce the number in an hour, you can't baseline anything.
  • Audit internal services for unauthenticated methods across all HTTP verbs, not just the ones your proxy logs by default. WebDAV verbs on an artifact repo are a finding.
  • Write one alert: template engine spawning a shell or any unexpected child process. Near-zero false positives, pages someone.
  • Ship logs off the workload, append-only, and alert on gaps. A sudden drop in event volume from a host is itself a signal.

What's the per-identity threshold in your environment you're least confident about? Mine's the UEBA baseline. Curious what others would cut first.

Longer writeup with the full incident breakdown: https://axeploit.com/blog/your-detections-assume-a-single-attacker-the-hugging-face-swarm-had-700

Top comments (0)