我们解读真实发生过的公开事故,但视角不是新闻的重播,而是「在你的环境里该如何防住」。本文是 基于公开记录(监管机构、报道、学术分析、官方公告)的解读。出处在文末注明。
- 对象
- Capital One(美国大型银行)
- 公布
- 2019 年 7 月 29 日(发觉 7 月 19 日/入侵 3 月)
- 手法分类
- 以 SSRF 为起点,窃取云端凭证并向外带出
- 影响规模
- 美·加约 1 亿 600 万人的申请数据(含 SSN 约 14 万、关联银行账号 约 8 万)
- 根本原因
- SSRF 缺陷 + 元数据服务端点不设防 + IAM 角色权限过大,多层接连崩塌
- 主要对策
- 出站目标白名单、IMDSv2、IAM 最小权限构成的多层防御
发生了什么(用大白话讲)
Capital One 把部分申请处理跑在云上。在其前端、本应属于防御方的一个组件(以反向代理/WAF 身份运行)存在 SSRF 缺陷——能让服务器自身向外部指定的目标发起请求。
云端的虚拟机有一个特殊目标,叫只能从内部访问的「元数据服务端点」,向它查询就会返回分配给该机器的权限所对应的临时密钥。攻击者用 SSRF 抵达这个内部目标,拿到了密钥。而该密钥所绑定的 IAM 角色(公开记录中报道为 ISRM-WAF-Role)拥有 可大范围读取存储的过大权限,于是他们把约 700 个存储区域(S3 存储桶)的内容原样复制后带走。
存在 SSRF 时,「只能从内部访问」的端点也能从外部访问
元数据服务端点的防护建立在「外部无法抵达」这一前提之上。然而 SSRF 是一种让服务器自身代为访问的攻击,它会打破这一前提。只要存在一个 SSRF 缺陷,「因为限定内部所以安全」就不再成立。
攻击的各个阶段与拦截方法
关键在于:这是一条四步的连锁,而 每一步都本有拦截点。请不要把它读成攻击步骤,而要读成在哪里本可被拦下。
① 起点:SSRF
让服务器代为向任意目标发起请求的缺陷。
⊘ 拦截点:把出站目标改为白名单方式
② 抵达内部的元数据服务端点
本应限定内部的目标,却被经由 SSRF 抵达。
⊘ 拦截点:IMDSv2(强制令牌+跳数限制)
③ 取得 IAM 临时密钥
挂在机器上的角色的临时凭证被返回。
⊘ 拦截点:把角色权限最小化(禁止整体读取存储)
④ 把存储(S3)一次性整体复制
把约 700 个区域的内容原样向外带出。
⊘ 拦截点:出站(egress)管控+检测异常的大量读取
已公布的时间线
2019-03
云环境遭到非法访问(后来才查明)。2019-07-17
外部举报(GitHub 上的帖子)指出异常。2019-07-19
Capital One 通过内部调查确认遭入侵。2019-07-29
对外公布。一名前 AWS 工程师的嫌疑人被 FBI 逮捕。2019-11
AWS 发布 IMDSv2,作为针对 SSRF 的多层防御。2020-08
美国 OCC 处以约 8,000 万美元罚款,指出其在迁云之前的风险评估存在缺失。
根本原因:多道防御同时缺失
把这起事故归结为「SSRF 的错」,就会重演。实际上其本质是 三道防御接连失守。
失守的构成(事故当时)
- 入口处不校验出站目标(可向任意目标代为发起请求)
- 元数据服务端点无需令牌就返回密钥(旧方式)
- 机器的 IAM 角色拥有可大范围读取存储的过大权限
守住的构成(杜绝重演)
- 把出站目标限定为白名单方式,拒绝对内部地址的代为访问
- 元数据采用 IMDSv2:强制会话令牌+跳数限制,阻断代为抵达
- IAM 角色采用最小权限:只给所需存储桶上所需的操作
责任共担:云端使用方必须自己负责的部分
云一方负责底层基础设施的安全,但修复 SSRF、设计 IAM 权限、保护元数据是使用方的责任。这起事故被处罚的理由也是「迁云之前的风险评估存在缺失」。使用云本身并无问题,关键在于是否把属于自己责任的部分彻底设计到位。
在你的环境中杜绝重演
以下是无论规模大小都奏效、按优先级排列的对策。只要你有哪怕一个「接收 URL 并去拉取」「代为获取 Webhook 或图片」的功能,这就是你自己的事。
把出站目标改为「白名单方式」(在第一步拦住 SSRF)
对于服务器代为访问用户提供的 URL 的处理,要限定为仅限已许可的目标。对内部地址(元数据服务端点或私有网络)的抵达默认拒绝。SSRF 词条里汇总了校验时容易漏掉的坑(跟随重定向、DNS 重解析等)。
对元数据强制使用 IMDSv2
把云端的元数据服务端点限定为强制令牌、带跳数限制的新方式(AWS 上即 IMDSv2)。仅此一项,就能让从 SSRF 窃取密钥的难度大幅提升。要点是禁用旧方式。
把 IAM 角色设为最小权限(限制损失)
为了在密钥万一泄露时把损失控制在有限范围内,给机器或服务挂载的权限要收紧到只给所需对象上所需的操作。「先一股脑给存储全权限」会把一次入侵变成全量数据外泄。
准备好出口(egress)管控与异常检测
把外向通信限定到必要的目标,并能检测出诸如短时间内大量读取之类的异常。即便第一步没能防住,也要留下一层能在带出阶段察觉的防线。
与本站设计理念相通之处
本站自身在处理用户 URL 的功能上,也以仅限已验证域名为前提来设计(SSRF-safe by design)。这起事故清楚地说明了我们所坚守的原则为何必要:校验输入、使用最小权限、不要以为「内部」就等于安全。 即便使用便利的云平台,属于自己责任的部分也必须由自己设计到位。
出处(公开记录)
本文的事实依据以下公开信息。我们不涉及攻击的复现步骤或载荷,只聚焦于 防御的教训。
- Krebs on Security「What We Can Learn from the Capital One Hack」(2019) — krebsonsecurity.com
- ACM Transactions on Privacy and Security「A Systematic Analysis of the Capital One Data Breach」— dl.acm.org
- CyberScoop「US financial regulator fines Capital One $80 million over data breach」(2020) — cyberscoop.com
- Capital One 官方新闻稿(向 SEC 提交的 8-K, 2019) — sec.gov
接下来阅读
- 术语:什么是 SSRF(本事故的起点,以及校验时的坑)
- 事故:一个被放任的 CVSS 10.0 终被利用的故事(个人开发的案例)
- 对策:把最小权限与机器监控纳入日常运维