read-only aws lockdowns: audit-row without argv gate is a leak surface, not a boundary #54
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally filed by @coilysiren on 2026-05-05T11:21:53Z - https://github.com/coilysiren/coily/issues/58
Proposal
Extend the
coily ops awsargv gate to cover read-only sub-verbs against sensitive resource patterns (buckets, roles, regions, account boundaries). Today read-only aws verbs land an audit row but pass through without argv validation. The audit row documents the leak; it does not stop it.Why
Surfaced 2026-05-05 while seeding
coily-ops-aws-meta's anti-signal catalogue. The framing "read-only aws verbs do not need an audit row" is false (audit is the trail), but the inverse is also wrong: "audit row is sufficient for read-only verbs" treats the trail as the gate. It is not. Read-only invocations exfiltrate (s3 lson a sensitive bucket), confirm threat-model state (sts get-caller-identityafter an unauthorized role assumption), and enumerate (ec2 describe-*,iam list-*).The boundary needs a pre-send deny on read-only patterns the operator did not intend to expose. iam scoping is wider than the runtime needs (lazy role reuse) and CloudTrail is post-hoc - neither is the layer that prevents the read from happening in the first place.
Mechanical scope
pkg/policylearns a read-only-pattern deny list for aws (sensitive bucket name globs, role-arn patterns, account boundaries).ops.aws.read.deniedvsops.aws.read.allowedor similar).cmd/coily/security_claims_test.gofamily pin the new claims so prose and runtime move together.SECURITY.mdadding the read-only-deny claim.Out of scope
Originating thread
coily-ops-aws-metaskill seeding, 2026-05-05. The skill's anti-signal catalogue (section 1) cites this issue once filed.