mkkltech/iam-risk-scanner

GitHub: mkkltech/iam-risk-scanner

一个 GitHub Action,用于在拉取请求中自动扫描 Terraform 和 CloudFormation IaC 文件,检测 IAM 权限提升风险。

Stars: 1 | Forks: 0

# IAM 风险扫描器 [![IAM 风险扫描](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/b670c3adc1010946.svg)](https://github.com/mkkltech/iam-risk-scanner/actions/workflows/iam-scan.yml) 一个 GitHub Action,用于在拉取请求中扫描 Terraform 和 CloudFormation IaC 文件,检测 IAM 权限变更和特权提升风险。它比较基础分支和头部分支之间的 IAM 语句差异,根据已知的升级规则进行检查,并将详细的 Markdown 报告作为 PR 评论发布。 ## 功能特性 - 检测 **40+ 高风险 IAM 权限**(单权限和组合升级路径) - 规则来源于 **Rhino Security Labs** 的研究成果,并将发现映射到 **MITRE ATT&CK** 技术 ID - 显示每个发现的**文件路径**,以便审阅者确切了解风险所在 - 区分**新添加的**权限和**已存在的**权限 - 支持 **Terraform**(`.tf`)和 **CloudFormation**(`.json`, `.yaml`, `.yml`) - 发布或**更新**单条 PR 评论 —— 重新运行时不会产生评论垃圾邮件 - 根据可配置的**严重性阈值**使检查失败 ## 示例 PR 评论 | 风险 | 权限 | 文件 | 描述 | |---|---|---|---| | 🔴 高危 | 🆕 `iam:passrole + lambda:createfunction` | `infra/main.tf` | ⚡ 创建 Lambda 函数时使用 iam:PassRole 允许以特权角色执行。 *(via Rhino Security Labs)* · *MITRE T1548* | | 🔴 高危 | *(已存在)* `iam:CreatePolicyVersion` | `infra/main.tf` | 允许创建可能具有管理员级别权限的新策略版本。 *(via Rhino Security Labs)* · *MITRE T1484* | | 🔴 高危 | 🆕 `iam:CreateUser` | `cfn/template.yaml` | 允许创建新的 IAM 用户,该用户随后可被授予提升的权限。 · *MITRE T1136.003* | ## 使用方法 将此文件添加到您仓库的 `.github/workflows/iam-scan.yml`: ``` name: IAM Risk Scan on: pull_request: paths: - "**.tf" - "**.yaml" - "**.yml" - "**.json" jobs: iam-scan: runs-on: ubuntu-latest permissions: pull-requests: write contents: read steps: - uses: actions/checkout@v4 - uses: mkkltech/iam-risk-scanner@v1 with: github-token: ${{ secrets.GITHUB_TOKEN }} severity-threshold: HIGH # fail-on-findings: false # uncomment for report-only mode ``` ## 输入参数 | 输入 | 必需 | 默认值 | 描述 | |---|---|---|---| | `github-token` | 是 | — | 用于发布 PR 评论的 GitHub 令牌。请使用 `${{ secrets.GITHUB_TOKEN }}` | | `severity-threshold` | 否 | `HIGH` | 在此级别使检查失败。`HIGH` 仅在发现高危时失败;`MEDIUM` 在发现中危或高危时失败 | | `fail-on-findings` | 否 | `true` | 设为 `false` 可启用仅报告模式 —— 发布 PR 评论但绝不使检查失败 | | `pr-number` | 否 | 自动检测 | PR 编号。大多数情况下可从 `GITHUB_REF` 自动检测 | ## 支持的 IaC 格式 | 格式 | 扩展名 | 资源类型 | |---|---|---| | Terraform | `.tf` | `aws_iam_policy_document`, `aws_iam_role`, `aws_iam_policy`, `aws_iam_role_policy`, `aws_iam_user_policy`, `aws_iam_group_policy` | | CloudFormation | `.json`, `.yaml`, `.yml` | `AWS::IAM::Policy`, `AWS::IAM::ManagedPolicy`, `AWS::IAM::Role`, `AWS::IAM::User`, `AWS::IAM::Group` | ## 升级规则 规则来源于: - **[Rhino Security Labs](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/)** —— Spencer Gietzen 关于 AWS 特权提升方法的研究(单权限 + 13 种基于 PassRole 的组合) - **AWS 文档** —— `sts:AssumeRoot`、通配符权限 每个发现都包含一个 **MITRE ATT&CK** 技术链接: | 技术 | ID | 权限 | |---|---|---| | 滥用提升控制机制 | T1548 | `iam:PassRole` + 所有 PassRole 组合 | | 域/租户策略修改 | T1484 | `iam:CreatePolicyVersion`, `iam:Attach*Policy`, `iam:Put*Policy` | | 额外的云凭据 | T1098.001 | `iam:CreateAccessKey`, `iam:UpdateAccessKey` | | 有效账户:云账户 | T1078.004 | `sts:AssumeRole`, `iam:CreateLoginProfile`, `iam:UpdateLoginProfile` | | 创建云账户 | T1136.003 | `iam:CreateUser`, `iam:CreateRole` | | 账户操作 | T1098 | `iam:AddUserToGroup` | ## 已知限制 - 不评估资源范围 —— 作用域为 `*` 的权限和作用域为特定 ARN 的权限被同等对待 - 不解析 Terraform 变量引用(例如 `policy = var.policy_doc`)—— 这些会被静默跳过 - 不评估 `Deny` 语句 —— 即使存在对应的 `Deny`,`Allow` 仍可能被标记 - 不支持 GitHub Enterprise Server(仅使用 `api.github.com`) - 尚未实现 Kubernetes 扫描 ## 本地开发 安装依赖: ``` pip install -r requirements.txt ``` 运行扫描器(需要 GitHub Actions 环境变量): ``` PYTHONPATH=src python src/main.py ``` 直接针对测试文件测试解析器: ``` python -c "from parsers.terraform import extract_iam_statements; print(extract_iam_statements('test/fixtures/terraform/main.tf'))" python -c "from parsers.cloudformation import extract_iam_statements; print(extract_iam_statements('test/fixtures/cloudformation/template.yaml'))" ```
标签:AWS IAM, CI/CD安全, CloudFormation, CSV导出, DevSecOps, ECS, GitHub Actions, IaC扫描, IAM安全, IAM权限提升, Llama, PR扫描, Terraform, 上游代理, 云基础设施安全, 云安全监控, 代码审查, 权限扫描, 权限管理, 模型越狱, 特权提升, 结构化查询, 自动化安全, 自动化部署, 自动笔记, 逆向工具, 静态分析, 风险检测