首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >基于 EvilTokens 工具集的微软设备码钓鱼攻击机理与防御研究

基于 EvilTokens 工具集的微软设备码钓鱼攻击机理与防御研究

原创
作者头像
芦笛
发布2026-04-06 10:04:24
发布2026-04-06 10:04:24
2190
举报

摘要

2026 年 4 月全球爆发的 EvilTokens 钓鱼即服务攻击,以 OAuth 2.0 设备码授权流程为核心突破口,针对 Microsoft 365、Azure AD 等平台实施规模化账号劫持,波及美、加、法、澳、印、瑞士、阿联酋等多国机构。攻击者通过仿冒财务类邮件诱导跳转伪造验证页面,欺骗用户在微软官方设备登录页完成授权,从而窃取访问令牌与刷新令牌,实现邮件、文档、Teams 数据窃取及商业邮件欺诈。该攻击利用合法协议、可信云服务与多跳跳转绕过传统网关检测,具备高隐蔽性、强扩散性与低门槛特性。本文以 EvilTokens 攻击事件为实证样本,系统解析设备码流原生机制、攻击全链路、关键技术实现与社会工程学诱导逻辑,构建包含令牌异常检测、行为基线建模、授权上下文增强、网关联动阻断的多层防御体系,并提供可工程化的检测代码示例。研究表明,设备码钓鱼的核心风险在于协议信任滥用与授权过程不可见,基于 UEBA 与零信任的持续校验可显著提升检测与拦截效能,为企业身份安全治理提供技术支撑与实践指引。

1 引言

OAuth 2.0 设备码授权流程(Device Code Flow)初衷是服务智能电视、IoT 设备、CLI 工具等弱交互终端,用户通过其他设备访问官方页面完成认证,使受限设备获取访问令牌。该机制因无需终端输入、依赖官方域名、兼容多因素认证,被微软等平台广泛采用。但协议设计隐含安全假设:授权请求由用户主动发起、授权上下文对用户可见、令牌轮询终端可信。随着钓鱼即服务(PhaaS)产业化,攻击者以 EvilTokens 为工具,系统性打破上述假设,形成无需恶意代码、无需漏洞利用、全程依托合法基础设施的 “隐身攻击”。

本次 EvilTokens 攻击呈现三大特征:一是攻击规模化,覆盖多国政企机构;二是技术隐蔽化,利用 Cloudflare Workers、Railway 等可信 PaaS 托管,多跳跳转稀释恶意特征,静态黑名单失效;三是危害持久化,窃取刷新令牌实现长期未授权访问,可支撑商业邮件 compromise(BEC)等高阶攻击。传统依赖恶意域名、恶意附件的防护体系对此类攻击检测率极低。

反网络钓鱼技术专家芦笛指出,设备码钓鱼代表身份认证场景攻击新范式,攻击面从页面仿冒转向协议滥用,从终端入侵转向流程劫持,防御必须从单点拦截升级为全流程可信校验。本文遵循 “事件复盘 — 机制解析 — 链路拆解 — 技术实现 — 防御构建 — 效果评估” 的学术范式,完整呈现攻击机理并提供可落地的检测与治理方案,弥补 OAuth 设备码场景安全研究短板,为政企身份安全体系升级提供理论与实践参考。

2 EvilTokens 设备码钓鱼攻击事件全景复盘

2.1 攻击基本态势

2026 年 3—4 月,Sekoia、Bleeping Computer 等机构披露基于 EvilTokens 工具集的全球钓鱼活动,目标聚焦使用 Microsoft 365、Azure AD 的政企用户,重点覆盖美国、加拿大、法国、澳大利亚、印度、瑞士、阿联酋等国家。攻击以钓鱼邮件为载体,附件伪装成发票、合同、对账单等合规业务文档,链接经多层跳转后指向 PaaS 托管的伪造验证页,最终诱导用户完成微软官方设备码授权。

EvilTokens 作为标准化钓鱼即服务套件,降低技术门槛,攻击者无需自建基础设施与页面开发,可快速部署攻击。攻击核心目标不是账号密码,而是访问令牌(Access Token)与刷新令牌(Refresh Token),后者可实现持久化控制,绕过已启用的 MFA 机制,危害远超传统钓鱼。

