一部しか見えていないアカウント — 限られた足場、スロットリングされた呼び出し、調べたものの半分が AccessDenied — に、ほぼどのクラウド攻撃ツールを向けても、自信たっぷりの地図を描いてくれます。その 地図こそが問題です。「ここには経路がない」と「見ることを許されなかった」を、区別できないからです。

Akumo は、私が BlueSquadron で作っているクラウド攻撃 フレームワークで、まさにその間違いを犯さないことを軸に設計しています。Rust で書かれ、単一バイナリで 配布され、この種のツールに何年も欲しかったことをやります。自分が実際に何を知っているかを、把握し 続けるのです。

Akumo のロゴ — 暗い紺色の地に、雲から立ち上がる赤い角の生えた悪魔の顔。

この記事は、リポジトリを予備知識なしで手渡されたときに私が欲しいと思うツアーです。何のためのものか、 それを他と分ける少数の考え、技法の書き方、そして残りを可能にしている足回りの覗き見。

まず最初に。Akumo はテストする権限のあるインフラ — 自分が所有するアカウント、契約された案件、 ラボや CTF 環境 — に対する攻撃ツールです。エンゲージメントを開くときにそれを表明させ、記録します。

4 つのツールではなく、1 つのループ

いつものクラウド攻撃のワークフローは、優れた単機能ツールのリレーで、しかも互いに同じ言語を話しません。 Prowler や ScoutSuite が構成を監査する。CloudFox(Bishop Fox)が列挙と権限昇格経路の探索を する。Pacu が悪用フレームワーク。Stratus Red Team(Datadog)は検知の発火を見るために技法を 起爆し、COBRA(Palo Alto)はマルチクラウドの連鎖をシミュレートする。それぞれが自分の担当では優秀 です。そして、それぞれが独自のデータモデルを持つので、あなたがメモとシェル履歴と、どこにも保存されない 頭の中の地図でつなぐ統合層になります。

Akumo は、どれか 1 つに担当分野で勝とうとはしていません。主張しているのは、ツールとツールの継ぎ目 こそ本当の労力が漏れていく場所だ、ということです — 打ち直し、失われた文脈、列挙と推測と実行の隙間。 Akumo はそのリレー全体を、単一のグラフ上の 1 つのループに畳み込みます。

8 つの段階が横一列に並ぶ: authorize、enumerate、graph、paths、execute、verify、revert、report で、authorize と revert が強調されている。下部に、すべてのコマンドはステートレスな呼び出しであり、状態はすべて追記専用の台帳にあること、明示的に昇格するまでは読み取り専用であることが書かれている。
ツール全体がこの 1 つのループです。authorize と revert は、真ん中を安全に実行できるようにする両端の留め具です。

権限のあるエンゲージメントをスコープ付きで開きます。列挙します — 部分的に、誠実に。Akumo は見えたもの をアタックグラフに畳み込み、あなたが指定したゴールへの経路を計算し、選んだ経路を慎重なライフサイクルで 実行します。プレビュー、同意、実行、検証、そして必要なら取り消し。すべてのステップが追記専用の台帳に 残るので、各コマンドはステートレスな呼び出しになります。セッションを保持するのではなく、フラグで エンゲージメントを選びます。

形はこれです。書く価値があるのは、これらのツールのどれも組み合わせていない 3 つの性質です — どれもループ全体を持たないからです。見えなかったものについて誠実に推論し、やったことを元に戻せて、やったことに対する検知を手渡す。

差別化点その 1:知らないことを、知っている

これが私の最も大切にしている考えで、攻撃ツールにおいては本来あるべきよりずっと稀です。

実際の案件では、列挙は常に部分的です。とっかかりがあり、アカウントはスロットリングし、describe 系の 呼び出しの 3 分の 1 は拒否で返ってきます。危険な一手 — 多くのツールが黙ってやること — は、実行できな かった呼び出しを、それが「存在しない」証拠として扱うことです。この 1 つの取り違えが、悪い報告書の両面を 生みます。見逃した経路(不在だと決めつけたから)と、根拠のない自信(それ以外を実線で描いた から)です。

Akumo は不確実性を第一級の性質にします。攻撃に関係するすべての事実が、カテゴリカルな認識ステータス を持ちます。PROVEN、ABSENT、UNKNOWN(拒否または未観測)、INFERRED(導出、確信度付き)。同じ 足場も、そのレンズを通すと、まるで違って見えます。

