Build1 distinct publisher2 min readUpdated
A CloudGoat walkthrough moves an API key through SNS into API Gateway and back out of Lambda. Access Analyzer and PMapper both report the user has no access.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
A permission graph is assembled from edges that policies name. IAM Access Analyzer and PMapper both report that the IAM user cannot read any secret in the account [3], and on the evidence those tools consume they are correct: nothing grants that user Secrets Manager access [2], and no statement anywhere joins SNS to Secrets Manager [6]. The join is an API key sitting in a message payload [5]. A key in a payload is data, and data is not an edge, so there is no node to traverse and the answer comes back clean.
The deny list is the part worth studying, because it is what a careful reviewer actually produces. The user's policy allows `apigateway:GET` on `Resource: "*"` and then denies it on seven specific patterns covering API keys, method bodies and integration internals [7]. Run those seven patterns against the 24 management paths the prover walks, and 21 stay reachable [14]: three blocked [16], which leaves 87.5 percent of the enumerated surface open [17]. The paths that matter are among the open ones. `/restapis` lists the API IDs, `/restapis/{id}/resources` lists the paths, `/restapis/{id}/stages` lists the stages, and with those three the attacker has the full URL [15]. Three calls of reconnaissance against a documented chain of seven [18]. The integration body, the thing the deny list did protect, was never on the route.
The result is awkward for the tooling that produced it. Stave's existing broad-subscribe control inspects the topic's resource policy [13], and this topic has no resource policy, which in AWS leaves the identity policy as the sole gate [8]. A control that reads resource policies has nothing to read. The SAT verdict came instead from three facts held together: the identity policy, the missing topic policy, and an annotation on the asset recording that the topic publishes an `api_key` [12], with the witness naming both the topic and the REST API the key targets [11].
One synthetic CloudGoat user in one lab account is not a fleet [1], and the modelling work here is a prover run over a writeup, not a survey of production estates [10]. What generalises is narrower and more useful than a new attack class: the grant that ends up exercised is the Lambda execution role [9], written for the function, and it becomes the effective permission set of whoever can obtain the key that fronts it. Nothing in the four service configurations is misconfigured by its own checklist [6]. The defect is the pairing of a subscribable channel with a payload that carries authentication material, and no per-service review has a place to record that pairing.
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
The data-flow annotation publishes_credential_type=api_key on the topic asset is what makes this a security concern rather than a subscription pattern concern.
Stave's existing broad-subscribe control checks the topic's resource policy, whereas this issue lives in the IAM identity policy plus the absence of a topic policy plus the data-flow fact about what the topic publishes.
The synthetic IAM user cg-sns-user-cgidxi93qpes3g has zero permissions on Secrets Manager.
Run through IAM Access Analyzer, and again through PMapper, the identity is confirmed to have no access: the IAM user cannot read any secret in the account.
The chain runs through four services: SNS publishes an API key as a message payload, the user subscribes to the topic and receives the key, the key authenticates to an API Gateway, the gateway's Lambda integration reads from Secrets Manager, and the secret comes back as the HTTP response body.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Detailed but single-source and self-reported
The technical substrate is unusually concrete for a blog post: verbatim IAM Deny JSON, four per-service configuration blocks, named topic and REST API ARNs, and pasted Z3 verdicts including a SAT witness and a 24-path coverage listing. It is also entirely one publisher, one synthetic CloudGoat account, and prover output produced by the author's own tool with no independent reproduction, and the headline generalization about scanners is asserted rather than demonstrated across tools.
No adoption signal in cluster
The supplied source documents a synthetic CloudGoat exercise and an example directory in the author's Stave repository. There is no release, deployment, customer, download, benchmark or usage disclosure evidence, and no indication that the chain or the prover has been exercised outside the writeup, so adoption cannot be scored.
Framing outruns the lab-scale evidence
The mechanism, configs and prover output are real and specific, but the packaging — 'Zero Permissions on Secrets Manager. Full Access to Your Secrets' plus 'no permission-based scanner catches' — generalizes a deliberately vulnerable training account tested against two tools into a claim about permission-based scanning as a class. The concrete deny-coverage and seven-call findings are not overstated; the categorical scanner claim is.
Vendor capability demo against named incumbents
The article resolves into a demonstration of the author's Stave prover, citing its example path, its existing broad-subscribe control and its data-flow annotations, while the framing device is the failure of two named third-party tools. That is a direct commercial interest in the conclusion that permission-based analysis is insufficient, disclosed only implicitly; the post's only explicit disclosure concerns AI-assisted formatting.
Mechanism credible, scope and impact unverified
Confidence is moderate: the AWS mechanics described (IAM-only gate absent a topic policy, API-key-only auth, Lambda execution-role secret reads) are internally consistent and the arithmetic derivations follow from published output, so the specific chain is plausible. Scope is what is uncertain — one publisher, one synthetic account, self-run tooling, no prevalence or detection data, and no adoption dimension to cross-check against.
build
Two Actions, One Loose Policy: The Bedrock Wildcards That Widen A Least-Privilege Grant1 distinct publisher
build
DynamoDB vector indexes remove the second datastore, and the GSI permutation trap with it1 distinct publisher
build
Two mechanisms, one vCPU floor: why db.t3.micro cannot meet a 1-second RPO on RDS1 distinct publisher
build
One ALB rule, zero legacy commits: shipping a feature around an app nobody will touch1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 24, 2026