mrk336/Breaking-AWS-IAM-Trust-Boundaries

GitHub: mrk336/Breaking-AWS-IAM-Trust-Boundaries

该研究报告分析了 AWS IAM 信任策略条件评估缺陷导致的隐蔽权限提升风险,并提供检测策略与加固方案。

Stars: 0 | Forks: 0

# 突破 AWS IAM 信任边界 ### 信任策略条件设计中的安全风险 **作者:** Mark Mallia **关注领域:** AWS IAM · 信任策略 · 跨账号访问 · 检测工程 · CI/CD 防护栏 ## 执行摘要 AWS Identity and Access Management (IAM) 信任策略定义了谁可以跨账号和服务担任角色。在成熟的多账号 AWS 环境中,这些策略实际上成为了真正的访问控制平面。 一个反复出现的问题不是 AWS 配置错误,而是对 IAM 信任策略条件在实际中如何运作的误解——尤其是在以下几个方面: - `StringEqualsIfExists` - `aws:SourceIdentity` - `aws:PrincipalOrgID` - 宽泛的 Principal,例如 `:root` 这些模式在设计审查期间通常看起来很安全,但在 IAM 评估语义下的行为却截然不同,从而导致意外的信任暴露和横向移动机会。 本文探讨了: - 常见的信任策略设计弱点 - 攻击者如何滥用脆弱的信任假设 - 使用 CloudTrail 和 SIEM 工具的检测策略 - 使用 policy-as-code 的 CI/CD 防护栏 # 1. 为什么 IAM 信任策略很重要 在 AWS 中,很少直接授予访问权限。相反,访问权限是通过以下方式调解的: - `sts:AssumeRole` - 跨账号角色链 - 联合身份提供商 (SAML/OIDC) - CI/CD 服务角色 - 服务到服务的信任关系 随着环境规模的扩大,信任策略定义了谁甚至被允许进入特权执行上下文。 单个薄弱的信任关系就可以绕过原本设计良好的最小权限原则。 # 2. 常见信任策略弱点 ## 2.1 滥用 `IfExists` 条件 示例: ``` { "Condition": { "StringEqualsIfExists": { "aws:SourceIdentity": "approved-session" } } } ``` ### 为什么这很危险 `IfExists` 意味着只有在键存在时才会评估该条件。 如果键不存在,强制执行可能不会按预期进行,从而在预期的安全设计和 IAM 评估行为之间造成差距。 ### 更安全的替代方案 ``` { "Condition": { "StringEquals": { "aws:SourceIdentity": "approved-session" } } } ``` ## 2.2 宽泛的 Principal 信任 (`:root`) 示例: ``` { "Principal": { "AWS": "arn:aws:iam::123456789012:root" } } ``` ### 为什么这很危险 这会信任账号中的**每一个身份**,包括: - IAM 用户 - IAM 角色 - 联合身份 实际上,信任决策被完全委托给了另一个 AWS 账号。 ### 更安全的替代方案 ``` { "Principal": { "AWS": [ "arn:aws:iam::123456789012:role/DeployRole", "arn:aws:iam::987654321098:role/CICDRole" ] } } ``` ## 2.3 过度依赖 `aws:PrincipalOrgID` 示例: ``` { "Condition": { "StringEquals": { "aws:PrincipalOrgID": "o-abc123" } } } ``` ### 为什么这不够充分 虽然很有用,但它**不能**: - 验证组织内部的身份完整性 - 防止被盗账号的滥用 - 替代显式的角色级信任设计 # 3. 薄弱信任策略示例 ``` { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:root" }, "Action": "sts:AssumeRole", "Condition": { "StringEqualsIfExists": { "aws:SourceIdentity": "approved-session" } } } ``` ### 关键问题 - 信任整个 AWS 账号 - 使用可选的条件强制执行 - 薄弱的信任边界定义 - 如果账号被盗用,会引发横向移动 # 4. 强化信任策略示例 ``` { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::123456789012:role/DeployRole", "arn:aws:iam::987654321098:role/CICDRole" ] }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "aws:PrincipalOrgID": "o-abc123", "aws:SourceIdentity": "approved-session" } } } ``` ### 改进之处 - 用显式的角色级信任代替全账号范围的信任 - 强制条件评估 - 减少横向移动攻击面 - 更强的角色担任可审计性 # 5. 攻击路径示例 1. 在低信任 AWS 账号中发生初始入侵 2. 攻击者枚举 IAM 角色和信任关系 3. 识别出跨账号角色 4. 针对特权角色使用 `sts:AssumeRole` 5. 薄弱的信任策略允许提权 6. 攻击者扩展到生产环境 由于 `AssumeRole` 是原生的 AWS API,此活动通常会混入正常的操作行为中。 # 6. 检测机会 ## 6.1 CloudTrail 监控信号 关键指标: - 首次角色担任 - 跨账号 `AssumeRole` - 缺失或异常的 `aws:SourceIdentity` - 异常的会话频率或持续时间 - 新的账号间信任模式 ## 6.2 检测查询示例 (Athena) ``` SELECT eventTime, userIdentity.arn AS assumer, requestParameters.roleArn, sourceIPAddress FROM cloudtrail_logs WHERE eventName = 'AssumeRole' AND requestParameters.roleArn LIKE '%DeployRole%' AND userIdentity.accountId != '123456789012'; ``` ## 6.3 首次角色担任检测 ``` SELECT * FROM cloudtrail_logs t1 WHERE eventName = 'AssumeRole' AND NOT EXISTS ( SELECT 1 FROM cloudtrail_logs t2 WHERE t2.userIdentity.arn = t1.userIdentity.arn AND t2.requestParameters.roleArn = t1.requestParameters.roleArn AND t2.eventTime < t1.eventTime ); ``` # 7. CI/CD 防护栏 (Policy-as-Code) IAM 信任策略应该在**部署之前**进行验证,而不是在事件发生之后。 ### GitHub Actions 示例 ``` name: iam-trust-policy-check on: pull_request: jobs: validate: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 - name: Validate IAM Trust Policies run: | ./scripts/validate_trust_policies.sh ``` # 8. 具体控制措施映射 (DORA · PSD2 · ISO 27001) 薄弱或评估不当的 IAM 信任策略直接破坏了金融和云安全框架中几项强制性的控制措施: DORA (数字运营韧性法案) 第 9(2)(d) 条 – 要求强大的访问控制和身份治理;宽泛的 Principal 和可选的条件违反了最小权限原则的期望。 第 10(4) 条 – 要求受控和经过验证的变更;CI/CD 信任策略防护栏直接支持了这一要求。 第 15(1) 条 – 要求全面的日志记录和监控;基于 CloudTrail 的跨账号角色担任检测与此相符。 第 17(1) 条 – 第三方风险管理;信任整个 AWS 账号 (:root) 违反了要求的信任边界控制。 PSD2 (支付服务指令 2) SCA (RTS 第 4-5 条) – 强客户认证依赖于身份完整性;评估不当的信任条件会削弱身份保证。 RTS 第 22 条 – 要求安全的通信和会话完整性;隐式的跨账号信任破坏了通道隔离。 第 95(1) 条 – 运营和安全管理风险;最小权限 IAM 和显式 Principal 是必需的安全保障措施。 ISO/IEC 27001:2022 A.5.15 – 访问控制 – 显式 Principal 和强制性条件强制执行最小权限原则并防止未经授权的角色担任。 A.5.23 – 云服务中的信息安全 – 信任边界设计是核心的云控制措施;宽泛的 Principal 违反了这一要求。 A.8.16 – 监控活动 – CloudTrail 检测满足了持续监控的义务。 A.8.28 – 安全编码 – CI/CD 中的 policy-as-code 验证符合安全开发生命周期的期望。 # 结论 AWS IAM 中最大的风险通常不是软件漏洞,而是对信任关系在实际中如何运作的误解。 定期审查信任策略、验证假设并监控角色担任活动的组织,在防止权限提升和跨账号滥用方面处于更有利的位置。 身份仍然是云的控制平面。 每一个信任关系都应得到与其所保护的资源相同程度的审查。 ## 道德使用提醒 本研究**仅出于防御性安全、教育和授权测试目的**提供。 在未经明确书面许可的情况下,**不要**将这些技术用于任何系统或环境。 未经授权访问计算机系统是非法且不道德的。
标签:AWS IAM, C语言, 协议分析, 多线程, 权限提升, 漏洞分析, 路径探测