mkkltech/iam-risk-scanner
GitHub: mkkltech/iam-risk-scanner
一个 GitHub Action,用于在拉取请求中自动扫描 Terraform 和 CloudFormation IaC 文件,检测 IAM 权限提升风险。
Stars: 1 | Forks: 0
# IAM 风险扫描器
[](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, 上游代理, 云基础设施安全, 云安全监控, 代码审查, 权限扫描, 权限管理, 模型越狱, 特权提升, 结构化查询, 自动化安全, 自动化部署, 自动笔记, 逆向工具, 静态分析, 风险检测