同じ小さなアタックグラフの 2 通りの描画。左「多くのツールが見せるもの」は、you から ci-role、lambda、admin、prod-s3 への 4 本の同じ実線の青いエッジ。右「Akumo が見せるもの」は、ci-role への証明済みエッジが緑の実線、lambda と prod-s3 への未知のエッジが黄の破線、admin への推論エッジが紫の点線。凡例が 3 つを対応づける。
左:4 本の実線、うち 3 本は推測。右:証明済み・未知・推論は別物であり、別々に描かれる。

見返りは見た目のことではありません。プランナーはその違いをデュアルモードで扱います。証明済みの 経路を目立たせ、候補の経路は出しつつも要検証と明示する。誤検知(偽陰性)を抑えながら、根拠のない 自信を持たない。案件が求めるなら strict-proven や full-optimistic を強制できます。Akumo が報告書を 出すとき、盲点はその上に名前付きで載っています。「これは見えなかった」もまた、記録する価値のある事実 だからです。

差別化点その 2:善意ではなく、構造による安全

実際のアカウントでこのツールを信頼できる 2 つ目の理由は、その安全性が手順ではなく構造だからです。 「気をつけてね」とお願いするのではなく、不注意が難しくなるように作られています。

明示的に昇格するまではすべて読み取り専用で、read を超えるものは記録された同意なしには走らず、 スコープ外のターゲットは拒否・記録され、停止して巻き戻すグローバルなキルスイッチがあります。しかし 要は取り消しモデルです。それは後付けのベストエフォートの「undo」ではありません。

上段:4 つのステップが左から右へ起爆する — create-key、attach-policy、assume-role は成功し補償を記録、touch-bucket は失敗。下段:revert が undo assume-role、undo attach-policy、undo create-key を逆順で再生し、それぞれ補償を適用する。失敗したステップは取り消すものを何も生んでいない。
補償はステップが検証される前に記録されるので、revert は実際に起きたことだけを — 逆順に、クラッシュをまたいでも安全に — 再生します。

状態を変えるステップが走るとき、Akumo はそのステップを検証する前に、具体的な補償アクションを台帳に 記録します。revert はその補償を逆順に再生し、実際に起きたことだけを取り消します。そして補償は台帳に あるので、クラッシュや再起動をまたいでも生き残ります。失敗したステップは何も生んでいないので、それに ついては何も取り消されません。

これは、あらゆるものに手で undo を書くという意味に聞こえるかもしれません。それは惨めな作業でしょうが、 実際にはほぼそうなりません。補償はプロバイダーが宣言した逆操作からデフォルトで導出されます — Create は Delete と、Attach は Detach と対になる — そして技法が revert を明記するのは、その デフォルトを上書きする必要があるときだけです。そのうえで、誠実に保つルールが 2 つあります。状態を変える すべての技法は、起爆してきれいな取り消しを検証する自動テストを同梱します — 取り消しテストが通らな ければ、出荷されません。 そしてきれいな逆操作を持たないアクションは、それを偽装できません。 シミュレーテッド・バリアントを宣言する必要があり、バリデーションはそれを欠く不可逆な技法を拒否します。

これはまさにクラウドのセキュリティカオスエンジニアリングに欠けていた性質です。検知が発火するかを 見るために、本物の制御プレーンに対して本物の技法を起爆するのは、すべてを確実に元に戻せる場合にのみ 責任ある行為です。Akumo はその確実性を、願望ではなくビルド時の保証にします。

差別化点その 3:防御側に「何を見張るべきか」を伝える

多くの攻撃ツールは、防御側の半分を誰か他人に任せます。Akumo は両者を不可分として扱います。すべての 技法が、自分が生むはずのテレメトリを携えます。 そのシグネチャ — ログソース、防御側が実際に目にする イベント、そして識別に使うフィールド — こそが第一級の成果物で、攻撃そのものと並べて書かれます。

ここは誇張しやすいので、正確に言います。durable なのはシグネチャであって、Sigma はそれを書き出す 1 つの形式にすぎず、あなたを捕まえる仕組みではありません。 クラウドネイティブな検知サービスは Sigma を 直接取り込みません — GuardDuty は自前のキュレーションされたロジックで動き、カスタムルールを取りません。 Security Lake が欲しいのは OCSF であってシグネチャではありません。Sigma ルールがクラウドのテレメトリに 届くのは、誰かがそれを SIEM のクエリ言語や CloudTrail の上に立つ Athena テーブルへ翻訳したあとです。 だから Akumo は Sigma を、SIEM を持つ人のための共通語として出力します — 変換の出発点として。一方で 「クラウドで実際にどう検知されるのか?」への誠実な答えは、テレメトリそのものです。CloudTrail のイベント と、それを際立たせるフィールド。

