Point almost any cloud attack tool at an account where you can only see part of the picture — a limited foothold, throttled calls, AccessDenied on half of what you probe — and it will still draw you a confident map. That map is the problem. It cannot tell the difference between “there is no path here” and “I wasn’t allowed to look.”

Akumo is a cloud offensive framework I have been building under BlueSquadron, and it is built around refusing to make that mistake. It is written in Rust, ships as a single binary, and it does something I have wanted from this class of tool for years: it keeps track of what it actually knows.

The Akumo logo — a red horned demon face rising from a cloud, on a dark navy field.

This post is the tour I would want if someone handed me the repository cold — what it is for, the handful of ideas that make it different, how you write a technique, and a peek at the machinery underneath that makes the rest possible.

Before anything else: Akumo is offensive tooling for infrastructure you are authorised to test — owned accounts, contracted engagements, lab and CTF environments. Opening an engagement makes you affirm that, and it is recorded.

One loop instead of four tools

The usual cloud-offence workflow is a relay of excellent, single-purpose tools that do not speak the same language. Prowler or ScoutSuite audit posture. CloudFox (Bishop Fox) enumerates and hunts privilege-escalation paths. Pacu is the exploitation framework. Stratus Red Team (Datadog) detonates a technique so you can watch detections fire; COBRA simulates multi-cloud chains. Each is good at its slice — and each has its own data model, so you are the integration layer, holding them together with notes and shell history and a mental map that lives nowhere.

Akumo is not trying to beat any one of them at its slice. It is arguing that the seams between them are where the real work leaks away — the re-typing, the lost context, the enumerate-guess-execute gap — and it collapses the whole relay into one loop over a single graph.

Eight stages in a row: authorize, enumerate, graph, paths, execute, verify, revert, report, with authorize and revert highlighted. Below: every command is a stateless invocation, all state in an append-only ledger; read-only until you deliberately elevate.
The whole tool is this one loop. Authorize and revert are the bookends that make the middle safe to run.

You open an authorised engagement with a scope. You enumerate — partially, honestly. Akumo folds what it saw into an attack graph, computes the paths to a goal you name, and executes the chosen one through a careful lifecycle: preview, consent, act, verify, and — if needed — undo. Every step lands in an append-only ledger, so each command is a stateless invocation; you pick the engagement with a flag rather than holding a session.

That is the shape. What makes it worth writing about is three properties none of those tools combine — because none of them owns the whole loop: it reasons honestly about what it could not see, it can undo what it did, and it hands you the detection for what it did.

Differentiator one: it knows what it doesn’t know

This is the idea I care about most, and it is rarer in offensive tooling than it should be.

On a real engagement, enumeration is always partial. You have a toehold, the account throttles you, and a good third of your describe-calls come back denied. The dangerous move — the one most tooling makes silently — is to treat a call you couldn’t make as evidence that the thing isn’t there. That single conflation produces both halves of a bad report: paths you missed, because you assumed absence, and false confidence, because you drew everything else solid.

Akumo makes uncertainty a first-class property. Every attack-relevant fact carries a categorical epistemic status: PROVEN, ABSENT, UNKNOWN (denied or unseen), or INFERRED (derived, with a confidence score). The same foothold, read through that lens, looks very different:

Two renderings of the same small attack graph. On the left, 'what most tools show': four identical solid blue edges from you to ci-role, lambda, admin and prod-s3. On the right, 'what akumo shows': the proven edge to ci-role is solid green, unknown edges to lambda and prod-s3 are dashed amber, and an inferred edge to admin is dotted violet. A legend maps the three.
Left: four solid edges, three of them guesses. Right: proven, unknown and inferred are different things, and they are drawn differently.

The payoff is not cosmetic. The planner reasons over the difference in dual mode — proven paths shown prominently, candidate paths surfaced but clearly labelled needs validation. You get low false negatives without false confidence, and you can force strict-proven or full-optimistic when the engagement calls for it. When Akumo hands you a report, the blind spots are on it by name, because “I couldn’t see this” is a fact worth recording.

Differentiator two: safe by construction, not by good intentions

The second reason I trust this tool in a real account is that its safety is structural rather than procedural. It does not ask you to be careful; it is built so that carelessness is hard.

Everything is read-only until you deliberately elevate — nothing above read runs without recorded consent, and out-of-scope targets are refused and logged, with a global kill-switch that halts and unwinds. But the linchpin is the revert model. It is not a best-effort “undo” bolted on afterwards.

