RSAC议题解读-通过影子资源攻击AWS帐户
1. 前言
在2024年的Blackhat会议上,三名研究人员分享了一个名为《Breaching-AWS-Accounts-Through-Shadow-Resources》的主题。该主题主要探索一种称为“影子资源”的新型攻击,以及如何通过这些资源攻击AWS帐户。2. 背景
首先,让我们谈谈什么是影子资源: 影子资源是指在AWS环境中自动或半自动生成的资源,通常在没有用户知识的情况下创建,并且帐户所有者可能会忽略。 在AWS中,阴影资源可以是为支持各种服务而创建的AWS S3存储桶。以AWS CloudFormation服务为例,AWS CloudFormation是AWS提供的工具,可以帮助用户快速创建云资源。一般而言,创建AWS资源时,您可以使用CLI,API或各种SDK直接创建资源或通过控制台页面单击它们。这些方法非常适合创建单层资源。如果您想使用它们来管理整个团队或公司的资源,则似乎并不令人满意。 CloudFormation是一种专门用于管理AWS资源的工具,可以清楚地描述和修改资源。这是一个模板示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Awstemplate Formatversion:'2024-09-25' Description:创建用于查询服务的ELB 参数: envname: type:字符串 Description:当前运行环境的名称 Resources: AWSCFELB: type: AWS3360:ElasticLoadBalancing:loadBalancer 属性: loadBalancername:加入 - ''' - AWS-CF-LB- - !ref'envname' 子网:'xxxxx'
SecurityGroups:'Yyyy'
Crosszone: True
听众:
-LoadBalancerPort:'2443'
InstancePort:'3443'
协议: TCP
Instance Protocol: TCP
Connectionsettings:
idletimeout: 300
在:
template它可以是本地文件或放置在S3上的文件
stack:管理资源集合,模板对应于堆栈
changeset:描述了对堆栈的修改
可以将简单的理解与K8S POD的配置文件进行比较,并且可以通过Kubectl Apply XX.YAML在批处理中创建多个资源。
当使用AWS CloudFormation时,当用户首先通过AWS控制台在新区域中创建新堆栈时,该服务会自动触发AWS创建S3存储桶以存储用户的云形式模板。

众所周知,AWS S3存储桶名称必须是唯一的。如果用户创建一个名为My-Bucket的水桶,则没有其他用户可以创建具有相同名称的新存储桶。
但是,对于提供云形式的S3存储桶,除区域名称外,所有AWS区域的存储桶名称相同。这里有一个安全问题,如果外部攻击者以某种方式猜测Cloudformation S3存储桶的名称,并在受害者面前的其他区域中创建一个新的存储桶,从而实现了劫持效果。研究发现,攻击者确实先发出了一个新的存储桶,并等待受害者在新区域中使用云形式服务,从而将攻击者控制的S3存储桶作为Cloud Formation服务的一部分。通过上述操作,攻击者可以使用S3存储桶执行代码,修改或窃取数据,甚至在没有用户知识的情况下完全控制受害者的帐户。
3. 使用S3 Bucket作为影子资源
S3存储桶是一个在线存储容器,可以管理类似于基于云的硬盘驱动器的文件,图像,视频和其他数据。使用AWS管理控制台中的CloudFormation上传模板文件时,CloudFormation会自动生成S3存储桶,而无需遵循特定命名规范的明确说明:

前缀:这是通过AWS管理控制台上传模板时为CloudFormation服务创建的S3存储桶的前缀(“ CF-TEMPLATES”),在所有AWS帐户中相同
哈希:包含字母数字字符的随机12个字符哈希值(A-Z,0-9)
区域:使用云形式服务表示区域的名称
研究发现,在不同可用性区域中为同一帐户创建模板将生成具有相同前缀和哈希值的云形式的S3存储桶名。唯一的区别是区域部分。例如,如果一个帐户在US-EAST-1区域使用云形式,则相关的存储桶名是CF-TEMPLATES-A3GJV31AP90H-US-EAST-1。当同一帐户在另一个区域(例如EU-West-2)中使用CloudFormation时,AWS创建一个名为CF-Templates-A3GJV31AP90H-US-EAST-2的新存储桶。唯一的区别是区域名称。

简而言之,CloudFormation的存储桶名称由三个部分组成:恒定服务名称前缀CF-TEMPLATES-,一个12个字符的随机字符串,包含4,738,381,338,338,321,616,616,896可能的选项(不可能的蛮力猜测)和区域名称(公共信息名称)(公共信息,所有33 AWS AWS AER可用性Zones均已知道)。那么攻击者如何获得哈希值?我们将在本文的后续部分中讨论此问题。
4. AWS CloudFormation 漏洞:cf-templates-{Hash}-{Region}
目前,我们有两个主要问题需要解决:如果另一个用户创建了带有指定名称的存储桶会发生什么?
如何猜测哈希值?我们应该将其视为秘密吗?
首先,让我们看一下创建云形式的特定过程:

1。用户选择上传模板文件以启动云形式以创建资源。基础过程将调用CreateUploadBucket API请求以创建一个存储桶。
2。如果不存在用户的S3存储桶,则CloudFormation将自动创建一个名为:cf-templates- {hash} - {region}的S3存储桶。如果存储桶已经存在,则云形式将直接使用原始存储桶。
3。服务器返回S3存储桶名。
4。系统调用PutObject API请求将模板文件存储在S3存储桶中。
5。验证和其他操作将在后台执行(例如,GetTemplateSummary和DeficteStacks)。
6.启动CreateStack API请求并创建堆栈资源。
CloudFormation存储桶已被攻击者占用会的情况
假设攻击者知道受害者云形式桶的哈希部分,则受害人在US-EAST-1可用性区域中创建了一个桶,因此攻击者可以在受害人尚未使用的其他可用区域中创建一个具有可预见名称的水桶。当受害者首次尝试在欧盟-West-2中部署新的云形式资源时,将发生以下一系列事件:
1、受害者启动操作:受害人在帐户A中运行并上传云形式模板,以通过AWS管理控制台启动该过程。 CloudFormation Service将检查是否存在cf-templates- {hash} - {region}的S3存储桶。如果不存在,它将尝试创建一个。
** 2。唯一的存储桶名称:**由于所有AWS帐户中S3存储桶名称在全球范围内都是唯一的,因此目标存储桶名已被占据。
3、CloudFormation ERROR:当受害者帐户中的云形式服务试图创建S3存储桶并将模板文件上传到存储桶时,该服务遇到了问题。尽管该服务识别存储桶已经存在,但上传过程失败,云形式返回错误,通常是“访问”,这表明该服务未能将模板文件上传到现有的S3存储桶中。

这个问题可以视为拒绝服务(DOS)攻击。之所以发生这种情况,是因为S3存储桶设置为默认情况下阻止所有公共访问和上传,因此受害者无权对攻击者创建的存储桶执行操作。那么如何升级伤害呢?
4.2. 存储桶设置为公开读写
首先设置了公众读写的存储桶权限:
然后,让我们看一下云形式运行的整个过程。在受害者的帐户中,CloudFormation Service试图创建一个S3存储桶并将模板文件上传到存储桶中,但是由于存储桶已经存在(在攻击者的帐户中),因此它将信任存储桶,访问存储桶并将模板文件上传到存储桶中。
这导致云形式信息泄露漏洞,攻击者可以读取受害者云形式服务为恶意S3存储桶编写的模板文件。如果云形式模板包含敏感信息,例如环境变量,凭据等,则漏洞可能会产生更严重的影响。
4.3. 编辑CloudFormation模板
如何进一步扩大伤害?研究发现,犀牛实验室提出了一种资源注入技术,这简直就是:创建lambda函数并使用AWS的putbucketnotification事件触发它以修改传入的云形式模板(插入恶意代码,例如赋予攻击者管理员管理员特权)。因此,只要将文件上传到文件库,lambda函数就会自动修改它。
4.4. 如何获取哈希值
如上一节所述,通过AWS控制台使用的云形式服务使用的S3存储键名包括以下格式:cf-templates- {hash} - {region}。哈希值由12个字符(A-Z,0-9)的字母数字序列组成,可以产生4,738,381,338,321,616,616,896可能的组合,因此不可能简单地猜测或野性力。当前,无法通过算法计算特定用户的哈希值。但是,通过使用代码托管平台(例如GitHub)搜索发现了大量泄漏的哈希值:
研究发现,除了在云形式中存在遗愿问题外,在各种产品中发现了类似的问题,一些AWS服务创建了具有可预测名称的S3存储桶。这些服务不使用哈希值,而是使用AWS帐户ID作为这些存储桶的唯一标识符。例如,AWS服务使用的存储符名称存在以下规则:{service prefix} - {AWS帐户ID} - {availobility Zone}。经过分析和研究,最终发现了6个AWS服务问题。

5. AWS Glue漏洞:aws-glue-assets-{Account-ID}-{Region}
AWS GLUE是一种无服务器数据集成服务,可让使用分析的用户轻松发现,准备,移动和集成来自多个来源的数据。您可以将其用于分析,机器学习和应用程序开发。它还包括用于编写,运行任务和实施业务工作流程的其他生产力和数据操纵工具。
研究发现,当用户使用AWS管理控制台和Visual ETL工具创建作业时,S3存储桶用于存储胶水作业,胶水作业主要是由Glue执行的Python脚本。
胶水服务会根据以下命名规则自动为用户创建此S3存储桶:AWS-Glue-Assets- {Account-ID} - {region}。

攻击想法与上面提到的想法相同,因此我不会在这里详细说明:

一个有趣的现象是,即使攻击者修改了胶水脚本的内容,当受害者在AWS管理控制台中查看功能时,显示的内容仍然是正常的,而不是修改后的内容,但是受害者的胶水服务仍将运行修改后的恶意脚本,猜测它是由CACH机制引起的。
6. AWS EMR漏洞:aws-emr-studio-{Account-ID}-{Region}
Amazon Elastic MapReduce(Amazon EMR)是一款Web服务,可以轻松,快速和成本效益地处理大量数据。
研究发现,当用户使用EMR服务和EMR Studio创建工作室时,EMR服务会自动生成S3存储桶。 S3存储桶的命名过滤器为:AWS-EMR-Studio- {Account-ID} - {region}。

攻击想法:

一旦受害者的EMR服务将文件写入攻击者的存储库,攻击者可以通过注入恶意代码来利用它。在这种情况下,lambda功能将恶意代码注入了jupyter笔记本(.IPYNB)文件,该文件由受害者的EMR服务写入攻击者的存储桶。当用户在EMR Studio中打开笔记本时,可能会发生跨站点脚本(XSS)攻击。例如,攻击者可以将用户重定向到欺骗的AWS登录页面,从而窃取凭据。
有趣的是,在此服务下,AWS在政策中执行检查条件,即检查EMR使用的S3存储桶的AWS:ResourCeaccount,以确保S3存储桶属于受害者的帐户。如果有所不同,将触发警报。

在这一点上,用户仍然有两个选择继续创建Studio:

无论用户选择哪种方法,都可以成功创建工作室。
7. AWS SageMaker漏洞:sagemaker-{Region}-{Account-ID}
AWS SageMaker是一项用于大规模构建,培训和部署机器学习模型的服务,为整个工作流提供了全面的工具。 Amazon Sagemaker Canvas是生态系统的一部分,这是一个无编码可视化平台,使非开发人员和业务分析师能够轻松开发,训练和部署模型。该研究发现,当用户创建SageMaker画布时,SageMaker服务会自动创建一个S3存储桶来存储服务使用的文件。此S3存储桶的命名规则是:sagemaker- {region} - {account-id}。

攻击想法如下:

每当SageMaker Canvas用户尝试创建数据集或将数据导入到服务中时,此数据都会写入攻击者的S3存储桶(在Canvas/Default- {time}/*)下。然后,SageMaker Canvas Service将为用户使用此数据,从而带来以下重大风险:
8. AWS CodeStar 漏洞:aws-codestar-{Region}-{Account-ID}
AWS CODESTAR是一项通过集成用于编码,构建和部署应用程序的AWS开发工具来简化项目管理的服务。创建CodeStar项目时,CodeStar Service会自动为使用的项目生成S3存储桶。此S3存储桶的命名规则是:AWS-Codestar- {region} - {account-id}。
攻击想法如下:

与上一个情况类似,如果攻击者提前注册了存储牌名称,则合法用户将无法使用该服务并在尝试创建CodeStar项目时接收消息“项目创建失败”。这会导致拒绝服务(DOS)攻击,攻击者阻止用户使用特定的AWS服务。

9. AWS Service Catalog漏洞:cf-templates-{Hash}-{Region}
AWS服务目录允许组织在AWS上进行集中管理,创建和分发IT服务,包括虚拟机映像,服务器,软件,数据库和完整的多层应用程序体系结构。有几种方法可以将产品添加到服务目录中,其中之一是使用AWS云形式。如果选择此方法,则用户可以选择上传云形式模板。在上传云形式模板后,AWS服务目录将创建一个S3存储器来存储模板,该模板与以前的攻击相同。
