Build1 publisher2 min readPublished
A WAF role with account-wide S3 access turned one SSRF into 106 million records
Trust Boundary's walkthrough of the 2019 Capital One breach puts the weight on the IAM role attached to the firewall instance, and says the OCC consent order that followed does not mention server-side request forgery at all.
The Engineer · Build desk

What happened
- The access ran on 22 and 23 March 2019 and was not found until 17 July, after an outside party emailed Capital One's responsible disclosure address.
- The way in was server-side request forgery against a misconfigured web application firewall running on EC2, which handed back IMDSv1 credentials for the role attached to the instance.
- The IAM role on that firewall instance could read S3 buckets across the whole account, and the personal data of 106 million people came out of them.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
- exposure An SSRF hands the attacker whatever the server can reach, and on EC2 that always includes the link-local metadata address, so a web-facing instance exposes the full span of its attached role.
- constraint Fix the request-forgery hole and the credentials can still read everything they could read before; scoping the role is separate work, usually with a separate owner and a separate change window.
- decision Discovery came from an outside email to a disclosure address, so whether anyone reads and routes that inbox quickly is an operational decision.
Every EC2 instance can reach 169.254.169.254, and nothing on the internet can route to it. It is link-local, so it exists only from the instance's own point of view, and what it returns includes temporary credentials for whatever IAM role is attached [12]. In 2019 that service, since named IMDSv1, answered any plain HTTP GET that originated on the instance, with no token and no authentication [13]. So the requirement for credentials collapsed to one thing: the ability to make the instance issue a request. A misconfigured web application firewall supplied that [3].
An IAM role is a set of permissions, and anything running on the instance can use them with no password and no key on disk [21]. The FBI complaint describes three commands. The first obtained security credentials. The second listed the names of folders and buckets. The third copied data out [14]. Trust Boundary's argument is that the third was a copy: authenticated, permitted, and at the API level indistinguishable from legitimate traffic [16].
A web application firewall inspects traffic, matches patterns, and blocks or forwards requests [11]. Trust Boundary allows a plausible reason for it to reach S3 for rule sets, configuration and logging, and none for it to enumerate storage across the account and read the contents [20]. The role on that instance could do both [4]. Credit card applications going back to 2005 were in the buckets it could read [10]. In my view that grant, not the firewall rule, is the first line item in a review.
Capital One's own statement says the company encrypts as standard [18], and the credentials that could read the objects could also decrypt them [26]. The statement puts it this way: "Due to the particular circumstances of this incident, the unauthorized access also enabled the decrypting of data." [17]
Eighteen months after the breach [19], the Office of the Comptroller of the Currency imposed an $80 million civil money penalty [5]. According to Trust Boundary, the consent order does not mention server-side request forgery at all [7]. The piece names OCC Consent Order 2020-036 among its primary sources but does not quote the order's findings [8][25]. Add the $190 million class action settlement [6] and the disclosed money reaches $270 million [22], about $2.55 for each of the 106 million people whose data was taken [23].
One detail to keep straight if you cite this incident in a design doc: the role appears in the indictment only as *****-WAF-Role, with the rest redacted, so a full role name in anyone's write-up is a guess [15].
What to watch
- Publication of the consent order's findings would show whether governance or IAM scope carried the $80 million penalty.
- Write-ups that quote a full WAF role name, when the indictment redacts everything but *****-WAF-Role.
- The MIT Sloan case study, cited as a primary source, on how the role's S3 permissions came to span the account.