新的 Quishing 攻击利用武器化的二维码瞄准微软用户
微软用户正面临一场新型的钓鱼活动,该活动利用恶意电子邮件中嵌入的武器化二维码。 此次攻击于 2025 年 10 月初出现,利用了对基于二维码的身份验证和设备配对工作流程的信任,诱骗目标扫描提供信息窃取者二进制文件的代码。
微软用户正面临一场新型的钓鱼活动,该活动利用恶意电子邮件中嵌入的武器化二维码。
此次攻击于 2025 年 10 月初出现,利用了对基于二维码的身份验证和设备配对工作流程的信任,诱骗目标扫描提供信息窃取者二进制文件的代码。
当 Gen Threat Labs 分析师注意到企业 Office 365 通知中存在冒充微软品牌的异常二维码附件时,初步报告浮出水面。
扫描代码的收件人将被重定向到托管分阶段有效负载传递序列的受损 Azure CDN 节点。
病毒出现后,研究人员发现了多种感染媒介。其中一种是一封伪装成 Microsoft Teams 警报的网络钓鱼邮件,指示用户扫描二维码以解决紧急安全问题。
另一个则伪装成Microsoft Authenticator注册提示,承诺扫描后即可获得“增强登录保护”。由于许多组织都鼓励使用基于二维码的多因素身份验证,因此这些诱饵乍一看似乎是合法的。
Gen Threat Labs 的研究人员指出(https://x.com/GenThreatLabs/status/1975566703942668697),受害者看到了熟悉的微软徽标和格式正确的链接,从而增加了该活动的覆盖面和成功率。
其影响涵盖凭证窃取和系统入侵。一旦扫描二维码,受害者就会收到一个解析为恶意重定向脚本的短 URL。
该脚本在下载打包的信息窃取程序 (PI) 可执行文件之前执行环境检查 - 验证 Windows 区域设置、已安装的 Defender 版本和沙盒指示器。
该二进制文件通过创建名为“MSAuthSync”的计划任务来建立持久性,确保每次用户登录时执行该任务。提取的凭据和主机遥测数据通过HTTPS传输到攻击者控制的端点。
感染机制
此次攻击的一个关键创新在于其二维码 AV 规避技术。恶意软件并非嵌入单个二维码图像,而是将二维码拆分成两个通过 PDF 内容流绘制的重叠图像。
标准二维码解码器会忽略非标准调色板和分割段,但自定义解析器会在解码之前重新组合图像层。
以下 Python 代码片段说明了防御者如何重建和解码此类分割二维码:这种方法凸显了武器化的二维码图像如何逃避静态 AV 签名和简单的视觉检查,强调了现代网络钓鱼活动中分层分析的必要性。
此次攻击于 2025 年 10 月初出现,利用了对基于二维码的身份验证和设备配对工作流程的信任,诱骗目标扫描提供信息窃取者二进制文件的代码。
当 Gen Threat Labs 分析师注意到企业 Office 365 通知中存在冒充微软品牌的异常二维码附件时,初步报告浮出水面。
扫描代码的收件人将被重定向到托管分阶段有效负载传递序列的受损 Azure CDN 节点。
病毒出现后,研究人员发现了多种感染媒介。其中一种是一封伪装成 Microsoft Teams 警报的网络钓鱼邮件,指示用户扫描二维码以解决紧急安全问题。
另一个则伪装成Microsoft Authenticator注册提示,承诺扫描后即可获得“增强登录保护”。由于许多组织都鼓励使用基于二维码的多因素身份验证,因此这些诱饵乍一看似乎是合法的。
Gen Threat Labs 的研究人员指出(https://x.com/GenThreatLabs/status/1975566703942668697),受害者看到了熟悉的微软徽标和格式正确的链接,从而增加了该活动的覆盖面和成功率。
其影响涵盖凭证窃取和系统入侵。一旦扫描二维码,受害者就会收到一个解析为恶意重定向脚本的短 URL。
该脚本在下载打包的信息窃取程序 (PI) 可执行文件之前执行环境检查 - 验证 Windows 区域设置、已安装的 Defender 版本和沙盒指示器。
该二进制文件通过创建名为“MSAuthSync”的计划任务来建立持久性,确保每次用户登录时执行该任务。提取的凭据和主机遥测数据通过HTTPS传输到攻击者控制的端点。
感染机制
此次攻击的一个关键创新在于其二维码 AV 规避技术。恶意软件并非嵌入单个二维码图像,而是将二维码拆分成两个通过 PDF 内容流绘制的重叠图像。
标准二维码解码器会忽略非标准调色板和分割段,但自定义解析器会在解码之前重新组合图像层。
以下 Python 代码片段说明了防御者如何重建和解码此类分割二维码:
from PIL import Image
import zbarlight
# Load the two image layers
layer1 = Image.open('qr_part1.png').convert('RGB')
layer2 = Image.open('qr_part2.png').convert('RGB')
# Recombine by taking the brighter pixel from each
merged = Image.new('RGB', layer1.size)
pixels1, pixels2 = layer1.load(), layer2.load()
for x in range(layer1.width):
for y in range(layer1.height):
pixels = pixels1[x, y] if sum(pixels1[x, y]) > sum(pixels2[x, y]) else pixels2[x, y]
merged.putpixel((x, y), pixels)
# Decode the merged QR code
codes = zbarlight.scan_codes('qrcode', merged)
print('Decoded URL:', codes[0].decode())
评论0次