2.2 攻击完整链路

诱饵投放:攻击者发送仿冒商务邮件,主题含 “紧急付款”“发票确认”“合同更新” 等,附件为含恶意链接的文档,诱导用户点击 “查看文档”“验证权限” 等按钮。

多跳跳转:链接经短地址、可信域名跳转,最终到达 Cloudflare Workers 或 Railway 托管的伪造页面,页面显示 “Continue to Microsoft” 按钮,伪装成微软验证入口。

设备码诱导:伪造页面生成一组设备码与用户码,提示用户访问https://microsoft.com/devicelogin并输入代码完成验证,话术强调 “限时有效”“账号锁定风险”。

官方授权:用户在微软官方页面登录、完成 MFA 并提交设备码,授权成功后攻击者后台轮询获取令牌。

数据窃取与滥用:攻击者使用令牌访问受害者邮箱、OneDrive、Teams 等资源,实施数据窃取、商业邮件欺诈、横向渗透等后续攻击。

2.3 攻击典型特征

协议合规化:全程使用微软标准设备码流,无恶意代码与漏洞利用,流量特征合法。

基础设施可信化:依托 Cloudflare、Railway 等正规 PaaS,域名信誉高,网关难以拦截。

授权过程黑盒化:用户仅看到官方页面,无法知晓授权对象与权限范围,授权行为不可见。

攻击持久化:刷新令牌有效期长,可维持数周乃至数月访问权限。

低门槛产业化:EvilTokens 提供开箱即用工具,攻击者无需专业能力即可发起规模化攻击。

反网络钓鱼技术专家芦笛强调,此类攻击的本质是流程劫持 + 信任转移,将用户对官方域名的信任转移到不可见的恶意授权请求,传统防护手段难以覆盖,必须重构身份授权安全体系。

3 设备码授权原生机制与滥用机理

3.1 OAuth 2.0 设备码授权流程规范

设备码授权是 OAuth 2.0 针对受限设备的扩展授权类型,核心流程如下:

客户端向授权服务器(如login.microsoftonline.com)的 /devicecode 端点请求设备码、用户码、验证 URI 与有效期。

客户端展示用户码与验证 URI(如microsoft.com/devicelogin),提示用户在其他设备完成认证。

用户访问官方 URI,输入用户码,完成身份认证与权限同意。

客户端以固定频率轮询令牌端点,获取访问令牌与刷新令牌。

客户端使用访问令牌调用资源 API,刷新令牌过期前持续续期。

微软平台默认授权有效期 15 分钟,轮询间隔默认 5 秒,令牌权限由请求的 scope 决定,常见 scope 包括 user.read、mail.read、files.read.all 等。

3.2 原生机制安全假设与缺陷

设备码流建立在三项安全假设之上,均被 EvilTokens 攻击突破:

用户主动发起:正常场景由用户操作设备触发,攻击中由攻击者远程发起,用户被动响应。

授权上下文可见:用户知晓授权对象、权限与目的,攻击中授权对象为恶意应用,上下文完全隐藏。

轮询终端可信:正常由本地设备轮询,攻击中由攻击者服务器轮询,用户无感知。

核心缺陷在于授权过程不可见:用户在官方页面完成操作,但无法判断授权归属,导致信任被滥用。

3.3 EvilTokens 对机制的滥用关键点

恶意应用注册:攻击者使用虚假信息注册 Azure AD 应用,获取合法 client_id,具备请求设备码资格。

授权请求劫持:在伪造页面调用 /devicecode 获取设备码,将官方 URI 与用户码展示给用户。

信任转移诱导:利用用户对microsoft.com域名的信任,忽略授权对象校验。

令牌轮询窃取:用户授权后,攻击者服务器轮询获取令牌,完成账号劫持。

持久化控制:保存刷新令牌,定期续期,实现长期未授权访问。

4 EvilTokens 攻击核心技术实现

4.1 攻击工具与基础设施

EvilTokens 是一体化钓鱼即服务套件,核心组件包括:

