Tech
静音也拦不住:速卖通网页在你听不见的频率上,开着一台锯齿波发生器
2026年8月21日 · 凯文·凯利《失控》~1 min read
耳机同时连着电脑和手机,手机在放歌。打开速卖通首页,几秒后歌停了;关掉那个标签页,歌又回来。静音标签、静音浏览器、静音整个系统,全没用。一位博主盯着这个邪门现象看了半天:页面上连个播放器的影子都没有。
30 秒读懂
速卖通页面空闲几秒后悄悄创建 2 个隐藏 AudioContext,全部进入 running,连到系统音频出口。
调用栈指向阿里风控组件 collina.js(1.140.0)与 fireyejs.js(1.231.67),代码重度混淆。
链路末端增益为 0:人听不见,系统却判定「有声音在播」,多点蓝牙耳机于是把占线权判给电脑。
真实用途是音频指纹:不同设备渲染同一波形的微小差异,拼起来能区分设备,服务风控与追踪。
隐蔽采集栽在自己的副作用上;这事在 HN 拿了 851 分、280 条评论。
1 怪事
歌被掐了,页面上却查无凶手
所有常规嫌疑人都有不在场证明。
博主第一反应跟你我一样:多半是哪个商品视频在自动播放。他把常规嫌疑人挨个过了一遍:
查什么 结果
<audio> / <video> 元素 零个
媒体 play() 调用 零次
Media Session 播放状态 none
媒体类网络请求 没有
四条线全断。剩下一个细节:问题不在开页那一刻,是页面闲了几秒之后才来。你别看这点小,其实方向全在这——不是哪个媒体文件在响,是有段代码趁页面歇着的时候干了别的。
⚡ 为什么值得看: 速卖通只是撞上的那家。真问题在 HN 吵了 280 层楼:浏览器给网页的每个能力,最后会被用到什么份上。
2 抓包
包一层构造器,才逮到两个看不见的「播放器」
抓不到现行,就在门口挂个铃铛。
他换了个打法:给 AudioContext 构造函数包一层壳,AudioNode.connect 也包上。谁创建音频上下文、谁往音频出口接线,日志里就记一笔。进没进门,嘴上说了不算,铃响了才算。
铃铛很快响了两下。页面空闲时创建了两个 AudioContext,都进入 running,都连上了 destination,也就是系统音频总出口。调用栈指向 assets.aliexpress-media.com 上 AWSC 目录下的 collina.js(1.140.0)和 fireyejs.js(1.231.67),属阿里巴巴的风控反爬组件,混淆得没法直接读。
核心 两个隐藏音频上下文,零个媒体元素,零次 play() 调用。静音按钮从头到尾都使不上劲:它能管的东西,这条链路上一件都没有。
从混淆代码里还是抠出了骨架:一条从振荡器一路接到系统出口的完整管线。画出来一目了然。
3 空转
音量是零,可整条链路在真跑
锯齿波振荡器 → 分析器 → ScriptProcessor → 增益 0 → 系统出口。
看懂它,得把整条链拆开看。头上,振荡器生成一个已知的锯齿波;中间,AnalyserNode 测这个波被浏览器音频栈渲染之后的样子;末端,增益归零再接进系统出口。人耳什么都听不见,但浏览器在真实渲染这条链,操作系统据此判定:有声音在播。多点耳机的仲裁逻辑很朴素,谁在播就把占线权给谁,手机那头的歌,就这么被一段没有声音的声音挤掉了。
打个比方
像把车挂空挡踩着油门:轮子不动,发动机在真转、真烧油,车位也真被占着。多点耳机就是停车场管理员,一看电脑这边发动机响着,就把唯一的车位判过去。
说白了,静音键管的是「让你听不见」,从来管不了「系统认不认为在播」。这两件事平时重合,我们就当成了一件事。这回它俩分了家。
A ZERO-GAIN AUDIO CHAIN STOLE THE HEADPHONES' LINE collina.js · fireyejs.js Alibaba AWSC risk-control scripts · 2 hidden AudioContexts SILENT AUDIO GRAPH IN THE PAGE inject OscillatorNode sawtooth wave AnalyserNode ScriptProcessorNode GainNode gain=0 · muted AudioContext .destination THE SIDE EFFECT Audio stack stays active System decides “now playing” Multipoint earbuds hand the link to the PC Phone-side audio gets pushed out audio data flow script injection · side effect Source: blogger laserphile's hands-on teardown of an AliExpress product page (2026/8). Silent fingerprinting shows itself only through its side effects.
4 指纹
它按设计在运转:这是一台指纹机
同一个波形,一万台设备渲染出一万种微小的不同。
指纹机的原理:不同的硬件、驱动、系统、浏览器版本,渲染同一个波形会带出各自的微小偏差。单看没意义,凑一起就是一枚能区分设备的指纹,风控拿它认设备、抓机器人、追踪回头客。脚本里量的远不止音频这一路:canvas 渲染、WebGL 信息、屏幕尺寸、硬件并发数、插件列表、WebRTC 行为、鼠标触摸轨迹,量完加密上报。cookie 一清就没,这套东西你清不掉。
WebAudio 设计初衷
给网页做合成器、游戏音效、可视化。规范通篇讲的是怎么发出声音。
这次的实际用法
发一段没人听的声音,量渲染偏差,给设备按指纹。全程静默。
凯文·凯利在《失控》里写过一个规律:给系统加的每个能力,都会长出设计者没预料的用法。WebAudio 的设计者想的是让网页出声,没想过「渲染声音的过程」本身能当尺子使。能力一旦交出去,用法就不归设计者管了。
5 告密者
隐蔽的采集,栽在一个没人算到的副作用上
全程静默的系统,被一副耳机供了出来。
这套指纹在无数台电脑上跑过,绝大多数人毫无察觉。让它现形的另有其人:蓝牙多点的占线仲裁,另一个同样在设计之外的机制。两个「设计外用法」迎面相撞,才炸出这一声响。副作用是复杂系统的告密者,系统里瞒着人干的活,迟早从哪个零件上漏出动静。
这类角色我自己也当过。2024 年我给自家 SaaS 的登录页接过一个免费的第三方防刷脚本,阿坤在微信上抱怨:「你这后台一开着,我笔记本风扇就起飞。」我不信,当晚开着任务管理器把登录页晾了一小时:页面明明闲着,GPU 占用每三十来秒跳一下,是那脚本在反复跑 canvas 指纹渲染。我把它拆了,自己写了八十行计数加频控,他的风扇当晚就安静了。用户看不见的活,机器替他看见了,那回告密的是风扇。
HN 上也有人替速卖通说话:盗号、薅优惠券、爬虫下单,风控确实得认设备,指纹比 cookie 难伪造,这是真需求。这话不假。可争的从来不在要不要风控,在告不告诉你:页面零提示,代码往死里混淆,静音键还管不住。评论区反复出现一句话,两边都认:浏览器给的每个能力,都会被用满。
核心 审计与披露都没做到的事,一条蓝牙仲裁规则做到了。这类行为靠制度查不出来,靠碰撞才暴露,而碰撞什么时候来,谁也排不了期。
6 你能做什么
这对你意味着什么
三件小事,一个心法。
音频莫名被占线、蓝牙莫名切设备,先怀疑网页:把标签页挨个关掉试,比重启耳机管用。想直接拦,博主给了两条 uBlock Origin 规则,精确封掉 collina.js 和 fireyejs.js 两个脚本族;他实测拦掉后页面照常渲染,隐藏音频上下文不再出现。要是你自己也在做产品,接第三方脚本前记着阿坤的风扇:它在用户机器上干什么,你不盯一眼是真不知道。
拦截风控脚本可能换来更多验证码,登录支付异常时应临时放行;规则只覆盖观察到的两个脚本族,随时可能失效。这两条我自己没实测过,细节以原始报道为准。
更值钱的是心法。设备闹脾气,别急着当故障处理,先当线索看。日志能混淆,声明能美化,零件不会:风扇转没转、耳机切没切,机器从不配合演出。耳机没坏,它只是提前把实话说了。
本文框架取材自凯文·凯利《失控》;事件与技术细节以原始报道与博文为准。
技术
静音也拦不住:速卖通网页在你听不见的频率上,开着一台锯齿波发生器
2026年8月21日 · 凯文·凯利《失控》约 6 分钟
耳机同时连着电脑和手机,手机在放歌。打开速卖通首页,几秒后歌停了;关掉那个标签页,歌又回来。静音标签、静音浏览器、静音整个系统,全没用。一位博主盯着这个邪门现象看了半天:页面上连个播放器的影子都没有。
30 秒读懂
速卖通页面空闲几秒后悄悄创建 2 个隐藏 AudioContext,全部进入 running,连到系统音频出口。
调用栈指向阿里风控组件 collina.js(1.140.0)与 fireyejs.js(1.231.67),代码重度混淆。
链路末端增益为 0:人听不见,系统却判定「有声音在播」,多点蓝牙耳机于是把占线权判给电脑。
真实用途是音频指纹:不同设备渲染同一波形的微小差异,拼起来能区分设备,服务风控与追踪。
隐蔽采集栽在自己的副作用上;这事在 HN 拿了 851 分、280 条评论。
1 怪事
歌被掐了,页面上却查无凶手
所有常规嫌疑人都有不在场证明。
博主第一反应跟你我一样:多半是哪个商品视频在自动播放。他把常规嫌疑人挨个过了一遍:
查什么 结果
<audio> / <video> 元素 零个
媒体 play() 调用 零次
Media Session 播放状态 none
媒体类网络请求 没有
四条线全断。剩下一个细节:问题不在开页那一刻,是页面闲了几秒之后才来。你别看这点小,其实方向全在这——不是哪个媒体文件在响,是有段代码趁页面歇着的时候干了别的。
⚡ 为什么值得看: 速卖通只是撞上的那家。真问题在 HN 吵了 280 层楼:浏览器给网页的每个能力,最后会被用到什么份上。
2 抓包
包一层构造器,才逮到两个看不见的「播放器」
抓不到现行,就在门口挂个铃铛。
他换了个打法:给 AudioContext 构造函数包一层壳,AudioNode.connect 也包上。谁创建音频上下文、谁往音频出口接线,日志里就记一笔。进没进门,嘴上说了不算,铃响了才算。
铃铛很快响了两下。页面空闲时创建了两个 AudioContext,都进入 running,都连上了 destination,也就是系统音频总出口。调用栈指向 assets.aliexpress-media.com 上 AWSC 目录下的 collina.js(1.140.0)和 fireyejs.js(1.231.67),属阿里巴巴的风控反爬组件,混淆得没法直接读。
核心 两个隐藏音频上下文,零个媒体元素,零次 play() 调用。静音按钮从头到尾都使不上劲:它能管的东西,这条链路上一件都没有。
从混淆代码里还是抠出了骨架:一条从振荡器一路接到系统出口的完整管线。画出来一目了然。
3 空转
音量是零,可整条链路在真跑
锯齿波振荡器 → 分析器 → ScriptProcessor → 增益 0 → 系统出口。
看懂它,得把整条链拆开看。头上,振荡器生成一个已知的锯齿波;中间,AnalyserNode 测这个波被浏览器音频栈渲染之后的样子;末端,增益归零再接进系统出口。人耳什么都听不见,但浏览器在真实渲染这条链,操作系统据此判定:有声音在播。多点耳机的仲裁逻辑很朴素,谁在播就把占线权给谁,手机那头的歌,就这么被一段没有声音的声音挤掉了。
打个比方
像把车挂空挡踩着油门:轮子不动,发动机在真转、真烧油,车位也真被占着。多点耳机就是停车场管理员,一看电脑这边发动机响着,就把唯一的车位判过去。
说白了,静音键管的是「让你听不见」,从来管不了「系统认不认为在播」。这两件事平时重合,我们就当成了一件事。这回它俩分了家。
一条增益为零的音频链,抢走了耳机的占线权 collina.js · fireyejs.js 阿里巴巴 AWSC 风控脚本 · 2 个隐藏 AudioContext 页面里的无声音频链 注入 OscillatorNode 锯齿波 AnalyserNode ScriptProcessorNode GainNode gain=0 · 静音 AudioContext .destination 副作用 音频栈 保持活跃 系统判定 「正在播放」 蓝牙多点耳机 把占线权判给电脑 手机侧的音频 被挤掉 音频数据流 脚本注入 · 副作用 来源:博主 laserphile 对速卖通页面的实测拆解(2026 年 8 月)。无声的指纹采集,靠副作用现了形。
4 指纹
它按设计在运转:这是一台指纹机
同一个波形,一万台设备渲染出一万种微小的不同。
指纹机的原理:不同的硬件、驱动、系统、浏览器版本,渲染同一个波形会带出各自的微小偏差。单看没意义,凑一起就是一枚能区分设备的指纹,风控拿它认设备、抓机器人、追踪回头客。脚本里量的远不止音频这一路:canvas 渲染、WebGL 信息、屏幕尺寸、硬件并发数、插件列表、WebRTC 行为、鼠标触摸轨迹,量完加密上报。cookie 一清就没,这套东西你清不掉。
WebAudio 设计初衷
给网页做合成器、游戏音效、可视化。规范通篇讲的是怎么发出声音。
这次的实际用法
发一段没人听的声音,量渲染偏差,给设备按指纹。全程静默。
凯文·凯利在《失控》里写过一个规律:给系统加的每个能力,都会长出设计者没预料的用法。WebAudio 的设计者想的是让网页出声,没想过「渲染声音的过程」本身能当尺子使。能力一旦交出去,用法就不归设计者管了。
5 告密者
隐蔽的采集,栽在一个没人算到的副作用上
全程静默的系统,被一副耳机供了出来。
这套指纹在无数台电脑上跑过,绝大多数人毫无察觉。让它现形的另有其人:蓝牙多点的占线仲裁,另一个同样在设计之外的机制。两个「设计外用法」迎面相撞,才炸出这一声响。副作用是复杂系统的告密者,系统里瞒着人干的活,迟早从哪个零件上漏出动静。
这类角色我自己也当过。2024 年我给自家 SaaS 的登录页接过一个免费的第三方防刷脚本,阿坤在微信上抱怨:「你这后台一开着,我笔记本风扇就起飞。」我不信,当晚开着任务管理器把登录页晾了一小时:页面明明闲着,GPU 占用每三十来秒跳一下,是那脚本在反复跑 canvas 指纹渲染。我把它拆了,自己写了八十行计数加频控,他的风扇当晚就安静了。用户看不见的活,机器替他看见了,那回告密的是风扇。
HN 上也有人替速卖通说话:盗号、薅优惠券、爬虫下单,风控确实得认设备,指纹比 cookie 难伪造,这是真需求。这话不假。可争的从来不在要不要风控,在告不告诉你:页面零提示,代码往死里混淆,静音键还管不住。评论区反复出现一句话,两边都认:浏览器给的每个能力,都会被用满。
核心 审计与披露都没做到的事,一条蓝牙仲裁规则做到了。这类行为靠制度查不出来,靠碰撞才暴露,而碰撞什么时候来,谁也排不了期。
6 你能做什么
这对你意味着什么
三件小事,一个心法。
音频莫名被占线、蓝牙莫名切设备,先怀疑网页:把标签页挨个关掉试,比重启耳机管用。想直接拦,博主给了两条 uBlock Origin 规则,精确封掉 collina.js 和 fireyejs.js 两个脚本族;他实测拦掉后页面照常渲染,隐藏音频上下文不再出现。要是你自己也在做产品,接第三方脚本前记着阿坤的风扇:它在用户机器上干什么,你不盯一眼是真不知道。
拦截风控脚本可能换来更多验证码,登录支付异常时应临时放行;规则只覆盖观察到的两个脚本族,随时可能失效。这两条我自己没实测过,细节以原始报道为准。
更值钱的是心法。设备闹脾气,别急着当故障处理,先当线索看。日志能混淆,声明能美化,零件不会:风扇转没转、耳机切没切,机器从不配合演出。耳机没坏,它只是提前把实话说了。
本文框架取材自凯文·凯利《失控》;事件与技术细节以原始报道与博文为准。
テクノロジー
静音也拦不住:速卖通网页在你听不见的频率上,开着一台锯齿波发生器
2026年8月21日 · 凯文·凯利《失控》約 6 分
耳机同时连着电脑和手机,手机在放歌。打开速卖通首页,几秒后歌停了;关掉那个标签页,歌又回来。静音标签、静音浏览器、静音整个系统,全没用。一位博主盯着这个邪门现象看了半天:页面上连个播放器的影子都没有。
30 秒读懂
速卖通页面空闲几秒后悄悄创建 2 个隐藏 AudioContext,全部进入 running,连到系统音频出口。
调用栈指向阿里风控组件 collina.js(1.140.0)与 fireyejs.js(1.231.67),代码重度混淆。
链路末端增益为 0:人听不见,系统却判定「有声音在播」,多点蓝牙耳机于是把占线权判给电脑。
真实用途是音频指纹:不同设备渲染同一波形的微小差异,拼起来能区分设备,服务风控与追踪。
隐蔽采集栽在自己的副作用上;这事在 HN 拿了 851 分、280 条评论。
1 怪事
歌被掐了,页面上却查无凶手
所有常规嫌疑人都有不在场证明。
博主第一反应跟你我一样:多半是哪个商品视频在自动播放。他把常规嫌疑人挨个过了一遍:
查什么 结果
<audio> / <video> 元素 零个
媒体 play() 调用 零次
Media Session 播放状态 none
媒体类网络请求 没有
四条线全断。剩下一个细节:问题不在开页那一刻,是页面闲了几秒之后才来。你别看这点小,其实方向全在这——不是哪个媒体文件在响,是有段代码趁页面歇着的时候干了别的。
⚡ 为什么值得看: 速卖通只是撞上的那家。真问题在 HN 吵了 280 层楼:浏览器给网页的每个能力,最后会被用到什么份上。
2 抓包
包一层构造器,才逮到两个看不见的「播放器」
抓不到现行,就在门口挂个铃铛。
他换了个打法:给 AudioContext 构造函数包一层壳,AudioNode.connect 也包上。谁创建音频上下文、谁往音频出口接线,日志里就记一笔。进没进门,嘴上说了不算,铃响了才算。
铃铛很快响了两下。页面空闲时创建了两个 AudioContext,都进入 running,都连上了 destination,也就是系统音频总出口。调用栈指向 assets.aliexpress-media.com 上 AWSC 目录下的 collina.js(1.140.0)和 fireyejs.js(1.231.67),属阿里巴巴的风控反爬组件,混淆得没法直接读。
核心 两个隐藏音频上下文,零个媒体元素,零次 play() 调用。静音按钮从头到尾都使不上劲:它能管的东西,这条链路上一件都没有。
从混淆代码里还是抠出了骨架:一条从振荡器一路接到系统出口的完整管线。画出来一目了然。
3 空转
音量是零,可整条链路在真跑
锯齿波振荡器 → 分析器 → ScriptProcessor → 增益 0 → 系统出口。
看懂它,得把整条链拆开看。头上,振荡器生成一个已知的锯齿波;中间,AnalyserNode 测这个波被浏览器音频栈渲染之后的样子;末端,增益归零再接进系统出口。人耳什么都听不见,但浏览器在真实渲染这条链,操作系统据此判定:有声音在播。多点耳机的仲裁逻辑很朴素,谁在播就把占线权给谁,手机那头的歌,就这么被一段没有声音的声音挤掉了。
打个比方
像把车挂空挡踩着油门:轮子不动,发动机在真转、真烧油,车位也真被占着。多点耳机就是停车场管理员,一看电脑这边发动机响着,就把唯一的车位判过去。
说白了,静音键管的是「让你听不见」,从来管不了「系统认不认为在播」。这两件事平时重合,我们就当成了一件事。这回它俩分了家。
ゲインゼロの音声チェーンが、ヘッドホンの接続権を奪った collina.js · fireyejs.js アリババ AWSC リスク対策スクリプト · 隠れた AudioContext ×2 ページ内の無音オーディオグラフ 注入 OscillatorNode ノコギリ波 AnalyserNode ScriptProcessorNode GainNode gain=0 · 消音 AudioContext .destination 副作用 音声スタックは 活性のまま システムが 「再生中」と判定 マルチポイント機は 接続権をPCへ渡す スマホ側の音声が 追い出される 音声データの流れ スクリプト注入 · 副作用 出典:ブロガー laserphile による AliExpress ページの実測分解(2026年8月、詳細は元の報道に準じる)。無音の指紋採取は、副作用によって初めて姿を現す。
4 指纹
它按设计在运转:这是一台指纹机
同一个波形,一万台设备渲染出一万种微小的不同。
指纹机的原理:不同的硬件、驱动、系统、浏览器版本,渲染同一个波形会带出各自的微小偏差。单看没意义,凑一起就是一枚能区分设备的指纹,风控拿它认设备、抓机器人、追踪回头客。脚本里量的远不止音频这一路:canvas 渲染、WebGL 信息、屏幕尺寸、硬件并发数、插件列表、WebRTC 行为、鼠标触摸轨迹,量完加密上报。cookie 一清就没,这套东西你清不掉。
WebAudio 设计初衷
给网页做合成器、游戏音效、可视化。规范通篇讲的是怎么发出声音。
这次的实际用法
发一段没人听的声音,量渲染偏差,给设备按指纹。全程静默。
凯文·凯利在《失控》里写过一个规律:给系统加的每个能力,都会长出设计者没预料的用法。WebAudio 的设计者想的是让网页出声,没想过「渲染声音的过程」本身能当尺子使。能力一旦交出去,用法就不归设计者管了。
5 告密者
隐蔽的采集,栽在一个没人算到的副作用上
全程静默的系统,被一副耳机供了出来。
这套指纹在无数台电脑上跑过,绝大多数人毫无察觉。让它现形的另有其人:蓝牙多点的占线仲裁,另一个同样在设计之外的机制。两个「设计外用法」迎面相撞,才炸出这一声响。副作用是复杂系统的告密者,系统里瞒着人干的活,迟早从哪个零件上漏出动静。
这类角色我自己也当过。2024 年我给自家 SaaS 的登录页接过一个免费的第三方防刷脚本,阿坤在微信上抱怨:「你这后台一开着,我笔记本风扇就起飞。」我不信,当晚开着任务管理器把登录页晾了一小时:页面明明闲着,GPU 占用每三十来秒跳一下,是那脚本在反复跑 canvas 指纹渲染。我把它拆了,自己写了八十行计数加频控,他的风扇当晚就安静了。用户看不见的活,机器替他看见了,那回告密的是风扇。
HN 上也有人替速卖通说话:盗号、薅优惠券、爬虫下单,风控确实得认设备,指纹比 cookie 难伪造,这是真需求。这话不假。可争的从来不在要不要风控,在告不告诉你:页面零提示,代码往死里混淆,静音键还管不住。评论区反复出现一句话,两边都认:浏览器给的每个能力,都会被用满。
核心 审计与披露都没做到的事,一条蓝牙仲裁规则做到了。这类行为靠制度查不出来,靠碰撞才暴露,而碰撞什么时候来,谁也排不了期。
6 你能做什么
这对你意味着什么
三件小事,一个心法。
音频莫名被占线、蓝牙莫名切设备,先怀疑网页:把标签页挨个关掉试,比重启耳机管用。想直接拦,博主给了两条 uBlock Origin 规则,精确封掉 collina.js 和 fireyejs.js 两个脚本族;他实测拦掉后页面照常渲染,隐藏音频上下文不再出现。要是你自己也在做产品,接第三方脚本前记着阿坤的风扇:它在用户机器上干什么,你不盯一眼是真不知道。
拦截风控脚本可能换来更多验证码,登录支付异常时应临时放行;规则只覆盖观察到的两个脚本族,随时可能失效。这两条我自己没实测过,细节以原始报道为准。
更值钱的是心法。设备闹脾气,别急着当故障处理,先当线索看。日志能混淆,声明能美化,零件不会:风扇转没转、耳机切没切,机器从不配合演出。耳机没坏,它只是提前把实话说了。
本文框架取材自凯文·凯利《失控》;事件与技术细节以原始报道与博文为准。