Top row: four steps detonating left to right — create-key, attach-policy, assume-role all succeed with a compensation recorded, touch-bucket fails. Bottom row: revert replays undo assume-role, undo attach-policy, undo create-key in reverse, each applying a compensation. The failed step creates nothing to undo.
A compensation is recorded before a step is even verified, so revert replays only what actually happened — in reverse, and safe across a crash.

When a mutating step runs, Akumo records a concrete compensating action into the ledger before it even verifies the step. Revert then replays those compensations in reverse order, undoing only what actually happened — and because they live in the ledger, it survives a crash and a restart. The step that failed created nothing, so nothing is undone for it.

You might expect that to mean writing an undo for everything by hand, which would be miserable. It mostly is not: the compensation is derived from the provider’s declared inverse by default — Create pairs with Delete, Attach with Detach — and a technique only spells out a revert when it needs to override that default. Two rules then keep it honest. Every mutating technique ships an automated test that detonates and asserts a clean revert — no passing revert test, and it does not ship. And an action with no clean inverse cannot fake one: it must declare a simulated variant, and validation rejects an irreversible technique that lacks it.

This is exactly the property cloud security chaos engineering has been missing. Detonating a real technique against a real control plane to see whether your detections fire is only responsible if you can reliably put everything back. Akumo makes that reliability a build-time guarantee rather than a hope.

Differentiator three: it tells the defender what to watch for

Most offensive tooling leaves the defensive half to somebody else. Akumo treats the two as inseparable: every technique carries the telemetry it expects to produce. That signature — the log source, the event a defender would actually see, and the discriminating fields — is the primary artefact, written alongside the attack itself.

I want to be precise about what that buys, because it is easy to oversell. The signature is the durable thing; Sigma is one way to export it, not the mechanism that catches you. No cloud-native detection service ingests Sigma directly — GuardDuty ships its own curated logic and takes no custom rules, and Security Lake wants OCSF, not signatures. A Sigma rule only reaches cloud telemetry after somebody translates it into the query language of the SIEM or the Athena table sitting over CloudTrail. So Akumo emits Sigma as a lingua franca for whoever owns the SIEM — a portable starting point they can convert — while the honest answer to “how is this actually detected in the cloud?” is the telemetry itself: the CloudTrail event and the fields that make it distinctive.

That is why the expected_telemetry block, not the generated rule, is the thing you author with care. Ask for a technique and you get its metadata, the telemetry signature, and a candidate Sigma rendering of it:

akumo technique --id aws.iam.persistence.create-access-key --content content

Because executed techniques and their ATT&CK coverage land in the engagement report, a run doubles as a detection-coverage artefact: what was done, what telemetry it should have produced, and which techniques it exercised. What Akumo cannot yet do — and it is the right next step, not a v1 gap I am hiding — is watch the logs and tell you whether the expected telemetry actually appeared. That observed-versus-expected loop, the thing tools like Grimoire do for detection engineering, is the headline of where this goes next.

Writing a technique

Here is where the design pays off for anyone extending the tool. Techniques are data, not code you have to trust: declarative YAML, versioned, validated, and reversible by default. You never write a cloud SDK call by hand — you reference a provider operation and the host brokers it.

The important structural point is that a technique has two halves the engine reads and two halves it runs:

Left panel, read by planner and validator and never executed: metadata (id, mitre, impact, expected_telemetry) and contract (inputs, preconditions, effects). Right panel, what actually runs: steps (host-brokered calls) and revert (the natural inverse). Note that no tested revert means it does not ship.
The planner and validator read the top-left two blocks without executing anything. That is what lets Akumo reason about a technique — and chain it — before it ever runs.

A minimal, fully reversible technique looks like this:

metadata:
  id: aws.iam.persistence.tag-user
  name: Tag IAM User
  version: "1.0.0"
  provider: aws
  mitre: ["T1098"]
  impact: mutating-reversible
  expected_telemetry:
    - source: cloudtrail
      event_name: TagUser
      fields:
        eventSource: iam.amazonaws.com

contract:
  inputs:
    - name: user
      type: principal
      required: true

steps:
  - id: tag
    body: { type: call, service: iam, operation: TagUser,
            params: { UserName: "$user", Tags: [{ Key: "akumo", Value: "demo" }] } }
    revert: { service: iam, operation: UntagUser,
              params: { UserName: "$user", TagKeys: ["akumo"] } }

The mitre mapping and expected_telemetry block are mandatory — omit either and the technique is rejected at load with an actionable message rather than half-loading. impact: mutating-reversible is what makes it safe by construction. The explicit revert above is shown for clarity — for a clean inverse like this, the engine would derive the same UntagUser compensation from the provider descriptor on its own.