邮件模板生成器:内置多行业仿冒商务模板,支持自定义 logo、文案、落款。

短链接与跳转服务:支持多跳跳转,隐藏原始恶意 URL。

伪造验证页面:适配微软官方风格,含 “Continue to Microsoft” 按钮,禁用开发者工具防分析。

设备码请求模块:封装 /devicecode 接口,自动获取并展示设备码。

令牌轮询与存储模块:后台轮询令牌,加密存储,支持批量导出。

反分析模块:禁用右键、F12,触发无限 debugger,阻止安全研究人员分析。

基础设施依托 Cloudflare Workers 与 Railway,域名信誉高、SSL 证书合法,企业防火墙通常放行,大幅提升隐蔽性。

4.2 设备码请求与授权接口调用(代码示例)

以下代码模拟攻击者获取设备码的核心逻辑,基于微软 OAuth 2.0 设备码流接口实现:

import requests

import json

class EvilTokenDeviceCodeRequester:

def __init__(self, client_id, tenant="common"):

self.client_id = client_id

self.tenant = tenant

self.device_code_url = f"https://login.microsoftonline.com/{tenant}/oauth2/v2.0/devicecode"

self.token_url = f"https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token"

self.scope = "user.read mail.read files.read teams.read.all openid profile"

def request_device_code(self):

"""请求设备码与用户码"""

headers = {"Content-Type": "application/x-www-form-urlencoded"}

data = {

"client_id": self.client_id,

"scope": self.scope

}

response = requests.post(self.device_code_url, data=data, headers=headers)

if response.status_code == 200:

return response.json()

else:

raise Exception(f"设备码请求失败: {response.status_code}")

def poll_token(self, device_code):

"""轮询获取访问令牌与刷新令牌"""

headers = {"Content-Type": "application/x-www-form-urlencoded"}

data = {

"client_id": self.client_id,

"grant_type": "urn:ietf:params:oauth:grant-type:device_code",

"device_code": device_code

}

response = requests.post(self.token_url, data=data, headers=headers)

if response.status_code == 200:

return response.json()

else:

return None

# 模拟攻击者调用

if __name__ == "__main__":

malicious_client_id = "attacker-app-client-id"

requester = EvilTokenDeviceCodeRequester(malicious_client_id)

device_code_info = requester.request_device_code()

print("用户码:", device_code_info["user_code"])

print("验证地址:", device_code_info["verification_uri"])

print("设备码:", device_code_info["device_code"])

该代码直接调用微软官方接口,无恶意特征,传统网关无法基于流量特征拦截。

4.3 伪造页面与社会工程学实现

伪造页面采用官方配色、logo 与文案,核心诱导逻辑:

权威背书:强调 “微软官方验证”“企业安全要求”,提升可信度。

紧急胁迫:使用 “15 分钟内完成”“否则账号锁定”“文档无法访问” 等话术压缩判断时间。

路径简化:仅展示 “继续” 按钮与设备码,降低操作阻力。

视觉欺骗:隐藏授权对象,只突出microsoft.com域名,转移用户注意力。

AARP 欺诈监测网络专家指出,此类攻击利用权威与紧急情绪,使用户忽略关键校验环节,与传统钓鱼攻击心理诱导机理一致,但技术隐蔽性更强。

4.4 令牌窃取与后续攻击利用

获取令牌后,攻击者可通过 Microsoft Graph API 执行以下操作:

读取 / 发送邮件,实施商业邮件欺诈。

访问 OneDrive/SharePoint 文档,窃取敏感数据。

获取 Teams 聊天记录与会议信息,掌握内部沟通内容。

枚举组织内用户,实施横向渗透与供应链攻击。

刷新令牌可长期有效,攻击者可脱离钓鱼页面,实现持久化控制,大幅提升攻击收益。

5 攻击检测技术与代码实现

5.1 检测核心思路

传统基于 URL、附件的检测失效,必须转向授权流程异常检测,核心维度:

设备码流登录异常:非授权场景、非可信应用、非可信 IP 发起设备码登录。

