Watch one permission become an admin path.
The real engine on bundled synthetic snapshots. Pick a scenario; everything below is computed from the files, not scripted.
The pull request
Check failedThe same one-line change as a pull request on snapshots/app-prod.json, checked by the command the repository's workflow runs on every pull request. The note on the changed line and the log are that command's real output.
{"id": "f-ci-pass-app-runtime", "predicate": "iam_pass_role_to_lambda", "subject": "p-ci-deployer", "object": "r-app-runtime", "state": "true"}, {"id": "f-ci-pass-deploy-admin", "predicate": "iam_pass_role_to_lambda", "subject": "p-ci-deployer", "object": "r-deploy-admin", "state": "false"}, {"id": "f-ci-pass-deploy-admin", "predicate": "iam_pass_role_to_lambda", "subject": "p-ci-deployer", "object": "r-deploy-admin", "state": "true"},CI deploy user (build pipeline) can now run code as Deployment admin role. The proposal changes one condition: CI deploy user (build pipeline) can pass Deployment admin role to Lambda (false to true). With it, all 7 conditions on this route hold. Revoking f-ci-pass-deploy-admin on a copy removes the path and keeps 2 of 2 normal access checks. Verified in this model. Nothing was deployed or executed.
{"id": "f-ci-create-build-hook", "predicate": "lambda_create_function", "subject": "p-ci-deployer", "object": "l-build-hook", "state": "true"},1 new high-risk finding in the proposal.
Show the check's log
$ python -m attackgraph --github -- base-branch/snapshots/app-prod.json snapshots/app-prod.json AttackGraph AI 0.1.0 (attackgraph-rules-v1). Static check of synthetic snapshots; no AWS calls. Baseline: base-branch/snapshots/app-prod.json Proposal: snapshots/app-prod.json Added · High · CI deploy user (build pipeline) can now run code as Deployment admin role Route: p-ci-deployer → l-build-hook → r-deploy-admin Changed: f-ci-pass-deploy-admin, false → true at /facts/1 (line 27) Fix: revoke f-ci-pass-deploy-admin. Verified in this model; normal access kept 2 of 2. Coverage: complete Result: 1 new high-risk finding in the proposal. (exit status 1)
The pull request
Check passedThe same one-line change as a pull request on snapshots/app-prod.json, checked by the command the repository's workflow runs on every pull request. The note on the changed line and the log are that command's real output.
{"id": "f-ci-pass-app-runtime", "predicate": "iam_pass_role_to_lambda", "subject": "p-ci-deployer", "object": "r-app-runtime", "state": "true"}, {"id": "f-ci-pass-deploy-admin", "predicate": "iam_pass_role_to_lambda", "subject": "p-ci-deployer", "object": "r-deploy-admin", "state": "true"}, {"id": "f-ci-pass-deploy-admin", "predicate": "iam_pass_role_to_lambda", "subject": "p-ci-deployer", "object": "r-deploy-admin", "state": "false"}, {"id": "f-ci-create-build-hook", "predicate": "lambda_create_function", "subject": "p-ci-deployer", "object": "l-build-hook", "state": "true"},No new modelled high-risk access.
Show the check's log
$ python -m attackgraph --github -- base-branch/snapshots/app-prod.json snapshots/app-prod.json AttackGraph AI 0.1.0 (attackgraph-rules-v1). Static check of synthetic snapshots; no AWS calls. Baseline: base-branch/snapshots/app-prod.json Proposal: snapshots/app-prod.json No modelled high-risk access in either snapshot. Coverage: complete Result: No new modelled high-risk access. (exit status 0)
The engine's analysis of the change as submitted: the route it opens, the condition that flipped and the fix it verified.
1 new path to a protected role
CI deploy user (build pipeline) can now run code as Deployment admin role. Nothing was deployed: this is a static check of two synthetic snapshots.
The path it opens
CI deploy user (build pipeline) can now run code as Deployment admin role. Follow the arrows: each one is an established relationship.
In the baseline the same route was blocked because f-ci-pass-deploy-admin was false.
The path, closed by the simulated fix
f-ci-pass-deploy-admin is revoked on a copy of the proposal. The route no longer reaches the protected role.
In the baseline the same route was blocked because f-ci-pass-deploy-admin was false.
The change
New pathThe proposal flips this condition. Nothing else on the route changed.
It is the permission to hand an IAM role to an AWS service. If someone can hand a powerful role to a Lambda function they write and run, their code runs with that role's permissions. That is why this one permission matters.
Why the route works
7 of 7 holdA route only counts when every condition holds. The changed one was the missing piece.
- CI deploy user (build pipeline) can pass Deployment admin role to Lambda
- CI deploy user (build pipeline) can create Post-build hook function
- CI deploy user (build pipeline) can invoke Post-build hook function
- CI deploy user (build pipeline) controls the code that Post-build hook function runs
- Deployment admin role trusts the Lambda service
- Everything is in one AWS account
- No unresolved policy restrictions apply
What this means
Amazon BedrockAmazon Nova Pro explains the evidence in plain English. It sees placeholder IDs only and cannot change the result.
The proposed change allows principal CI deploy user (build pipeline) to pass role Deployment admin role to Lambda workload Post-build hook function, enabling CI deploy user (build pipeline) to run code as Deployment admin role. This is modeled as a high-severity impact because Deployment admin role is classified as a privileged role. Fix candidate revoke/f-ci-pass-deploy-admin, which revokes fact f-ci-pass-deploy-admin (iam_pass_role_to_lambda from CI deploy user (build pipeline) to Deployment admin role), removes this finding without affecting expected accesses ea-ci-reads-build-artifacts and ea-ci-deploys-app-runtime.
Limitations: This is a synthetic model. No changes were made to any AWS accounts. The result does not indicate a real compromise. The scenario assumes CI deploy user (build pipeline) is controlled by the change proposer, and fact f-ci-controls-build-hook-code is assumed, not observed.
This hosted page never calls Bedrock. The reply was recorded from a live call and checked claim by claim; run the app locally to generate a new one.
Deterministic summary for comparison
CI deploy user (build pipeline) can now run code as Deployment admin role. The proposal changes one condition: CI deploy user (build pipeline) can pass Deployment admin role to Lambda (false to true). With it, all 7 conditions on this route hold. Revoking f-ci-pass-deploy-admin on a copy removes the path and keeps 2 of 2 normal access checks. Verified in this model. Nothing was deployed or executed.
What the model sees
{
"analysis": {
"model_version": "attackgraph-rules-v1",
"data": "synthetic configuration JSON",
"comparison": "baseline versus proposed snapshot",
"coverage_complete": true
},
"finding": {
"id": "A1",
"impact": "privileged_role_use",
"severity": "High",
"comparison_status": "added",
"provisional": false,
"entry": "P1",
"target": "R1",
"target_classification": "privileged_role",
"baseline_state": "unreachable",
"proposal_state": "reachable"
},
"nodes": [
{
"alias": "P1",
"kind": "principal"
},
{
"alias": "R1",
"kind": "role"
},
{
"alias": "L1",
"kind": "lambda"
}
],
"witness": [
{
"step": 1,
"rule": "lambda_pass_role",
"from": "P1",
"to": "R1",
"via": "L1",
"state": "true",
"prerequisites": [
{
"id": "F1",
"predicate": "iam_pass_role_to_lambda",
"subject": "P1",
"object": "R1",
"baseline_state": "false",
"proposal_state": "true",
"changed": true
},
{
"id": "F2",
"predicate": "lambda_create_function",
"subject": "P1",
"object": "L1",
"baseline_state": "true",
"proposal_state": "true",
"changed": false
},
{
"id": "F3",
"predicate": "lambda_invoke_function",
"subject": "P1",
"object": "L1",
"baseline_state": "true",
"proposal_state": "true",
"changed": false
},
{
"id": "F4",
"predicate": "controls_workload_code",
"subject": "P1",
"object": "L1",
"baseline_state": "true",
"proposal_state": "true",
"changed": false,
"scenario_assumption": true
},
{
"id": "F5",
"predicate": "role_trusts_lambda_service",
"subject": "R1",
"baseline_state": "true",
"proposal_state": "true",
"changed": false
},
{
"id": "D1",
"check": "same_account",
"state": "true"
},
{
"id": "D2",
"check": "policy_controls_resolved",
"state": "true"
}
]
}
],
"changed_facts": [
{
"id": "F1",
"baseline_state": "false",
"proposal_state": "true"
}
],
"assumptions": [
"P1 is treated as controlled by the party proposing the change (scenario assumption).",
"Fact F4 is a scenario assumption, not an observed permission."
],
"fix_candidates": [
{
"id": "X1",
"action": "set this fact to false on an in-memory copy of the proposal",
"revokes_fact": "F1",
"removes_this_finding": true,
"verified_in_model": true,
"coverage_complete_after": true,
"high_risk_findings_after": 0,
"expected_access_after": [
{
"id": "E1",
"relationship": "object_read",
"before_fix": "pass",
"after_fix": "pass"
},
{
"id": "E2",
"relationship": "role_use",
"before_fix": "pass",
"after_fix": "pass"
}
]
}
],
"rules": {
"s3_direct_read": "Established when the subject has an effective s3:GetObject fact for the object and policy controls are resolved.",
"lambda_pass_role": "Established only when all are true for the same subject, role and workload: the subject can pass the role to Lambda, create and invoke the workload, and controls its code; the role trusts the Lambda service; all three are in one account; policy controls are resolved. The subject can then run code as the role."
},
"predicates": {
"s3_get_object": "subject has effective s3:GetObject on object",
"iam_pass_role_to_lambda": "subject can pass role object to Lambda (iam:PassRole)",
"lambda_create_function": "subject can create Lambda workload object",
"lambda_invoke_function": "subject can invoke Lambda workload object",
"controls_workload_code": "subject controls the code of object",
"role_trusts_lambda_service": "subject trust policy allows the Lambda service"
}
}The fix
Revoke f-ci-pass-deploy-admin (CI deploy user (build pipeline) can pass Deployment admin role to Lambda) on an in-memory copy of the proposal, then rerun the whole analysis.
Normal access the fix must keep
- CI deploy user (build pipeline) reads artifacts/release.zipProposed: pass
- CI deploy user (build pipeline) can use App runtime execution roleProposed: pass
Normal access the fix must keep
- CI deploy user (build pipeline) reads artifacts/release.zipProposed: pass, after the fix: pass
- CI deploy user (build pipeline) can use App runtime execution roleProposed: pass, after the fix: pass
The route after the fix
Verified in this model The path is gone and every relationship stayed resolved. The input files are unchanged.
Evidence for reviewers: every condition, pointer and check
Every condition and its JSON pointer
Step 1. p-ci-deployer runs code as r-deploy-admin through Lambda workload l-build-hook (Rule B): candidate B:p-ci-deployer->r-deploy-admin@l-build-hook is true
| State | Condition | Evidence | JSON pointer |
|---|---|---|---|
| true | p-ci-deployer can pass role r-deploy-admin to Lambda (iam:PassRole) | f-ci-pass-deploy-admin changed false to true | /facts/1 |
| true | p-ci-deployer can create Lambda workload l-build-hook | f-ci-create-build-hook | /facts/2 |
| true | p-ci-deployer can invoke Lambda workload l-build-hook | f-ci-invoke-build-hook | /facts/3 |
| true | p-ci-deployer controls the code of l-build-hook | f-ci-controls-build-hook-code scenario assumption | /facts/4 |
| true | r-deploy-admin trust policy allows the Lambda service | f-deploy-admin-trusts-lambda | /facts/6 |
| true | p-ci-deployer, r-deploy-admin and l-build-hook are in the same synthetic account | derived | /nodes/0/account_id, /nodes/2/account_id, /nodes/3/account_id |
| true | policy restrictions are declared resolved for this scenario | derived | /coverage/policy_controls |
- Entry principal p-ci-deployer is treated as controlled by the party proposing the change. This is a scenario assumption, not an inferred compromise.
- p-ci-deployer controls the code of l-build-hook (scenario assumption, fact f-ci-controls-build-hook-code).
- Declared facts stand for resolved synthetic model inputs; they are not evidence that AWS would authorise the same request in a real account.
Coverage
| Snapshot | Coverage | Rule A: direct S3 read | Rule B: role use via Lambda | Policy controls | Unmodelled mechanisms |
|---|---|---|---|---|---|
| Baseline | complete | 2 established, 2 blocked, 0 unresolved | 1 established, 2 blocked, 0 unresolved | all 5 resolved | none |
| Proposed | complete | 2 established, 4 blocked, 0 unresolved | 2 established, 2 blocked, 0 unresolved | all 5 resolved | none |
Every fact that changed
| Fact | Statement | Baseline | Proposed | Pointer |
|---|---|---|---|---|
f-ci-pass-deploy-admin | p-ci-deployer can pass role r-deploy-admin to Lambda (iam:PassRole) | false | true | /facts/1 |
Full report
Download the Markdown report with every finding, pointer, coverage issue and assumption. Engine 0.1.0, model attackgraph-rules-v1, analysis 56bc16da787997e8.
The change closes 1 path and opens none
Every relationship resolved. Complete for the declared synthetic model, not for a real AWS account.
The path it closes
CI deploy user (build pipeline) can no longer run code as Deployment admin role. The red arrow is the relationship the second snapshot removes.
The change
Path closedThe second snapshot flips this condition back.
It is the permission to hand an IAM role to an AWS service. If someone can hand a powerful role to a Lambda function they write and run, their code runs with that role's permissions. That is why this one permission matters.
What the route needed
7 of 7 holdEvery condition held in the first snapshot. The second one takes away the changed one.
- CI deploy user (build pipeline) can pass Deployment admin role to Lambda
- CI deploy user (build pipeline) can create Post-build hook function
- CI deploy user (build pipeline) can invoke Post-build hook function
- CI deploy user (build pipeline) controls the code that Post-build hook function runs
- Deployment admin role trusts the Lambda service
- Everything is in one AWS account
- No unresolved policy restrictions apply
What this means
Amazon BedrockAmazon Nova Pro explains the evidence in plain English. It sees placeholder IDs only and cannot change the result.
CI deploy user (build pipeline) can no longer run code as Deployment admin role. The second snapshot changes: CI deploy user (build pipeline) can pass Deployment admin role to Lambda (true to false). Nothing was deployed or executed.
Live Amazon Bedrock explanations run in the local app. The hosted page makes no AI calls.
What the model sees
{
"analysis": {
"model_version": "attackgraph-rules-v1",
"data": "synthetic configuration JSON",
"comparison": "baseline versus proposed snapshot",
"coverage_complete": true
},
"finding": {
"id": "A1",
"impact": "privileged_role_use",
"severity": "High",
"comparison_status": "removed",
"provisional": false,
"entry": "P1",
"target": "R1",
"target_classification": "privileged_role",
"baseline_state": "reachable",
"proposal_state": "unreachable"
},
"nodes": [
{
"alias": "P1",
"kind": "principal"
},
{
"alias": "R1",
"kind": "role"
},
{
"alias": "L1",
"kind": "lambda"
}
],
"witness": [
{
"step": 1,
"rule": "lambda_pass_role",
"from": "P1",
"to": "R1",
"via": "L1",
"state": "true",
"prerequisites": [
{
"id": "F1",
"predicate": "iam_pass_role_to_lambda",
"subject": "P1",
"object": "R1",
"baseline_state": "true",
"proposal_state": "false",
"changed": true
},
{
"id": "F2",
"predicate": "lambda_create_function",
"subject": "P1",
"object": "L1",
"baseline_state": "true",
"proposal_state": "true",
"changed": false
},
{
"id": "F3",
"predicate": "lambda_invoke_function",
"subject": "P1",
"object": "L1",
"baseline_state": "true",
"proposal_state": "true",
"changed": false
},
{
"id": "F4",
"predicate": "controls_workload_code",
"subject": "P1",
"object": "L1",
"baseline_state": "true",
"proposal_state": "true",
"changed": false,
"scenario_assumption": true
},
{
"id": "F5",
"predicate": "role_trusts_lambda_service",
"subject": "R1",
"baseline_state": "true",
"proposal_state": "true",
"changed": false
},
{
"id": "D1",
"check": "same_account",
"state": "true"
},
{
"id": "D2",
"check": "policy_controls_resolved",
"state": "true"
}
]
}
],
"changed_facts": [
{
"id": "F1",
"baseline_state": "true",
"proposal_state": "false"
}
],
"assumptions": [
"P1 is treated as controlled by the party proposing the change (scenario assumption).",
"Fact F4 is a scenario assumption, not an observed permission."
],
"fix_candidates": [],
"rules": {
"s3_direct_read": "Established when the subject has an effective s3:GetObject fact for the object and policy controls are resolved.",
"lambda_pass_role": "Established only when all are true for the same subject, role and workload: the subject can pass the role to Lambda, create and invoke the workload, and controls its code; the role trusts the Lambda service; all three are in one account; policy controls are resolved. The subject can then run code as the role."
},
"predicates": {
"s3_get_object": "subject has effective s3:GetObject on object",
"iam_pass_role_to_lambda": "subject can pass role object to Lambda (iam:PassRole)",
"lambda_create_function": "subject can create Lambda workload object",
"lambda_invoke_function": "subject can invoke Lambda workload object",
"controls_workload_code": "subject controls the code of object",
"role_trusts_lambda_service": "subject trust policy allows the Lambda service"
}
}The fix
This path only exists in the first snapshot, so there is nothing to fix.
Evidence for reviewers: every condition, pointer and check
Every condition and its JSON pointer
Step 1. p-ci-deployer runs code as r-deploy-admin through Lambda workload l-build-hook (Rule B): candidate B:p-ci-deployer->r-deploy-admin@l-build-hook is true
| State | Condition | Evidence | JSON pointer |
|---|---|---|---|
| true | p-ci-deployer can pass role r-deploy-admin to Lambda (iam:PassRole) | f-ci-pass-deploy-admin changed true to false | /facts/1 |
| true | p-ci-deployer can create Lambda workload l-build-hook | f-ci-create-build-hook | /facts/2 |
| true | p-ci-deployer can invoke Lambda workload l-build-hook | f-ci-invoke-build-hook | /facts/3 |
| true | p-ci-deployer controls the code of l-build-hook | f-ci-controls-build-hook-code scenario assumption | /facts/4 |
| true | r-deploy-admin trust policy allows the Lambda service | f-deploy-admin-trusts-lambda | /facts/6 |
| true | p-ci-deployer, r-deploy-admin and l-build-hook are in the same synthetic account | derived | /nodes/0/account_id, /nodes/2/account_id, /nodes/3/account_id |
| true | policy restrictions are declared resolved for this scenario | derived | /coverage/policy_controls |
- Entry principal p-ci-deployer is treated as controlled by the party proposing the change. This is a scenario assumption, not an inferred compromise.
- p-ci-deployer controls the code of l-build-hook (scenario assumption, fact f-ci-controls-build-hook-code).
- Declared facts stand for resolved synthetic model inputs; they are not evidence that AWS would authorise the same request in a real account.
Coverage
| Snapshot | Coverage | Rule A: direct S3 read | Rule B: role use via Lambda | Policy controls | Unmodelled mechanisms |
|---|---|---|---|---|---|
| Baseline | complete | 2 established, 4 blocked, 0 unresolved | 2 established, 2 blocked, 0 unresolved | all 5 resolved | none |
| Proposed | complete | 2 established, 2 blocked, 0 unresolved | 1 established, 2 blocked, 0 unresolved | all 5 resolved | none |
Every fact that changed
| Fact | Statement | Baseline | Proposed | Pointer |
|---|---|---|---|---|
f-ci-pass-deploy-admin | p-ci-deployer can pass role r-deploy-admin to Lambda (iam:PassRole) | true | false | /facts/1 |
Full report
Download the Markdown report with every finding, pointer, coverage issue and assumption. Engine 0.1.0, model attackgraph-rules-v1, analysis 1b520603799eab67.
Analysis incomplete
1 relationship could not be resolved, so nothing here is a safe verdict. The unresolved condition is marked below.
A possible path, not established
A dashed arrow depends on an unknown condition, so this is not a finding and not safe either.
The change
UnresolvedThe proposal makes this condition unknown, so the engine cannot decide.
It is the permission to hand an IAM role to an AWS service. If someone can hand a powerful role to a Lambda function they write and run, their code runs with that role's permissions. That is why this one permission matters.
What is unresolved
6 of 7 holdOne condition is unknown, so the engine will not call this route open or closed.
- CI deploy user (build pipeline) can pass Deployment admin role to Lambda
- CI deploy user (build pipeline) can create Post-build hook function
- CI deploy user (build pipeline) can invoke Post-build hook function
- CI deploy user (build pipeline) controls the code that Post-build hook function runs
- Deployment admin role trusts the Lambda service
- Everything is in one AWS account
- No unresolved policy restrictions apply
What this means
Amazon BedrockAmazon Nova Pro explains the evidence in plain English. It sees placeholder IDs only and cannot change the result.
It is unresolved whether CI deploy user (build pipeline) can run code as Deployment admin role. It is unknown whether CI deploy user (build pipeline) can pass Deployment admin role to Lambda. An unknown condition is never treated as safe. Nothing was deployed or executed.
Live Amazon Bedrock explanations run in the local app. The hosted page makes no AI calls.
What the model sees
{
"analysis": {
"model_version": "attackgraph-rules-v1",
"data": "synthetic configuration JSON",
"comparison": "baseline versus proposed snapshot",
"coverage_complete": false
},
"finding": {
"id": "A1",
"impact": "privileged_role_use",
"severity": "High",
"comparison_status": "inconclusive",
"provisional": true,
"entry": "P1",
"target": "R1",
"target_classification": "privileged_role",
"baseline_state": "unreachable",
"proposal_state": "inconclusive"
},
"nodes": [
{
"alias": "P1",
"kind": "principal"
},
{
"alias": "R1",
"kind": "role"
},
{
"alias": "L1",
"kind": "lambda"
}
],
"witness": [
{
"step": 1,
"rule": "lambda_pass_role",
"from": "P1",
"to": "R1",
"via": "L1",
"state": "unknown",
"prerequisites": [
{
"id": "F1",
"predicate": "iam_pass_role_to_lambda",
"subject": "P1",
"object": "R1",
"baseline_state": "false",
"proposal_state": "unknown",
"changed": true
},
{
"id": "F2",
"predicate": "lambda_create_function",
"subject": "P1",
"object": "L1",
"baseline_state": "true",
"proposal_state": "true",
"changed": false
},
{
"id": "F3",
"predicate": "lambda_invoke_function",
"subject": "P1",
"object": "L1",
"baseline_state": "true",
"proposal_state": "true",
"changed": false
},
{
"id": "F4",
"predicate": "controls_workload_code",
"subject": "P1",
"object": "L1",
"baseline_state": "true",
"proposal_state": "true",
"changed": false,
"scenario_assumption": true
},
{
"id": "F5",
"predicate": "role_trusts_lambda_service",
"subject": "R1",
"baseline_state": "true",
"proposal_state": "true",
"changed": false
},
{
"id": "D1",
"check": "same_account",
"state": "true"
},
{
"id": "D2",
"check": "policy_controls_resolved",
"state": "true"
}
]
}
],
"changed_facts": [
{
"id": "F1",
"baseline_state": "false",
"proposal_state": "unknown"
}
],
"assumptions": [
"P1 is treated as controlled by the party proposing the change (scenario assumption).",
"Fact F4 is a scenario assumption, not an observed permission."
],
"fix_candidates": [],
"rules": {
"s3_direct_read": "Established when the subject has an effective s3:GetObject fact for the object and policy controls are resolved.",
"lambda_pass_role": "Established only when all are true for the same subject, role and workload: the subject can pass the role to Lambda, create and invoke the workload, and controls its code; the role trusts the Lambda service; all three are in one account; policy controls are resolved. The subject can then run code as the role."
},
"predicates": {
"s3_get_object": "subject has effective s3:GetObject on object",
"iam_pass_role_to_lambda": "subject can pass role object to Lambda (iam:PassRole)",
"lambda_create_function": "subject can create Lambda workload object",
"lambda_invoke_function": "subject can invoke Lambda workload object",
"controls_workload_code": "subject controls the code of object",
"role_trusts_lambda_service": "subject trust policy allows the Lambda service"
}
}The fix
No fix can be verified while a condition is unknown. Declare the fact as true or false, then compare again.
Evidence for reviewers: every condition, pointer and check
Every condition and its JSON pointer
Step 1. p-ci-deployer runs code as r-deploy-admin through Lambda workload l-build-hook (Rule B): candidate B:p-ci-deployer->r-deploy-admin@l-build-hook is unknown
| State | Condition | Evidence | JSON pointer |
|---|---|---|---|
| unknown | p-ci-deployer can pass role r-deploy-admin to Lambda (iam:PassRole) | f-ci-pass-deploy-admin changed false to unknown | /facts/1 |
| true | p-ci-deployer can create Lambda workload l-build-hook | f-ci-create-build-hook | /facts/2 |
| true | p-ci-deployer can invoke Lambda workload l-build-hook | f-ci-invoke-build-hook | /facts/3 |
| true | p-ci-deployer controls the code of l-build-hook | f-ci-controls-build-hook-code scenario assumption | /facts/4 |
| true | r-deploy-admin trust policy allows the Lambda service | f-deploy-admin-trusts-lambda | /facts/6 |
| true | p-ci-deployer, r-deploy-admin and l-build-hook are in the same synthetic account | derived | /nodes/0/account_id, /nodes/2/account_id, /nodes/3/account_id |
| true | policy restrictions are declared resolved for this scenario | derived | /coverage/policy_controls |
Coverage
| Snapshot | Coverage | Rule A: direct S3 read | Rule B: role use via Lambda | Policy controls | Unmodelled mechanisms |
|---|---|---|---|---|---|
| Baseline | complete | 2 established, 2 blocked, 0 unresolved | 1 established, 2 blocked, 0 unresolved | all 5 resolved | none |
| Proposed | incomplete | 2 established, 4 blocked, 0 unresolved | 1 established, 2 blocked, 1 unresolved | all 5 resolved | none |
- p-ci-deployer can run code as r-deploy-admin through Lambda workload l-build-hook: unresolved because fact f-ci-pass-deploy-admin (p-ci-deployer can pass role r-deploy-admin to Lambda (iam:PassRole)) is unknown
Every fact that changed
| Fact | Statement | Baseline | Proposed | Pointer |
|---|---|---|---|---|
f-ci-pass-deploy-admin | p-ci-deployer can pass role r-deploy-admin to Lambda (iam:PassRole) | false | unknown | /facts/1 |
Full report
Download the Markdown report with every finding, pointer, coverage issue and assumption. Engine 0.1.0, model attackgraph-rules-v1, analysis 1985aa1c5454e5bb.
These files can't be analysed yet
3 field errors found. Neither file is analysed until both are valid.
invalid-references.json /facts/1/objectreferences unknown node "r-missing-role"invalid-references.json /facts/15/objectthe object of s3_get_object must be a node of kind s3_object, but "r-deploy-admin" has kind roleinvalid-references.json /nodes/6/idduplicate node ID "r-app-runtime" (first defined at /nodes/1)
Uploads run in the local app
This hosted page is a static build of the bundled scenarios, so nothing you choose leaves your machine and no AI call is made. To analyse your own snapshots, run the app locally from the repository:
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt .venv/bin/streamlit run app.py
Snapshots follow attackgraph/snapshot.schema.json; start from fixtures/demo/.