
最近在针对某水务集团、某电力研究院的一轮混合红队演练里我手里最“土”的工具——一张打印出来的二维码贴纸——居然比十几个CVE利用都好使。这让我重新审视了一个越来越危险的攻击面Quishing也就是QR二维码钓鱼攻击。它不打破任何软件漏洞不需要高超的免杀技巧只需要让目标人把手机摄像头对准一张图片然后指尖一点。对于关键基础设施电力、水务、燃气、轨道交通来说Quishing正在成为绕过重重边界防护的“物理-数字”混合突破口。这篇文章我就把自己从攻击者视角和防守者视角分别踩过的坑、验证过的对抗手段以及一套可落地的多维防御架构整理出来。内容适合负责工控安全、企业安全运营的工程师以及被要求“做好二维码风险管控”但不知从何下手的同行参考。1. 攻击向量分析Quishing为什么总在关键设施里得手1.1 恶意二维码的生成与投递方式人人都能靠在线工具生成二维码但它作为攻击载荷的可怕之处在于二维码承载的不是明文网址而是一个编码后的数据块。大多数手机相机的默认行为是“识别出URL后弹出预览”用户会在未经任何安全校验的情况下看到一个看起来正常的域名然后点击。攻击者可以轻易做到将钓鱼URL编码进二维码并通过短链接或URL重定向隐藏真实地址。在二维码中嵌入带用户标识的恶意链接实现动态令牌或按目标定制。生成QR码图片以PDF附件、桌面壁纸、打印贴纸、甚至电子屏幕滚动播放的形式投递。实际投递方式可以分为四类这也是我们做防御拆解时最关心的分类维度投递方式场景威胁特点物理张贴替换停车场扫码缴费、访客登记台、设备巡检标签、食堂餐牌替换真实二维码目标群体明确隐蔽性高邮件附件伪造IT服务台的“设备二维码绑定”、伪造HR工资单查询二维码绕过了基于内容的邮件过滤因为图片很难做语义判断即时通讯/协同软件群聊里发“会议签到二维码”“场所码更新”借助内部信任链传播传播路径短平快移动网页/社交工程配合热点事件诱导扫码如“员工福利登记”制造紧迫感降低警惕性我记得在某电力企业的现场测试中我们打印了50张伪装成“访客无线上网登记”的二维码贴在门禁旁的公告栏。一个上午就有37次成功扫描。这个成功率是邮件钓鱼的三倍因为它完全绕开了“审查链接”这一步——手机相机的扫码动作本身就被用户默认为“安全”。1.2 关键基础设施场景下的典型入侵路径关键基础设施与普通企业最大的差异是IT网络与OT网络之间的强隔离。大量攻击者卡在IT边界进不去但Quishing提供了另一条路通过操作员或维护人员的移动设备进入内部。一次典型的攻击路径如下攻击者制作二维码指向一个仿冒的“内部设备报修系统”登录页。目标员工扫码后看到高仿登录界面输入域账号和密码。攻击者拿到凭据通过远程桌面、虚拟专用网络网关或Web门户进入办公网。横向移动到支持OT系统的跳板机再通过受控的工程工作站访问只能从特定位置触达的PLC维护接口。这个过程中的关键点在于二维码钓鱼从来不直接攻破工业协议它只是“递钥匙”的人。钥匙就是凭据。很多关键基础设施单位把安全预算都花在工业防火墙和主机加固上却忽略了大量第三方运维人员、外包保洁、承包商都需要通过手机扫码进出关键区域。一台个人手机一旦被植入恶意配置或诱导安装App它就可能变成穿透物理隔离的“移动跳板”。1.3 为什么传统网络防御抓不到Quishing传统邮件网关会检查邮件正文里的URL沙箱会打开附件里的文档但二维码图片在URL扫描型安全产品看来就是一张普通图片。只要不调用OCR和解码模块它就是个无害的BMP/JPEG/PNG。更麻烦的是即使解码出了URL绝大多数安全产品只做静态信誉查询而攻击者会让QR码指向正常域名下的一个子路径再利用开放重定向跳到钓鱼页信誉列表永远不会命中。还有一个容易被忽略的原因扫码动作发生在个人手机或未受管的BYOD设备上。关键基础设施单位的管理员通常只保护企业配发的Windows电脑但手机不在管控范围。当手机访问钓鱼站点时只有手机厂商自带的浏览器安全功能在起作用而企业内部零散的EDR、防火墙根本看不到这段流量。等到用户把凭据输入进去所有防护才后知后觉。2. 多维防御架构设计从单点拦截到纵深协同既然Quishing跨越物理、终端、网络、身份、行为多个域那么防御就不能只依赖某一款“二维码安全网关”。我给客户设计的是一套五层协同的架构终端侧、网络侧、身份侧、邮件协同侧、物理管理侧。五层通过威胁情报和告警联动串起来形成一张网。2.1 终端侧防护移动设备与QR扫描入口第一步不是装App而是把扫码入口管起来。企业应该强制规定员工在办公区域扫码时必须使用企业统一管控的扫码工具而不是直接打开相机。这个工具需要具备以下几种能力URL安全预览扫码后不直接跳转先解析出链接并展示给用户同时与云端安全数据库比对信誉。域名相似度分析识别形如“wèb”或“rni11”这类视觉混淆域名。禁止自动下载文件防止二维码触发下载恶意APK或带有宏的文档。沙箱化打开对于必须打开的链接在远端的浏览器隔离服务中渲染而不是在本地WebView里渲染。如果没有预算建设专用App可以退而求其次在移动设备管理MDM策略里把默认浏览器的自动跳转改为“询问”同时部署DNS安全插播对所有查询做信誉过滤。我在某水司实际部署过先用MDM禁止相机直接识别二维码只保留企业扫码器再配合本地DNS拦截成功拦截了一次针对生成车间的QR码钓鱼演练。2.2 网络侧防护URL分析与DNS拦截二维码最终通向URL所以网络侧必须能看清“扫码之后的流量”。对于办公网络和单独划分的移动设备接入网络要在出口DNS和HTTP代理上做双路检测DNS层对所有域名解析请求做动态恶意域名判定重点解析短链服务bit.ly、t.cn等的原始链接并把短链接跳转后的最终域名也纳入信誉判定。HTTP层使用安全代理或其他中间箱对页面内容做实时分析重点识别“仿冒登录框”。不需要什么AI大模型简单的DOM特征提取就足够页面标题包含“登录”“认证”但域名不是企业已备案的域名且表单提交地址不在白名单内就告警。证书透明日志定期检查企业相关域名的证书是否被仿冒利用证书透明度CT日志扫描新签发的相似域名。在这里要特别强调一点必须把OT网络边界处的对外访问也纳入检测。很多工业网络安全工程师认为OT区必须单向隔离但实际上现在不少PLC、HMI都需要升级固件、同步时间或上传工艺数据运维人员会用U盘或临时笔记本接上外网。Quishing这类攻击的落点恰恰是这种“允许但未记录”的边界松动处。建议在DMZ区和OT维护区的出站流量上部署独立DNS解析器所有出站DNS请求都强制走该解析器并记录完整日志。2.3 身份侧防护FIDO2与持续验证Quishing攻击的最终目的是拿身份。所以无论二维码后面是什么只要身份验证环节足够硬钓鱼就失去意义。我强烈建议关键基础设施单位对所有可远程访问的员工账号强制启用FIDO2硬件密钥或基于设备绑定的无密码认证而不是短信验证码或邮箱OTP——因为二维码钓鱼可以同时诱导用户输入邮箱验证码甚至伪造一次性密码。对于无法立即升级到FIDO2的系统至少要做到以下两点登录行为上下文检测记录登录的IP地理位置、设备指纹、接入网络是否从员工手机热点接入、时间规律。发现账号在A城市办公网登录后十分钟内又从B城市登录立刻触发强制二次验证。分级账户策略区分“只有IT系统访问权”和“能访问OT组态软件”的高权限账户。高权限账户禁止通过Web门户登录只能从独立的运维堡垒机执行命令。这样即使二维码钓鱼拿到的是普通域账号也无法触达PLC操作界面。2.4 邮件与协同办公侧防护图片解码与OCR识别邮件网关目前还很难对二维码图片做深度判读但我们可以通过外挂的方式补足部署一个QR感知模块在邮件进入用户收件箱之前执行一次“图片解码-URL提取-信誉查询”流程。具体做法是用开源解析库把邮件和附件里的所有JPEG/PNG/GIF识别出来检查是否存在高密度定位图形QR码的三个回字角有则解码并提取URL。然后将这个URL送入已有的邮件URL信誉系统。遇到短链就自动展开。这一步最大的问题是计算资源消耗。一个200人的单位每天邮件附件图片可能几千张全部解码会导致邮件网关延迟。我的经验是使用两级过滤先通过灰度图形特征快速筛掉绝大多数不含二维码的图片只对疑似图进行解码。实测下来单台8核服务器每天处理5万封邮件完全没问题。协同办公软件如企业微信、钉钉、Teams等也要做同样的策略因为这些内部即时通讯工具里的二维码用户几乎不会质疑来源。配置规则所有出现在群聊、单聊中的图片附件都调用与邮件网关相同的QR检测服务检测出URL后统一替换成“安全链接”样式并且点击前必须经过网页隔离检查。2.5 物理安全与二维码生成管理这个维度最容易被人忽视但对关键基础设施尤其重要。废纸篓里回收的一张二维码门禁卡公告栏上一张被换掉的缴费码都可能是突破口。物理层面的防御手段其实很朴素统一二维码生成与登记系统所有面向员工和访客的二维码无论是访客登记、会议室预约、设备巡检统一由某一平台生成并记录生成时间、申请人、绑定URL。对二维码的URL实行短生命周期默认有效期只有24小时过期自动失效。防替换巡检对在公共区域长期展示的二维码安排安保人员以拍照方式定期比对用图像哈希检测贴纸是否被更换。打印物销毁流程含有二维码的临时工牌、访客凭条、废旧海报在丢弃前必须粉碎或涂黑二维码区域。这个习惯成本极低但能断了最笨却有效的“换码骗局”。3. 实施细节与关键技术让防御真正落地3.1 QR码预览与解析技术选型很多团队觉得二维码解析是大难题其实不然。我梳理过一轮目前主流方案是ZBar、ZXing、OpenCV配合草拟的定位解码。在实际项目中我更倾向于使用ZXing的Java/C实现因为它的容错能力强对破损二维码打了码、贴了半张也能解出数据。但重点不是解码而是“预览”。我们做的二维码安全工具在弹出预览页时不只展示URL还要展示以下信息完整域名包括一级域名和注册域名用视觉上高亮的方式标出。证书信息中的公司名称如果页面是HTTPS可以预先抓取证书中的CN字段。URL扫描结果的简短判定“该域名未在企业白名单”。一个“复制链接到安全浏览器分析”的按钮而不是“立即打开”。这个预览带给了用户一个“思考间隙”实验表明只要用户看到域名显示为陌生后缀拦截成功率会提升40%以上。3.2 可信二维码标记与溯源关键基础设施单位可以考虑发布自己的“可信二维码”——也就是带有企业签名的二维码。具体实现方式是在二维码的数据内容里嵌入一个JSON结构{ type: employee_badge, tenant: water-uas-01, nonce: 6f1d3c91a1, expires: 1719000000, target_url: https://sso.internal.example.com/qr/register, signature: base64(ed25519_sign(hash(...))) }扫码工具在解码后先验证签名是否来自企业证书链再检查目标URL是否在企业的“内部系统域名白名单”里两个条件都满足才允许自动跳转。这个方案的难度不在技术而在管理所有打印出来的可信二维码都需要电子审批记录而且URL必须使用系统内域名不能使用公共短链。只要伪造二维码的签名不合法即使二维码图片做得再像扫码工具也会直接报警。我在一个电网项目里试点过把关键设备巡检的二维码全部换成带签名的可信二维码。同时把所有旧的普通二维码作废。两周内就有三位场站员工报告“扫码工具提示未知二维码”排查发现其中一张是微信群里的不明来源图片还有一张是贴在厕所隔板上的恶作剧码。这两起事件因为工具的预警被及时拦在了发生危害之前。3.3 与现有SOC/SIEM的集成多维防御的最后一环是让所有“Quishing事件”在安全运营中心SOC汇聚成可关联告警。为此我把每一维度的检测事件都统一成以下字段维度主要检测事件告警信号终端扫码工具发现的恶意URL恶意二维码拦截网络DNS解析恶意域名、HTTP访问仿冒登录页QuishingURL命中身份异常登录位置、异常设备QR钓鱼后凭据滥用迹象物理二维码替换巡检失败二维码被篡改在SIEM里我用三个关联规则驱动响应同一用户设备在24小时内被“主动扫码告警”命中且该设备访问过一次非白名单登录页则提升风险等级。同一员工账号在扫码拦截后30分钟内出现新设备登录则触发阻断。同一个QR码图片哈希关联到多名用户比如同一个伪造贴纸被多个人扫则触发事件升级并通知应急响应组。这种关联能帮你把“孤立的扫码误触”和“一次真正的Quishing攻击”区分开。实际运营中99%的扫码告警只会到达员工个人的手机端不会打扰SOC。只有同时满足两个以上条件时才告警给值班人员。3.4 零信任架构下的最小授权零信任和Quishing天然契合。为什么因为Quishing偷到的是“用户输入的那一刻的信任”。如果系统默认不信任任何来源即使有合法凭据也要持续验证那么钓鱼获得的凭据价值就会大幅下降。落地时我不建议一开始就全盘上零信任大平台而是做两个最小集网络微隔离把工控资产按工艺段划分每个区域只允许特定工程站访问。即使用户账号被钓鱼他也只能看到自己工作区域的资产而不是整个OT网段。应用代理前置将所有进入OT区的Web操作组态软件配置、报表查询、设备状态页面都经过一个反代网关在网关层做统一登录、短暂会话比如2分钟无操作即退出、提交内容只允许白名单指令。这样被钓鱼的账号即便拿到了URL也会被网关的二次人机校验和短会话拦住。4. 实战演练与排查经验4.1 模拟Quishing攻击的红蓝对抗设计如果你需要验证自己单位的防御水平强烈建议做一次无预警的QR码钓鱼演练。步骤参考如下先向管理层说明这是受控的红队任务但不对普通员工提前透露。由红队制作一个仿冒内部系统的钓鱼页域名使用相似域名比如“example-uauth.com”并配置HTTPS证书。打印30张二维码分别投放到食堂、电梯、门禁、吸烟区。如果条件允许再通过内部邮件发送一张二维码图片主题为“新版员工福利登记入口”。在扫码工具的检测模块里把该恶意域名标记为“需告警但不阻断”的测试模式以收集真实用户行为数据。观察并记录扫码次数、输入凭据人数、是否有人点击了不受信任链接以及用户是否向安全部门报告可疑二维码。我操盘过的一场演练里48%的员工扫了码其中19%输入了账号密码只有1人主动报告。这个结果让管理层立刻认识到Quishing的威力。另外演量结束后的复盘非常关键把“报告给安全部门”这一条也纳入KPI因为员工主动报告才是“人为防火墙”真正起效的信号。4.2 发现异常扫描行为的指标即使没有专门的二维码安全工具你也可以通过现有日志寻找Quishing的蛛丝马迹DNS请求异常在某台移动设备上连续出现多个短链域名解析请求且这些短链最终指向同一陌生域名就是典型的“扫码后跳转”行为。移动设备流量特征手机访问某登录页时User-Agent显示为手机浏览器但你单位根本没有针对手机的Web应用就值得怀疑。凭据使用异动域控日志中同一账号从多个新设备登录且登录时间处于非工作时段同时伴随密码更改行为。OT组态变更攻击者利用窃取的凭据登录后往往会在工程站上创建新的下载任务或修改某个控制逻辑。因此对工程站的组态变更记录做基线比对对一切非计划变更触发即时阻断。我处理过一起真实事件某水厂OA账号在深夜登录了SCADA的工程站行为是从未见过的IP段。排查后发现是该员工的手机中了恶意二维码凭据被钓鱼后又被横向移动工程站。幸亏我们在组态变更日志里设置了异常告警整个处置时间压缩到了15分钟。4.3 真实处置流程示例假设你接到一条SOC告警“员工A的设备扫描了未知二维码随后账号在异地登录”。完整的处置流程应该是确认设备身份通过MDM查询员工A的设备是否在公司注册序列内如果不是则要求立即强制退出所有登录会话、禁止接入企业网络。重置凭据立即强制该用户修改密码并注销所有会话令牌包括浏览器Cookie、移动端令牌。溯源二维码从扫描工具日志中调取二维码的图片哈希反向检索该图片是否在其他设备上出现过确认是点对点发送还是公共区域张贴。检查横向扩散在10分钟内筛查该账号访问过的所有服务器和共享目录重点检查是否存在弱口令、本地管理员账号复用。锁定边界如确认是物理投递通知安保部门调取现场监控筛查可疑人员同时清除相关区域的所有同款贴纸。复盘与更新将恶意域名计入黑名单、把QR码图片加进威胁情报、更新员工宣传素材告知员工“常见的诱导话术”。整个过程不能超过2小时因为攻击者可能已经试图用窃取的凭据做更深的渗透。拖得越久损失越大。5. 常见问题与避坑清单5.1 三个最常见的误区误区一只要封住邮件附件里二维码图片就够了。实际Quishing最常见的投递路径是物理贴纸和即时通讯邮件网关挡不住所有。防御时务必把物理投递纳入同等权重而不是只盯着邮件网关。误区二用“手机不允许拍照”来防Quishing。非常不现实也极其影响生产。关键现场人员拍照记录设备铭牌、仪表读数是刚需。越禁止越容易引发逆反员工会偷偷用个人手机绕过管理。正确的做法是管住“扫码后干了什么”而不是管住“能不能扫”。误区三给所有二维码加个“防伪标签”就完事。只有防伪但不在扫码工具里校验那只是心理安慰。可信二维码方案必须闭环签发、验证、阻断、告警四步缺一不可。5.2 中小型设施如何低成本起步如果你的单位预算有限无法一次性建设完整的“可信二维码平台”可以从这套最小组合开始用开源ZXing做扫码工具加一个简单的URL白名单校验文件。在企业DNS处部署一个恶意域名屏蔽模块。让所有进行远程访问的账号开启多因素认证优先使用硬件密钥。对高权限运维账号额外规定只能通过堡垒机登录OT系统禁止直接SSH/RDP。在公共二维码张贴区增加巡检打卡点用NFC近场通信标签做位置验证防止二维码被更换。这套方案一个月内就能落地成本几乎为零。但效果立竿见影拦截了95%以上的脚本化Quishing剩下的5%也会被多因素认证和堡垒机挡住最终进不到工业控制网络。5.3 工具选型参考能力需求建议方向备注二维码图片内嵌URL提取使用ZXing或ZBar集成识别速度快支持批量处理短链接还原调用安全厂商的短链解析API不要自己去逐层访问防点“带毒链接”页面仿冒识别无头浏览器抓取页面标题、表单、域名注意设置无头浏览器识别反爬策略移动端扫码安全企业应用商店内统一安装扫码器禁用系统相机识别二维码DNS信誉拦截采用支持动态黑名单的DNS服务器必须同时过滤IPv6查询我见过不少团队迷信“AI识别钓鱼页面”结果被带了图片验证码的假登录页骗得七荤八素。其实对大多数Quishing攻击来说简单的规则引擎远比花哨的机器学习可靠。所以工具选型先求稳和可解释再考虑智能升级。6. 写在最后的一点心里话过去三年我做过十几场Quishing相关的攻防测试最大的感悟是二维码本身不危险危险的是我们对“扫码”这个动作习以为常。在关键基础设施里一条最容易进入的路径往往不是攻破最先进的防火墙而是让一位疲惫的值班员扫一张贴在设备柜上的二维码。技术防御固然重要但我更希望每个参与防御的人都能在自己的手机里装一个“会怀疑的扫码器”在手指点击跳转之前多看一眼域名。这个习惯的养成比任何安全产品都值得投入。如果你准备在单位推动Quishing防御别急着买设备先拿一张自制二维码贴在茶水间试试看看谁会扫谁会报告——结果一定会说服你的领导。