j-dahl7/oauth-redirect-abuse-sentinel
GitHub: j-dahl7/oauth-redirect-abuse-sentinel
该项目是一个部署于 Microsoft Sentinel 的 OAuth 重定向滥用检测实验室,提供分析规则、搜寻查询、安全仪表板及可选的 Entra ID 租户加固策略。
Stars: 1 | Forks: 0
# OAuth 重定向滥用检测实验室
这是一个部署 Microsoft Sentinel 检测内容以防范 OAuth 重定向滥用的实操实验室,
明确开启了可选的 Entra 强化功能——即 Microsoft 在其
[2026 年 3 月安全公告](https://www.microsoft.com/en-us/security/blog/2026/03/02/oauth-redirection-abuse-enables-phishing-malware-delivery/)中描述的技术。
**成本:** 使用现有的 Sentinel 工作区;数据接入、保留和
许可费用仍需照常支付。
**清理:** 删除实验室创建的 Sentinel 对象,并且仅在应用过强化的情况下,
恢复捕获的租户同意配置并删除指定的 CA 策略。
## 验证范围
2026 年 7 月 25 日的强化修订版已通过离线 PowerShell 解析、
模拟安全测试以及 KQL/静态契约审查进行了检查。该版本未部署到任何
租户,未进行实时的 Graph 强化调用,也未针对此修订版验证任何实时的
Sentinel 查询或事件。规则输出取决于目标
工作区的 `SigninLogs`/`AuditLogs` schema、数据连接器、数据量以及
接入延迟。
## 部署内容
| 资源 | 类型 | 详情 |
|---|---|---|
| 4 个分析规则 | Sentinel Scheduled | 高风险登录后的 OAuth 同意、可疑重定向 URI、OAuth 错误模式、批量同意 |
| 1 个工作簿 | Azure Workbook | OAuth 安全仪表板(同意时间线、错误模式、URI 更改、热门应用) |
| 可选的同意策略更改 | Entra ID | 租户授权策略更新;仅在指定 `-ApplyHardening` 时应用 |
| 可选的 CA 策略 | Entra ID | 报告模式(Report-only)的逐步验证策略;仅在指定 `-ApplyHardening` 时创建/更新 |
| 5 个搜寻查询 | KQL 文件 | 委托权限审计、非企业 IP、新增高权限应用、URI 清单、令牌重放 |
| 1 个审计脚本 | PowerShell | 枚举所有 OAuth 应用的可疑重定向 URI 和过高权限 |
## 前置条件
- 具备现有 **Microsoft Sentinel** 工作区的 Azure 订阅
- 已配置 Azure CLI (`az login`)
- PowerShell 7+ (`pwsh`)
- 拥有工作区的 **Microsoft Sentinel Contributor** 或等效的规则/工作簿写入
权限
- 拥有默认只读 OAuth 审计所需的 **Application.Read.All** Graph 权限
(可通过 `-SkipAudit` 跳过审计)
- 仅在明确使用 `-ApplyHardening` 时,才需要 **Conditional Access Administrator**
以及所需的 Graph 策略写入权限
- 在应用仅报告模式的 CA 策略前,需准备好通过
`-ExcludedUserIds` 传递的紧急访问账户的确切 Entra 对象 ID
现有的 Sentinel 工作区是一个共享目标。部署会在该工作区中创建或
更新规则和工作簿。Entra 强化功能默认**关闭**,因为
同意策略的更改是全租户范围的,且 CA 策略将应用于除你明确排除的对象 ID 之外的
所有用户。
## 快速开始
### 1. 克隆仓库
```
git clone https://github.com/j-dahl7/oauth-redirect-abuse-sentinel.git
cd oauth-redirect-abuse-sentinel
```
### 2. 部署
首先进行预览:
```
./scripts/Deploy-Lab.ps1 `
-ResourceGroup "rg-sentinel-lab" `
-WorkspaceName "law-sentinel-lab" `
-WhatIf
```
默认部署会写入四个 Sentinel 规则和工作簿,然后
执行只读的 Graph 审计并在本地生成 `oauth-audit-report.csv`。它不会
应用租户强化:
```
./scripts/Deploy-Lab.ps1 -ResourceGroup "rg-sentinel-lab" -WorkspaceName "law-sentinel-lab"
```
如需跳过审计及其本地 CSV 文件:
```
./scripts/Deploy-Lab.ps1 -ResourceGroup "rg-sentinel-lab" -WorkspaceName "law-sentinel-lab" -SkipAudit
```
在捕获当前的同意策略集合、验证
租户、审查报告模式的影响,并确定紧急访问账户的
对象 ID 之后,方可选择启用强化:
```
./scripts/Deploy-Lab.ps1 `
-ResourceGroup "rg-sentinel-lab" `
-WorkspaceName "law-sentinel-lab" `
-ApplyHardening `
-ExcludedUserIds @("","")
```
该脚本会:
1. 验证 Sentinel 工作区是否存在以及是否启用了 Sentinel
2. 通过 Sentinel REST API 部署 4 个计划分析规则
3. 部署 OAuth 安全仪表板工作簿
4. 仅在存在 `-ApplyHardening` 时应用 OAuth 强化
5. 除非存在 `-SkipAudit`,否则运行 OAuth 应用审计并保存 CSV 报告
`-WhatIf` 会执行发现/读取调用,但会跳过受保护的云端写入、租户
强化、临时请求体文件以及审计/CSV。它不会验证
KQL 结果或 CA 影响。`-SkipHardening` 仅作为已弃用的
兼容性开关保留;未指定 `-ApplyHardening` 是常规的安全默认设置。
分析规则和工作簿使用确定性工作区范围内的 ID 以及
显式的所有权标记。如果遇到同名资源或标记不匹配的确定性 ID,部署将会安全终止,而不会进行覆盖。
当前的部署参数有 `-ResourceGroup`、`-WorkspaceName`、
`-ApplyHardening`、`-ExcludedUserIds`、`-SkipHardening`(已弃用)、
`-SkipAudit`、`-Destroy` 以及 PowerShell 通用的 `-WhatIf` 开关。
### 3. 验证部署
打开 **Microsoft Defender portal** > **Microsoft Sentinel** > **Analytics**:
- 你应该能看到 4 个以“LAB -”为前缀的新规则
- 所有规则都应显示为已启用且类型为 Scheduled
打开 **Workbooks**:
- 在列表中找到“OAuth Security Dashboard”
## 分析规则
### 规则 1:高风险登录后的 OAuth 同意 (高)
将 15 分钟时间窗口内的 `SigninLogs` 风险指标与 `AuditLogs` 同意事件进行关联。
**MITRE:** T1566.002 (Spearphishing Link)
### 规则 2:注册了可疑的 OAuth 重定向 URI (中)
监控应用注册中添加到隧道服务、免费托管、URL 缩短器或非 HTTPS 端点的重定向 URI。
**MITRE:** T1098 (Account Manipulation)
### 规则 3:基于 OAuth 错误的重定向模式 (高)
检测与重定向滥用最密切相关的 Entra 错误。最强的信号是 `AADSTS65001` 和 `AADSTS65004`;当其他 OAuth 失败集中在同一个应用和时间窗口周围时,它们会被包含在内作为辅助上下文。
**MITRE:** T1566.002 (Spearphishing Link), T1204.001 (User Execution: Malicious Link)
### 规则 4:对单个应用的大量 OAuth 同意 (高)
当 3 个或更多用户在 1 小时内同意同一个应用时触发。
**MITRE:** T1566.002 (Spearphishing Link)
## 搜寻查询
将 `detection/hunting-queries.kql` 中的查询导入到 Sentinel Hunting 中:
| 搜寻 | 目的 | 回溯期 |
|---|---|---|
| 1. 枚举委托权限 | 对所有用户授予的权限进行基准审计 | 90 天 |
| 2. 非企业 IP 登录 | 来自意外位置的 OAuth 应用身份验证 | 30 天 |
| 3. 新的高权限应用 | 注册了敏感作用域的近期应用 | 14 天 |
| 4. 重定向 URI 清单 | 重定向 URI 更改的完整审计跟踪 | 90 天 |
| 5. 错误后的令牌重放 | 错误重定向后紧接着来自不同 IP 的成功验证 | 7 天 |
**搜寻 2** 需要自定义——将 `CorporateNetworks` 变量替换为你组织的 IP 范围。
## 强化策略
### 用户同意限制
`Set-OAuthHardening.ps1` 脚本将用户同意限制为:
- 仅限**低风险权限**(例如 `User.Read`、`openid`、`profile`)
- 来自**经过验证的发布者**和受信任的租户自有工作流的应用
- 其他所有情况均需**管理员批准**
- 更新策略时,现有的 `managePermissionGrantsForOwnedResource.*` 条目将被保留
这会更新租户的授权策略,而不是实验室范围内的资源。
在应用之前,请记录完整的原始 `permissionGrantPoliciesAssigned` 集合。
脚本之后无法推断所需的回滚状态。
### 条件访问策略
创建一个报告模式的实验室 CA 策略,该策略在以下情况适用:
- 登录风险为中或高
- 授予控制要求 **MFA**
- 会话登录频率设置为**每次**
在强制执行之前,请对该策略进行为期 7 天的审查。
### OAuth 应用审计
独立运行审计:
```
./hardening/Audit-OAuthApps.ps1 -OutputPath "./oauth-audit-report.csv"
```
该审计会检查每个应用注册的:
- 可疑重定向 URI 域名(ngrok、herokuapp、workers.dev 等)
- 非 HTTPS 重定向 URI(排除 localhost)
- 高权限委托权限(Mail.Read、Files.ReadWrite.All 等)
- 用户同意与管理员同意的权限
- 多租户应用注册
输出为按风险评分排序的 CSV。
## 文件结构
```
oauth-redirect-abuse-sentinel/
├── README.md # This file
├── detection/
│ ├── analytics-rules.kql # 4 Sentinel analytics rules (full KQL)
│ └── hunting-queries.kql # 5 proactive hunting queries
├── hardening/
│ ├── Set-OAuthHardening.ps1 # Consent restriction + CA policy
│ └── Audit-OAuthApps.ps1 # OAuth app security audit
└── scripts/
└── Deploy-Lab.ps1 # Main deployment orchestrator
```
## 清理
### 删除 Sentinel 资源
首先预览受保护资源的清理:
```
./scripts/Deploy-Lab.ps1 `
-ResourceGroup "rg-sentinel-lab" `
-WorkspaceName "law-sentinel-lab" `
-Destroy `
-WhatIf
```
然后删除此实验室拥有的四个分析规则和工作簿:
```
./scripts/Deploy-Lab.ps1 `
-ResourceGroup "rg-sentinel-lab" `
-WorkspaceName "law-sentinel-lab" `
-Destroy
```
在发出第一次删除请求之前,清理操作会验证每个确定性资源 ID 和所有权标记。
它会拒绝同标题的外部对象,以及不可变 ID、标题/显示名称或标记不匹配的
资源。旧版随机 ID 修订版中的遗留对象不会被强行接管或删除;请
仅在验证其不可变 ID 和内容后,手动审查并删除这些对象。
### 删除强化(如果已应用)
**还原同意策略:** 恢复在应用
实验室之前捕获的完整 `permissionGrantPoliciesAssigned` 集合。请勿使用猜测的单个值替换它,也不要丢弃现有的
`managePermissionGrantsForOwnedResource.*` 条目。
**删除 CA 策略:**
```
az rest --method DELETE `
--url 'https://graph.microsoft.com/v1.0/identity/conditionalAccess/policies/'
```
使用部署返回的不可变策略 ID,并首先验证其
显示名称、报告模式状态、条件、排除项和来源是否与
本实验室匹配。清理操作不会删除 `oauth-audit-report.csv`;请根据该
本地报告可能包含的敏感租户清单内容妥善处理。
## 故障排除
### 规则未触发
分析规则需要 `SigninLogs` 和 `AuditLogs` 中有匹配的数据。如果你的租户中没有 OAuth 同意事件或高风险登录,
规则将不会触发。请通过以下方式进行测试:
1. 注册一个包含 `webhook.site` 重定向 URI 的测试应用(触发规则 2)
2. 检查 `AuditLogs` 是否包含“Add application”事件
### 工作簿不显示数据
确保工作区已启用 `AuditLogs` 和 `SigninLogs` 数据连接器。检查:
```
AuditLogs | take 1
SigninLogs | take 1
```
### 强化脚本失败
强化脚本需要 **Conditional Access Administrator** 角色和 **Policy.ReadWrite.ConditionalAccess** Graph 权限。使用 `-WhatIf` 运行以预览更改:
```
./hardening/Set-OAuthHardening.ps1 -WhatIf
```
## 资源
- [博客:使用 Microsoft Sentinel 和 Entra ID 检测 OAuth 重定向滥用](https://nineliveszerotrust.com/blog/oauth-redirect-abuse-sentinel/)
- [Microsoft 安全博客:OAuth 重定向滥用(2026 年 3 月 2 日)](https://www.microsoft.com/en-us/security/blog/2026/03/02/oauth-redirection-abuse-enables-phishing-malware-delivery/)
- [Microsoft 身份平台:授权码流程](https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-auth-code-flow)
- [Microsoft:配置用户同意设置](https://learn.microsoft.com/en-us/entra/identity/enterprise-apps/configure-user-consent)
- [Microsoft:针对高风险登录的条件访问](https://learn.microsoft.com/en-us/entra/id-protection/howto-identity-protection-configure-risk-policies)
- [Azure Monitor 日志参考:SigninLogs](https://learn.microsoft.com/en-us/azure/azure-monitor/reference/tables/signinlogs)
- [KQL 参考](https://learn.microsoft.com/en-us/kusto/query/)
标签:AI合规, AMSI绕过, Azure Sentinel, IPv6, KQL, Libemu, OAuth2, PowerShell, 威胁检测, 网络安全, 身份安全, 隐私保护