Skip to content

lateral_movement_paths

Graph · From docs/MCP_TOOLS.md on GitHub

Category graph · sensitivity confidential · capabilities read_state · readOnly true, destructive false, idempotent true, openWorld false · outputSchema yes · timeout: layer default (300 s)

Identity pivot chains. The tool builds a graph from ASSUMES_ROLE, IAM_TRUST and GRANTS_ACCESS edges only. Starting points are start when given, else every internet-exposed asset plus every CLOUD_ACCOUNT asset whose metadata marks it external. From each start it takes the shortest path to every node within max_depth hops that has no further identity edge (a leaf). Chains are ranked by the highest crown-jewel weight on the chain, then by length. Starts that have no identity edge are skipped.

Argument Type Default Constraints Description
start string "" Start from this asset; empty = every internet-exposed asset and external account.
max_depth integer 4 1..8 Longest identity chain, in hops.
max_paths integer 25 1..100 Maximum chains returned after ranking.
dataset string "" Dataset name (see list_datasets). Empty = the active dataset.

Returns paths (each with length, nodes, edge_types, summary), total_found, truncated and starting_points (distinct starts considered, including skipped ones).

Called with the arguments below, lateral_movement_paths returned this structuredContent.

{"max_paths": 4}
{
  "dataset": "sample",
  "paths": [
    {
      "length": 1,
      "nodes": [
        {
          "id": "az-vm",
          "name": "jump-vm",
          "type": "VIRTUAL_MACHINE",
          "account_id": "00000000-aaaa-bbbb-cccc-000000000001",
          "internet_exposed": true,
          "open_findings": 0
        },
        {
          "id": "az-kv",
          "name": "hub-kv",
          "type": "KEY_VAULT",
          "account_id": "00000000-aaaa-bbbb-cccc-000000000001",
          "internet_exposed": false,
          "open_findings": 0
        }
      ],
      "edge_types": [
        "GRANTS_ACCESS"
      ],
      "summary": "jump-vm -> hub-kv"
    },
    {
      "length": 2,
      "nodes": [
        {
          "id": "bastion",
          "name": "bastion",
          "type": "EC2",
          "account_id": "111111111111",
          "internet_exposed": true,
          "open_findings": 1,
          "max_severity": "HIGH"
        },
        {
          "id": "admin-role",
          "name": "bastion-admin",
          "type": "IAM_ROLE",
          "account_id": "111111111111",
          "internet_exposed": false,
          "open_findings": 0
        },
        "... 1 more"
      ],
      "edge_types": [
        "ASSUMES_ROLE",
        "GRANTS_ACCESS"
      ],
      "summary": "bastion -> bastion-admin -> orders-db-credentials"
    },
    "... 2 more"
  ],
  "total_found": 5,
  "truncated": true,
  "starting_points": 7
}

From one foothold:

Called with the arguments below, lateral_movement_paths returned this structuredContent.

{"start": "web-1"}
{
  "dataset": "sample",
  "paths": [
    {
      "length": 2,
      "nodes": [
        {
          "id": "web-1",
          "name": "web-1",
          "type": "EC2",
          "account_id": "111111111111",
          "internet_exposed": false,
          "open_findings": 1,
          "max_severity": "HIGH"
        },
        {
          "id": "app-role",
          "name": "app-role",
          "type": "IAM_ROLE",
          "account_id": "111111111111",
          "internet_exposed": false,
          "open_findings": 0
        },
        "... 1 more"
      ],
      "edge_types": [
        "ASSUMES_ROLE",
        "GRANTS_ACCESS"
      ],
      "summary": "web-1 -> app-role -> orders-db"
    },
    {
      "length": 2,
      "nodes": [
        {
          "id": "web-1",
          "name": "web-1",
          "type": "EC2",
          "account_id": "111111111111",
          "internet_exposed": false,
          "open_findings": 1,
          "max_severity": "HIGH"
        },
        {
          "id": "app-role",
          "name": "app-role",
          "type": "IAM_ROLE",
          "account_id": "111111111111",
          "internet_exposed": false,
          "open_findings": 0
        },
        "... 1 more"
      ],
      "edge_types": [
        "ASSUMES_ROLE",
        "GRANTS_ACCESS"
      ],
      "summary": "web-1 -> app-role -> prod-data"
    },
    "... 2 more"
  ],
  "total_found": 4,
  "truncated": false,
  "starting_points": 1
}

Related: cross_account_edges, the cross_account_trust_review and blast_radius_assessment prompts.