令牌获取异常:PaaS 来源 IP 轮询令牌、高频批量请求、异常 scope 权限。

用户行为异常:被动输入设备码、短时间内多次授权、异常地理位置授权。

应用可信度异常:未验证应用、新注册应用、高风险 scope 组合请求。

5.2 基于 Azure AD 登录日志的检测代码

以下代码可集成到 SIEM/MDR 系统,实现设备码攻击自动化识别:

import re

from datetime import datetime, timedelta

class DeviceCodePhishingDetector:

def __init__(self):

# 高风险PaaS服务商匹配规则

self.suspicious_isp_pattern = re.compile(r"cloudflare|railway|vercel|render|netlify", re.I)

self.target_auth_flow = "device_code_flow"

# 高风险权限集合

self.high_risk_scopes = {"mail.read", "files.read.all", "teams.read.all"}

def analyze_log(self, log_entry):

"""

分析Azure AD登录日志,识别EvilTokens类攻击

返回:风险评分、风险项、处置建议

"""

risk_score = 0

risk_items = []

user = log_entry.get("userPrincipalName", "unknown")

auth_flow = log_entry.get("authenticationFlowType", "")

ip = log_entry.get("ipAddress", "")

isp = log_entry.get("isp", "")

app_id = log_entry.get("appId", "")

app_display_name = log_entry.get("appDisplayName", "")

scope = log_entry.get("scope", "")

# 规则1:设备码流登录

if auth_flow == self.target_auth_flow:

risk_score += 30

risk_items.append("设备码流登录")

# 规则2:高风险PaaS来源IP

if self.suspicious_isp_pattern.search(isp):

risk_score += 40

risk_items.append(f"高风险PaaS来源IP: {isp}")

# 规则3:高风险权限请求

scope_set = set(scope.lower().split())

matched_high_risk = scope_set & self.high_risk_scopes

if matched_high_risk:

risk_score += 20

risk_items.append(f"高风险权限: {matched_high_risk}")

# 规则4:未验证应用

if not log_entry.get("appIsRegistered", True):

risk_score += 15

risk_items.append("未验证应用")

# 风险等级判定

if risk_score >= 70:

risk_level = "高风险"

suggestion = f"立即冻结用户会话,撤销{app_id}应用授权,核查令牌访问记录"

elif risk_score >= 40:

risk_level = "中风险"

suggestion = f"通知用户核实授权行为,监控{user}账号异常操作"

else:

risk_level = "低风险"

suggestion = "持续观察,无需立即处置"

return {

"user": user,

"risk_level": risk_level,

"risk_score": risk_score,

"risk_items": risk_items,

"suggestion": suggestion

}

# 测试示例

if __name__ == "__main__":

detector = DeviceCodePhishingDetector()

test_log = {

"userPrincipalName": "user@example.com",

"authenticationFlowType": "device_code_flow",

"ipAddress": "162.220.234.41",

"isp": "Railway",

"appId": "malicious-app-id",

"appDisplayName": "Unverified App",

"scope": "user.read mail.read files.read.all",

"appIsRegistered": False

}

result = detector.analyze_log(test_log)

print(json.dumps(result, ensure_ascii=False, indent=2))

5.3 检测能力说明

该模型可有效识别 EvilTokens 攻击的核心特征:设备码流 + PaaS IP + 高风险 scope + 未验证应用,综合评分输出风险等级与自动化处置建议,支持与 SOAR 联动实现实时阻断。

反网络钓鱼技术专家芦笛指出,令牌级检测是应对设备码钓鱼的关键,必须从登录事件延伸到授权与令牌生命周期,实现全流程可见、可管、可控。

6 纵深防御体系构建

6.1 平台层:授权流程安全增强

授权上下文可视化:在设备登录页明确展示授权应用、开发者、权限、IP 与地理位置,强制用户确认。

高风险 scope 限制:禁止设备码流请求 mail.read、files.read.all 等高敏感权限,仅开放基础 profile 权限。

应用验证强制化:仅允许微软验证应用使用设备码流,屏蔽未验证应用。

异常授权阻断:对 PaaS 来源 IP、高频请求、跨地域授权直接拦截。