The part that makes techniques powerful rather than just tidy is the contract. Its preconditions and effects are what let the planner chain techniques: if a technique’s preconditions hold, applying it produces effects — new edges and facts — which may unlock the next hop. So a computed path can interleave “you already can do this” with “run this technique to make that possible”. You state an objective — reach-admin, or reach-resource for a named ARN — and Akumo finds and explains the path, every hop annotated with the permission that enables it and its epistemic status.

A peek at the internals: the ledger is the system

The last thing worth showing is why the reproducibility and the audit trail come essentially for free, because it is a genuinely satisfying design decision.

Akumo is event-sourced. The single source of truth is an append-only, hash-chained ledger of events. Everything else you interact with — the attack graph, the execution state, the recovered loot, the report — is a deterministic projection of that log.

An append-only, hash-chained, tamper-evident event ledger on the left, labelled 'the only thing written'. Four projections fan out from it: attack graph, execution state, loot, and report, each in its own colour.
One thing is ever written — the event log. The graph, the state, the loot and the report are all folds of it, so none of them can drift out of sync with what happened.

This is what buys the properties that matter on an engagement. Reports are reproducible because they are recomputed from the log, not maintained alongside it. The trail is tamper-evident because the chain is hashed. Revert survives a crash because compensations are events like any other. And the whole thing is auditable by construction — there is no second record that could disagree with the first, because there is only one record.

Underneath, the architecture is hexagonal: a provider-neutral core behind a seam, with pluggable adapters. Today that is AWS and a scriptable Mock; the Mock is a real practice target that needs no credentials, which is the right way to learn the tool before pointing it at anything live.

Where it costs you, and what it is not yet

A tool without stated limits is a sales pitch, so here are Akumo’s, plainly.

v1 is deliberately narrow. The provider surface is AWS and Mock; the technique catalogue is a starter set — STS identity enumeration and IAM access-key operations — chosen to prove the machinery rather than to blanket the cloud. There are no release binaries yet: you build from source with cargo.

Declarative YAML trades flexibility for analysability. The reason the planner can reason about a technique before running it is that techniques are data, not arbitrary code. That is the right trade for a tool whose whole pitch is honesty and safety — but if you want to express something the step DSL cannot, you will reach for an escape hatch rather than free-form scripting, and by design that is a slightly higher bar.

None of that changes the thesis. The narrow v1 already demonstrates the thing that is hard and rare: an offensive tool that reasons honestly about what it cannot see, and can undo what it does.

Where it goes next

Three lines of work follow directly from the design, and each closes a gap named above.

Watching detections fire, not just describing them. v1 emits the expected telemetry; the obvious next step is a collector that captures what the detonation actually produced and shows observed against expected — the loop Grimoire pioneered for detection engineering. That turns the detection-coverage report from a claim into a measurement, and it is the honest answer to “will the cloud actually catch this?” — because it checks the telemetry itself rather than trusting a rule.

Making reverts disappear almost entirely. The compensation model already derives most undos from the provider’s declared inverse, so the natural evolution is to push all inverse knowledge down into the provider capability descriptor — one place that knows AttachUserPolicy is undone by DetachUserPolicy — so a technique author almost never writes a revert at all. The release-blocking revert test stays, because that is what proves the undo is real; the boilerplate goes. Handwritten compensations become the rare exception for genuinely awkward operations rather than the default tax on every mutating technique.

Beyond one cloud. The provider seam exists precisely so Azure, GCP and Kubernetes adapters can be added without touching the core — and the honest-epistemics and safe-revert machinery is provider-neutral, so it comes along for free. AWS-and-Mock is a starting point chosen to prove the machinery, not the ceiling.

Why this shape makes sense

I keep coming back, across everything I build, to one preference: make the machine’s reasoning legible. I have argued it for agent governance and for threat modelling. Akumo is the same instinct pointed at offence.

An attack tool that draws every edge solid is easy to build and comfortable to demo. It is also the one that gets you a finding you cannot reproduce and a report you cannot defend. The harder, better tool is the one that says “I proved these three things, I am guessing at these two, and here is what I could not see at all” — and then cleans up after itself.

That is the tool I wanted to exist. So I built it.

Sources

  • Akumo on GitHub — the repository, including the full architecture decision records under spec/ADR, the internal design docs, and the technique-authoring guide these figures are drawn from. GPL-3.0.
  • AWS Threat Technique Catalog — the reference Akumo techniques cross-map to, so a defender can trace an action.

Akumo is a tool I write and maintain under BlueSquadron, so this is not a neutral review — it is the author explaining a design. Everything above is drawn from the current repository; the v1 scope, provider coverage and roadmap items are as documented today and will move. The framing — “unseen is not absent”, safety as a structural property, the ledger as the system — is how I think about the design, not anyone’s official position.