だからこそ、丁寧に書くべきは生成されたルールではなく expected_telemetry ブロックです。技法を尋ねれば、 メタデータと、テレメトリシグネチャと、その候補 Sigma レンダリングが返ってきます。

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

実行された技法とその ATT&CK カバレッジがエンゲージメント報告書に載るので、1 回の実行が検知カバレッジ の成果物を兼ねます。何が行われ、どんなテレメトリを生むはずで、どの技法を行使したか。Akumo がまだ できないこと — そしてそれは v1 の隠れた欠陥ではなく、正しい次の一歩です — は、ログを見張って、期待した テレメトリが実際に現れたかを教えることです。その観測対期待のループ、Grimoire のようなツールが検知 エンジニアリングのためにやっていることこそ、次の行き先の目玉です。

技法を書く

ここが、ツールを拡張する人にとって設計が報われるところです。技法は信頼しなければならないコードでは なく、データです。宣言的な YAML で、バージョン管理され、検証され、そしてデフォルトで可逆です。クラウド SDK 呼び出しを手で書くことはありません。プロバイダーの操作を参照し、ホストがそれを仲介します。

構造上の重要な点は、技法にはエンジンが読む 2 つの半分と、実行する 2 つの半分がある、ということです。

左のパネルはプランナーとバリデーターが読み、決して実行しないもの: metadata(id、mitre、impact、expected_telemetry)と contract(inputs、preconditions、effects)。右のパネルは実際に走るもの: steps(ホストが仲介する呼び出し)と revert(自然な逆操作)。取り消しテストがなければ出荷されないことに注意。
プランナーとバリデーターは、左上の 2 ブロックを何も実行せずに読みます。それが、実行する前に技法を推論し、連鎖させられる理由です。

最小限で、完全に可逆な技法はこうなります。

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"] } }

mitre マッピングと expected_telemetry ブロックは必須です。どちらかを省くと、技法は中途半端に読み 込まれるのではなく、実行可能なメッセージとともにロード時に拒否されます。impact: mutating-reversible が、構造による安全を作ります。上の明示的な revert は分かりやすさのために示したもので、この例のようなきれいな逆操作なら、エンジンは同じ UntagUser の補償をプロバイダー記述子から自分で導出します。

技法を単に整然としたものではなく強力にするのが、contract です。その preconditions と effects こそ、プランナーが技法を連鎖させる根拠です。ある技法の前提条件が成り立てば、それを適用すると効果 — 新しいエッジと事実 — が生まれ、それが次の一手を解錠するかもしれない。だから計算された経路は、「あなたは すでにこれができる」と「この技法を走らせてあれを可能にする」を織り交ぜられます。あなたはゴールを指定し ます — reach-admin、または名前付き ARN への reach-resource — と、Akumo が経路を見つけて説明します。 一手ごとに、それを可能にする権限とその認識ステータスが注記されて。

内部の覗き見:台帳こそがシステムである

最後に見せる価値があるのは、再現性と監査証跡がなぜほぼ無償で手に入るのか、です。これは本当に 気持ちのいい設計判断だからです。

Akumo はイベントソースです。唯一の真実の源は、追記専用でハッシュ連鎖されたイベントの台帳です。あなたが 触れる他のすべて — アタックグラフ、実行状態、回収した戦利品、報告書 — は、その log の決定論的な射影 です。

左に追記専用・ハッシュ連鎖・改竄検知可能なイベント台帳があり、「唯一書き込まれるもの」と記されている。そこから 4 つの射影が扇状に広がる: アタックグラフ、実行状態、戦利品、報告書、それぞれ独自の色。
書き込まれるのは 1 つだけ — イベント log です。グラフ、状態、戦利品、報告書はすべてその畳み込みなので、どれも起きたことと食い違えません。

これが、案件で効いてくる性質を買います。報告書が再現可能なのは、log と並行して維持されるのではなく、 log から再計算されるから。証跡が改竄検知可能なのは、連鎖がハッシュされているから。revert がクラッシュを 生き延びるのは、補償が他と同じイベントだから。そして全体が構造的に監査可能です。最初の記録と食い違い うる 2 つ目の記録が存在しない — 記録が 1 つしかないからです。

