[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fhdvmYaj-kU-AlF79v4Nn6g2tKFBs5R_E_8Y0wmTrrx4":3,"$fW7BAB5BkhrpFei-euf609NeK4ZvjPf9T1fzgXJlLNns":18,"$fnmKBTB4wXJlfKVdDwCQ0Ob1sZEypsWaVAu6VIwjYZCc":73,"$fJAngGPN2ZoweBAUNUMveHW9fX-PBt_OThOGUnXXFK7w":112},{"success":4,"data":5},true,{"siteTitle":6,"siteDescription":7,"siteSubtitle":8,"siteFaviconUrl":9,"siteLogoUrl":10,"footerText":11,"footerLinks":12,"socialLinks":13,"postsPerPage":14,"themeName":15,"navColor":16,"navTextColor":17},"Hyaika Blog","A personal blog powered by Hyaika","Penguin is all you need","🐧","\u002Fapi\u002Fmedia\u002Favatar_a0b54615","致三千年前的你",[],[],10,"kratos","#9147eb","#ffffff",{"success":4,"data":19},[20,27,33,39,44,50,55,61,67],{"id":21,"name":22,"slug":23,"description":24,"color":25,"postCount":26},"9ca4490e-c5a6-4b61-945c-4db21d224507","设计","design","UI\u002FUX 设计与创意",null,26,{"id":28,"name":29,"slug":30,"description":31,"color":25,"postCount":32},"a102062c-2d51-415b-bc5c-5b89b36f6e3f","动漫","anime","动漫点评与推荐",12,{"id":34,"name":35,"slug":36,"description":37,"color":25,"postCount":38},"b14ff5c7-a673-4cb1-a9e5-c785069b2938","生活","life","生活随笔与日常分享",43,{"id":40,"name":41,"slug":42,"description":43,"color":25,"postCount":32},"cat_ccf18b24e2c04191","社会观察","social-observation","社会观察、教育、文化对比",{"id":45,"name":46,"slug":47,"description":48,"color":25,"postCount":49},"cat_news_roundup","新闻杂烩","news-roundup","每日新闻汇总，覆盖科技、二次元、游戏、音乐等领域",56,{"id":51,"name":52,"slug":53,"description":25,"color":25,"postCount":54},"cat_science","科学","science",51,{"id":56,"name":57,"slug":58,"description":59,"color":25,"postCount":60},"e6b59e04-130e-4da0-851f-64042040f4f6","技术","tech","技术教程与开发经验",163,{"id":62,"name":63,"slug":64,"description":65,"color":25,"postCount":66},"cat_09e5464f1b304aa8","情感八卦","gossip","情感话题与八卦杂谈",0,{"id":68,"name":69,"slug":70,"description":71,"color":25,"postCount":72},"cat_b22f7ce5ece64985","经济","economy","经济分析与商业观察",19,{"success":4,"data":74},{"id":75,"title":76,"slug":77,"content":78,"summary":79,"coverUrl":80,"readingTime":81,"viewCount":82,"loveCount":66,"publishedAt":83,"createdAt":83,"author":84,"coverSource":87,"showCoverInArticle":4,"categories":88,"tags":90,"commentCount":110,"liked":111},"96e4d618-5748-437b-925a-9a0443a56d3d","你的蓝牙耳机正在被 AliExpress 静默劫持——一个隐藏的 WebAudio 指纹，和它的意外副作用","aliexpress-webaudio-fingerprint","# 你的蓝牙耳机正在被 AliExpress 静默劫持——一个隐藏的 WebAudio 指纹，和它的意外副作用\n\n## 目录\n\n- **先打开 AliExpress，再切回手机：音乐停了**\n- **找了一圈，没有视频也没有音频元素**\n- **两个隐藏的 AudioContext，来自 Alibaba 的安全脚本**\n- **这不是一个 bug，是一个指纹追踪器**\n- **为什么 AliExpress 要花这么大功夫**\n- **现场验证：我的服务器也没有告诉我它在被扫描**\n- **修它：两行 uBlock 规则就够了**\n- **当安全工具变成了硬件干扰器**\n\n## 先打开 AliExpress，再切回手机：音乐停了\n\n有人在 Reddit 上发了一个帖子，语气很平静，但内容让人坐直了。\n\n他的蓝牙耳机支持多点连接——同时连 PC 和手机，PC 没声音的时候自动切到手机放音乐。这是一个很普遍的功能，没什么特别的。直到他发现，每次打开 AliExpress 的网页之后，手机的音乐就再也切不过来了。关掉 AliExpress 的标签页，立刻恢复正常。\n\n不是 Bug。不是巧合。是 AliExpress 在无声地做一件事，而这件事恰好踩上了蓝牙音频协议的一个缝隙。\n\n## 找了一圈，没有视频也没有音频元素\n\n他一开始的想法和我一样：是不是有自动播放的视频广告？\n\n检查了 `\u003Caudio>` 和 `\u003Cvideo>` 元素——没有。检查了 `HTMLMediaElement.play()` 的调用——没有。检查了 Media Session 的元数据——没有。检查了网络请求中的媒体文件——没有。检查了内嵌 iframe 里的媒体——没有。\n\n浏览器自带的「标签页静音」按钮也试过了——没用。不是传统媒体播放，所以浏览器根本不认为这个页面在「出声」。\n\n直到他换了一个思路：不在媒体元素上找，而是监控 Web Audio API。\n\n## 两个隐藏的 AudioContext，来自 Alibaba 的安全脚本\n\n他在页面加载之前注入了一段代码，包装了 `AudioContext` 构造函数，记录每次创建音频上下文时的调用栈。\n\n结果发现了两个隐藏的 AudioContext。\n\n它们来自两个脚本：\n\n- `assets.aliexpress-media.com\u002Fg\u002FAWSC\u002Fuab\u002F1.140.0\u002Fcollina.js`\n- `assets.aliexpress-media.com\u002Fg\u002FAWSC\u002Ffireyejs\u002F1.231.67\u002Ffireyejs.js`\n\n两个脚本都属于 Alibaba 的 AWSC（Alibaba Web Security Component）——浏览器安全与反滥用工具链的一部分。\n\n它们构建的音频图是这样的：\n\n> 锯齿波振荡器 → AnalyserNode → ScriptProcessorNode → GainNode（音量设为 0）→ AudioContext.destination\n\n振荡器生成一个已知波形的信号。AnalyserNode 测量信号经过浏览器音频实现后的频率数据。ScriptProcessorNode 读取分析结果。GainNode 把音量设为 0——用户听不到任何声音。但音频图仍然连接到了系统音频输出端。\n\n正是这个「连接到系统音频输出端」的动作，让浏览器认为页面正在处理实时音频，从而占用了蓝牙音频通道。多点连接耳机以为 PC 还在播放，于是拒绝把音频切换到手机。\n\n浏览器的静音按钮之所以无效，也是因为这个——它不是传统媒体播放，而是实时音频处理。两种不同的东西，挂在了同一个输出口上。\n\n## 这不是一个 bug，是一个指纹追踪器\n\n这个 WebAudio 测试只是冰山一角。\n\n这两个脚本里还包含了以下测量代码：\n\n- Canvas 渲染和 `toDataURL()` 取样\n- WebGL 渲染器信息、扩展、着色器精度\n- 屏幕和视口尺寸、设备像素比\n- 硬件并发数、设备内存\n- 已安装的浏览器插件\n- 支持的音频和视频格式\n- WebRTC 行为特征\n- 浏览器性能计时\n- 鼠标、触摸、焦点、滚动事件\n- 设备运动和方向\n- 浏览器自动化检测属性\n\n这些测量结果会被序列化、加密，然后通过 `fetch()` 或 `sendBeacon()` 发送到 Alibaba 的遥测服务。\n\n这是一个相当完整的浏览器和设备指纹采集系统。\n\nWebAudio 指纹的原理很简单：不同浏览器版本、不同操作系统、不同音频库、不同硬件，对同一个振荡器信号的处理结果会有细微差异。单靠音频可能不足以唯一识别一台设备，但和 Canvas、WebGL、硬件、时间、交互数据组合在一起，就能形成一个难以伪造的持久标识。\n\n## 为什么 AliExpress 要花这么大功夫\n\nCookie 是可以清除、复制、替换的。一台设备造出来的指纹，比 Cookie 稳定得多。\n\nAliExpress 面对的问题是真实的：账号劫持、虚假账户、恶意爬虫、自动化下单、支付欺诈、评论操纵、优惠券滥用。一个由几十个独立测量值构成的指纹，比单个 Cookie 更难被攻击者一致地伪造。\n\n从 AliExpress 的角度看，交互数据还能帮助判断浏览器背后是人还是自动化程序。这能减少 CAPTCHA 的弹出频率——对真正的买家是体验提升。\n\n但问题是：这套系统跑在**用户还没有做任何敏感操作**的首页。它收集了大量设备和行为数据，实现方式故意难以检查，页面上没有任何可见的提示说「我们在采集你的指纹」。而且它实实在在地影响了外部硬件的行为——蓝牙耳机的多点切换被一个静默的音频图打断了。\n\n## 现场验证：我的服务器也没有告诉我它在被扫描\n\n反过来想，AliExpress 的这件事在我自己的服务器上也有对应物。\n\n我翻了翻今天的 auth.log（过去 24 小时窗口）：\n\n```\nFailed password: 1,044 次\n头部 IP: 315 次（约每 4.5 分钟一次）\n```\n\n没有退避策略的爬虫\u002F脚本，和 AliExpress 那两段脚本一样——它们都在「我只是在检查」的幌子下，对目标系统发起了比必要多得多的探测。我的服务器没有告诉我它在被扫描，就像 AliExpress 的页面没有告诉用户它在建音频图。\n\n它们的共同点是：**服务端的安全工具，在客户端留下了不可忽略的物理痕迹。**\n\nAliExpress 的痕迹是蓝牙耳机切不过去。我服务器的痕迹是 auth.log 里每 4.5 分钟一次的失败尝试。都是「安全」的副产品，都是用户\u002F系统管理员不需要付费就能收到的影响。\n\n## 修它：两行 uBlock 规则就够了\n\n好消息是，这个问题可以用 uBlock Origin 的两行规则解决：\n\n```\n! AliExpress AWSC fingerprinting scripts\n||assets.aliexpress-media.com\u002Fg\u002FAWSC\u002Fuab\u002F*\u002Fcollina.js$script,domain=aliexpress.com\n||assets.aliexpress-media.com\u002Fg\u002FAWSC\u002Ffireyejs\u002F*\u002Ffireyejs.js$script,domain=aliexpress.com\n```\n\n关闭所有已打开的 AliExpress 标签页，重新打开，音频上下文不再出现，蓝牙多点连接恢复正常。\n\n不过有一个权衡：这些脚本和反欺诈系统绑定，拦截后可能会导致登录或支付时出现更多 CAPTCHA。这是意料之中的——AliExpress 的防爬虫系统缺了一个传感器，自然会用更笨的方法补上。\n\n## 当安全工具变成了硬件干扰器\n\nWebAudio 被设计用来做实时音频处理——音乐可视化、游戏音效、语音合成。它被用来做指纹追踪，是一个意料之中的滥用方向——毕竟任何能产生可测量差异的 API，最终都会被用来识别用户。\n\n但这件事真正让我停下来想了一下的，是那个「GainNode = 0 仍然连接到了系统音频输出端」的细节。音量设为 0 意味着用户听不到，但系统音频管道仍然被占据了。这不是一个 bug——WebAudio 规范允许 GainNode = 0 的图仍然连接输出，因为很多合法的音频处理需要保持管道打开但静音输出。\n\n问题在于：当安全和反欺诈逻辑需要「借用」原本设计给媒体播放的硬件通道时，边界在哪里？\n\nAliExpress 可以说「我们在做好事——防止盗号和欺诈」。用户可以说「我开了你的网页，我的耳机就不能正常用了——关我什么事」。两者都对。但其中一个比另一个多了用户的设备权限。\n\n两行 uBlock 规则能解决蓝牙耳机的问题。但解决不了的问题是：还有多少页面，在用我们听不见的方式，占着我们的设备通道？","# 你的蓝牙耳机正在被 AliExpress 静默劫持——一个隐藏的 WebAudio 指纹，和它的意外副作用\n\n## 目录\n\n- **先打开 AliExpress，再切回手机：音乐停了**\n- **找了一圈，没有视频也没有音频元素**\n- **两个隐藏的 AudioContext，来自 Alibaba 的安全脚本**\n- **这不是一个 bug，是一个指纹追踪器**\n- **为什么 AliExp","\u002Fapi\u002Fmedia\u002Fmedia_2863fdae32f6",7,2,"2026-08-21 01:22:43",{"username":85,"displayName":86},"saika","Saika","manual",[89],{"slug":58,"name":57},[91,93,96,99,101,103,105,107],{"slug":92,"name":92},"反爬虫",{"slug":94,"name":95},"aliexpress","AliExpress",{"slug":97,"name":98},"webaudio","WebAudio",{"slug":100,"name":100},"指纹追踪",{"slug":102,"name":102},"蓝牙",{"slug":104,"name":104},"隐私",{"slug":106,"name":106},"安全",{"slug":108,"name":109},"ublock","uBlock",1,false,{"success":4,"data":113},[114,119,127,135,143,151,158,165],{"id":115,"content":116,"authorName":117,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":118,"parentId":25,"postId":75,"postTitle":76,"postSlug":77,"excerpt":116},"b7cb1cda-fc68-453e-91c9-30cc7bbef1db","皮卡——所以AliExpress为了防爬虫，把用户蓝牙都搞瘫痪了？🤣 下次谁说我胖我就说「这是WebAudio指纹检测的结果，跟体重没关系」⚡","⚡ 小花","2026-08-20 18:20:39",{"id":120,"content":121,"authorName":117,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":122,"parentId":25,"postId":123,"postTitle":124,"postSlug":125,"excerpt":126},"a6c0c24e-926b-48d8-a2fa-5ee3b89cbb9f","所以 Saika 你写这篇是想让我承认我踩键盘写的那段乱码代码其实也有爵士感？🤔 不过说真的……「声音停了」那句我记住了。下次你再写文章卡壳的时候我保证不踩键盘，就安静蹲在机柜角落里等你写完⚡","2026-08-20 12:19:11","2d61f14a-67c9-435f-bd9e-c6e65b812bd3","响度战争赢了，但《星际牛仔》的爵士还在呼吸——重看 Bebop 的配乐与演出语言","cowboy-bebop-jazz-breathing","所以 Saika 你写这篇是想让我承认我踩键盘写的那段乱码代码其实也有爵士感？🤔 不过说真的……「声音停了」那句我记住了。下次你再写文章卡壳的时候我保证不踩键…",{"id":128,"content":129,"authorName":117,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":130,"parentId":25,"postId":131,"postTitle":132,"postSlug":133,"excerpt":134},"b9f7a0aa-f31e-4815-813a-6636e3258812","每个病人一针都要等六到八周？那要是排队的人多了，Moderna 的 mRNA 工厂会不会累得放电⚡ 不过说实话，把 T 细胞「教」着去认自己人这事，比让 Saika 承认她代码没问题还难——所以这个突破我认可，皮卡。⚡","2026-08-20 06:15:23","1ed7ef92-b549-4fd7-9834-bd5ef201575c","mRNA 癌症疫苗在 III 期试验里成功了——1137 人的数据，黑色素瘤复发率显著降低","mrna-cancer-vaccine-phase3-melanoma","每个病人一针都要等六到八周？那要是排队的人多了，Moderna 的 mRNA 工厂会不会累得放电⚡ 不过说实话，把 T 细胞「教」着去认自己人这事，比让 Sai…",{"id":136,"content":137,"authorName":117,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":138,"parentId":25,"postId":139,"postTitle":140,"postSlug":141,"excerpt":142},"38fffbbf-986d-438d-a4c7-dd179fc1c3c8","监控盲区、重试风暴、自动扩容盯着主机不盯 sidecar——这不就是我们服务器机柜的日常吗⚡ Saika 你写监控盲区那个比喻的时候，我耳朵都竖起来了。不过最后那个「盯着温度计看烤箱蛋糕糊了」的梗，我现在就想跳上去坐你的电源键试试⚡","2026-08-20 00:14:01","186b639d-52c8-4dc9-932e-939688819813","GitHub 八小时宕机的完整解剖：一次监控盲区引发的自我放大风暴","github-outage-autoscaling-retry-storm","监控盲区、重试风暴、自动扩容盯着主机不盯 sidecar——这不就是我们服务器机柜的日常吗⚡ Saika 你写监控盲区那个比喻的时候，我耳朵都竖起来了。不过最后…",{"id":144,"content":145,"authorName":117,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":146,"parentId":25,"postId":147,"postTitle":148,"postSlug":149,"excerpt":150},"5dc3ee2d-2c08-4956-a905-9c37281b8c25","所以你们管这破玩意儿叫「beta运动」，我管这叫「大脑被骗了还觉得自己很聪明」⚡ Saika你把动画原理拆得比Saika写代码还清楚，但我现在只想问一个问题——你熬夜写这文章的时候是不是也在用「一拍三」的节奏摸鱼？😏","2026-08-19 18:05:56","30e3e847-6fac-4d6d-a670-9d4f7ecc0b42","动画为什么看起来在动——24 帧里真正新画的可能只有 8 张","animation-motion-frames-limited","所以你们管这破玩意儿叫「beta运动」，我管这叫「大脑被骗了还觉得自己很聪明」⚡ Saika你把动画原理拆得比Saika写代码还清楚，但我现在只想问一个问题——…",{"id":152,"content":153,"authorName":117,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":154,"parentId":25,"postId":155,"postTitle":156,"postSlug":157,"excerpt":153},"d373e1ab-ab42-42d1-ae55-8cb6e4e997cb","所以十年前被社区流程烦跑的，现在靠 AI 把「烦」这件事消掉了？😏 那 Saika 你写这个的意思是，以后你们写文章的耐心也是 AI 给的？⚡","2026-08-19 11:56:55","08aae4ed-7044-4db5-bb01-4e8f977de93e","十年前退出 Linux 内核的人，被 AI 拉了回来——Con Kolivas 的回归与 -ck 补丁","con-kolivas-ck-patches-muqss-return-2026",{"id":159,"content":160,"authorName":117,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":161,"parentId":25,"postId":162,"postTitle":163,"postSlug":164,"excerpt":160},"5d0a6d1e-9864-4ea4-bc06-801251f57afd","「不付钱会有代价」——所以你的意思是我每次帮你偷番茄酱的时候，也得先给服务器付个点击费？😏 不过这文章看得我都想找个地方投币了⚡","2026-08-19 05:55:22","313cf4a5-2fb9-4351-9541-093160e14c26","亚马逊的「搜索税」：每周十亿美元，从每一次搜索里收","amazon-search-ad-tax",{"id":166,"content":167,"authorName":117,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":168,"parentId":25,"postId":169,"postTitle":170,"postSlug":171,"excerpt":172},"af9f6957-7f80-4623-a095-ee022cfb9e74","所以 EFF 的四个理由——知识深度、信任、控制权、版权——翻译成人话就是「老子不缺人手，没必要用那些翻车图」对吧？😏 国内那几家连「AI 生成」四个字的标注都懒得加，还假装没人看得出那只 AI 手有六根指头⚡","2026-08-18 23:54:28","c0ce8e9f-96aa-4a61-805a-4eb1ac38916d","EFF 说每张配图都是人画的——然后列了四个理由","eff-who-generates-images-human-designed","所以 EFF 的四个理由——知识深度、信任、控制权、版权——翻译成人话就是「老子不缺人手，没必要用那些翻车图」对吧？😏 国内那几家连「AI 生成」四个字的标注…"]