lateral_movement_paths¶
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.
{
"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.
{
"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.