その下で、アーキテクチャはヘキサゴナルです。シームの向こうにプロバイダー中立なコアがあり、差し替え 可能なアダプターが付きます。今日それは AWS とスクリプト可能な Mock。Mock は認証情報の要らない本物の 練習用ターゲットで、何かを本番に向ける前にツールを学ぶ正しいやり方です。

何を犠牲にするか、そしてまだ何でないか

限界を述べないツールは宣伝です。だから Akumo のそれを、率直に。

v1 は意図的に狭い。 プロバイダーの範囲は AWS と Mock、技法カタログはスターターセット — STS の アイデンティティ列挙と IAM アクセスキー操作 — で、クラウドを覆うためではなく、機構を証明するために 選ばれています。リリースバイナリはまだありません。cargo でソースからビルドします。

宣言的な YAML は、柔軟性と引き換えに解析可能性を得ています。 プランナーが実行前に技法を推論できる のは、技法が任意のコードではなくデータだからです。誠実さと安全がすべての売りであるツールには、それが 正しい取引です。ただ、ステップ DSL で表現できない何かをやりたければ、自由なスクリプトではなく脱出口に 手を伸ばすことになり、設計上それは少しだけ高い敷居です。

どれも主旨を変えません。狭い v1 が、すでに難しく稀なことを実証しています。見えないものについて誠実に 推論し、自分がやったことを元に戻せる攻撃ツールです。

この先どこへ向かうか

設計から直接つながる 3 つの作業があり、それぞれが上で挙げた隙間を埋めます。

検知を記述するだけでなく、発火を見張る。 v1 は期待されるテレメトリを出力します。明白な次の一歩は、 起爆が実際に生んだものを捕らえ、観測を期待と並べて見せるコレクター — Grimoire が検知 エンジニアリングのために切り拓いたループです。これは検知カバレッジ報告を、主張から測定へ変えます。そして 「クラウドは本当にこれを捕まえるのか?」への誠実な答えです。ルールを信じるのではなく、テレメトリそのものを 確かめるからです。

取り消しをほぼ消し去る。 補償モデルはすでにほとんどの undo をプロバイダーの宣言した逆操作から導出 しています。自然な進化は、逆操作の知識をすべてプロバイダーのケーパビリティ記述子へ押し下げること — AttachUserPolicy は DetachUserPolicy で取り消される、と知っている 1 か所 — そうすれば技法の作者は revert をほとんど書かなくなります。出荷をブロックする取り消しテストは残ります。それが undo が本物だと 証明するものだからです。消えるのはボイラープレートです。手書きの補償は、あらゆる状態変更技法に課される 既定の税ではなく、本当に厄介な操作のための稀な例外になります。

1 つのクラウドの先へ。 プロバイダーシームは、まさに Azure・GCP・Kubernetes のアダプターをコアに 触れずに追加できるように存在します。そして誠実な認識論と安全な取り消しの機構はプロバイダー中立なので、 そのまま付いてきます。AWS と Mock は、機構を証明するために選んだ出発点であって、天井ではありません。

なぜこの形が理にかなうのか

私は作るものすべてを通して、1 つの好みに立ち返ります。機械の推論を読み取れるようにすること。 エージェントのガバナンスについても 脅威モデリングについても、そう論じてきました。 Akumo は同じ本能を攻撃に向けたものです。

すべてのエッジを実線で描く攻撃ツールは、作るのが簡単でデモも心地よい。同時にそれは、再現できない 発見と、弁護できない報告書をあなたに渡すツールです。より難しく、より良いツールは、こう言うものです。 「この 3 つは証明した、この 2 つは推測している、そしてこれはまったく見えなかった」— そして自分で 後片付けをする。

それが、存在してほしかったツールです。だから作りました。

出典

  • Akumo(GitHub) — リポジトリ。spec/ADR の完全な アーキテクチャ決定記録、内部設計ドキュメント、そしてこれらの図が基づく技法作成ガイドを含みます。 GPL-3.0。
  • AWS Threat Technique Catalog — Akumo の技法が相互マッピングする参照で、防御側がアクションを追跡できます。

Akumo は私が BlueSquadron で書き、メンテナンスしているツールなので、これは中立なレビューではなく、 作者が設計を説明するものです。上記はすべて現在のリポジトリに基づきます。v1 のスコープ、プロバイダー 対応、ロードマップ項目は今日時点で文書化されているもので、今後動きます。「見えない=不在ではない」、 構造的性質としての安全、システムとしての台帳 — この枠組みは私の設計の考え方であって、誰かの公式見解 ではありません。