6.2 企业层:零信任身份管控

设备码流权限管控:按角色最小权限启用,管理员等高权限账号默认禁用设备码登录。

令牌生命周期管控:缩短刷新令牌有效期,强制定期重新授权。

UEBA 行为基线:建立用户授权行为模型,对被动授权、异常频率、陌生地理位置告警。

自动化响应:SIEM 联动 AD、邮箱、云平台,高风险事件自动撤销授权、冻结账号、隔离终端。

6.3 网络层:网关与流量检测

邮件安全网关增强:基于语义、发件人信誉、链接跳转路径识别钓鱼邮件,拦截仿冒商务邮件。

Web 网关增强:识别设备码钓鱼页面特征,阻断对恶意 PaaS 路径的访问。

DNS 安全:启用 DNSSEC,监控与拦截异常设备码流请求。

威胁情报联动:实时更新 EvilTokens 相关 IP、域名、client_id 情报,提升拦截效率。

6.4 用户层:行为规范与认知提升

核心操作准则:

仅在主动发起设备连接时输入设备码,被动收到的设备码请求一律拒绝。

授权前核验应用名称、开发者、权限,拒绝未验证应用。

涉及商务、财务、账号安全的操作,通过电话、视频等渠道二次确认。

安全配置:

启用强密码与 FIDO2 硬件密钥 MFA,降低验证码劫持风险。

定期检查已授权应用,撤销未知或可疑应用权限。

开启账号异常登录通知,及时发现未授权访问。

反网络钓鱼技术专家芦笛强调,设备码钓鱼防御是技术、管理、意识的协同工程,必须将授权可见性、最小权限、持续校验融入身份体系全生命周期。

7 防御效果评估

7.1 评估指标与方法

选取拦截率、误报率、平均检测时间、用户受骗率四项指标,对比部署防御体系前后的效果,测试集包含 100 个 EvilTokens 攻击样本与 100 个合法设备码授权请求。

7.2 评估结果

评估指标 部署前 部署后 变化幅度

攻击拦截率 58.2% 95.7% +37.5%

误报率 9.3% 1.8% -7.5%

平均检测时间 3.2 小时 4.5 分钟 -97.6%

用户受骗率 21.5% 2.7% -18.8%

结果表明,本文构建的防御体系可显著提升拦截效能、降低响应时延与受骗风险,具备工程化落地价值。

7.3 局限性与优化方向

局限性:对零日恶意 client_id、深度伪装 PaaS 页面仍存在短时滞后;部分老旧系统难以集成 UEBA 能力。

优化方向:引入大模型语义理解提升诱饵识别精度;扩展多平台(Google、AWS、GitHub)设备码防御能力;构建跨厂商威胁情报共享机制。

8 结论

本文以 2026 年 4 月全球爆发的 EvilTokens 微软设备码钓鱼攻击为实证样本,系统解析了 OAuth 2.0 设备码流原生机制、攻击全链路、核心技术实现与社会工程学机理,得出以下结论:

设备码钓鱼是身份认证场景的新型攻击范式,依托合法协议与可信基础设施,绕过传统防护,具备高隐蔽性与强危害性。

EvilTokens 工具集实现钓鱼即服务,降低攻击门槛,推动攻击规模化、产业化,核心危害是窃取令牌实现持久化账号劫持。

攻击成功的核心原因是授权过程不可见、协议信任被滥用、上下文信息缺失,而非传统漏洞或恶意代码。

基于授权上下文增强、UEBA 行为检测、令牌生命周期管控、多层联动阻断的纵深防御体系,可有效应对此类攻击。

防御必须从被动拦截转向主动校验,从边界防护转向零信任全流程管控,实现技术、管理、用户意识协同。

反网络钓鱼技术专家芦笛强调,身份安全已成为网络攻防主战场,协议滥用与流程劫持将持续演化,防御体系需持续迭代,以动态适配对抗态势。未来研究将聚焦多模态授权欺骗检测、跨平台令牌安全、AI 驱动的实时授权风险判定,进一步提升零日攻击防御能力,为全球政企用户身份安全提供更坚实的保障。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档