事件调查
AdFection:广告怎样把间谍软件送到设备上
广告被加载时,里面的代码就可能开始运行。Citizen Lab 与 Confiant 的新调查把广告投放、挑选设备和间谍软件感染连在一起,还发现部分广告直接收集网站自己的登录会话。防守要看广告拿到了什么权限,单靠提醒用户别点链接已经顾不到这条路径。

文章导航
收到陌生链接,不点。看见可疑附件,不开。这些提醒把最后一道选择留给了用户。广告却常常在页面打开时就自行加载,浏览器已经替用户取回图片、脚本和后续资源,没人等他决定要不要点击。
多伦多大学研究团队 Citizen Lab 在 2026 年 10 月 15 日发表调查,把这种投递方式称为 AdFection。研究者把半岛电视台 2024 至 2025 年的设备感染,与以色列广告公司 Discover-Tech 买下的广告联系起来,并以高置信度将其中的间谍程序识别为 Candiru 的产品。广告安全公司 Confiant 同期公布的技术研究则拆开了广告中的代码,展示它怎样挑选访问者、接收加密指令,还找到了不必突破操作系统就能发生的数据窃取。
这件事最值得改变的安全习惯,是把广告当作进入设备的第三方程序来管。它在哪里运行,能读到哪些数据,后面还会从谁那里取代码,都比广告画面看着正不正常更重要。两份研究已经足以解释这条投递路径,公开材料尚未给出其中完整的浏览器漏洞利用链。页面里运行 JavaScript 与取得整台设备的控制权,中间仍有一层需要单独证明。
1 广告还没被点击,代码已经到了
网站和应用把广告位交给平台出售,广告买方通过实时竞价决定要不要买下某次展示。用于出价的资料可以包括 IP、设备信息、移动广告标识符或浏览器标识符。买方看见的因此是某个设备正在访问某个广告位的机会,可以根据这些信息决定投放。广告最终交付的内容又可以同时包含图片和脚本,加载广告就能触发脚本,无需点击横幅。
Confiant 的广告观察窗口是 2026 年 4 月 1 日至 9 月 10 日。其中 4 月 12 日捕获的一份广告,把普通 MyIPInfo 横幅放进链接,旁边另带一个 getAd 脚本请求。链接负责点击后的跳转,脚本标签负责加载时就去取代码。请求参数已经带上广告标识符、页面、国家、系统与设备等信息。广告有没有人点,不影响这次脚本请求先发生。
Discover-Tech 将这类返回代码的服务称为 NOAS。按照 Citizen Lab 对广告标签、平台前端和返回内容的分析,服务端可以根据标识符和 IP 决定接下来给什么。大多数访问者拿到空响应,选中的设备才取得进一步代码。这让扫描广告变得困难,安全检查用的设备与目标设备请求同一个地址,服务端仍可给它们不同答案。Citizen Lab 还观察到部分投递只返回一次,随后访问为空,直到任务被重新设置。
Confiant 看到的后续代码创建了一个 1×1 的 iframe,加载 CloudFront 上的页面,再装入约 90 KB 的混淆 JavaScript。这个 SDK 会检查设备能力,并按远端指令读取设备、网络和行为信息。观察鼠标移动、页面可见性和键盘节奏,可以帮助操作者区分真实使用者与自动扫描环境。不过,代码列出一项能力,不代表它在每个广告框中都拿得到相应数据,浏览器的源与权限限制仍然有效。
指令通道也有专门安排。研究中的 SDK 通过 ECDH 让浏览器与控制端协商出共享密钥,用它解开下发的代码。回传结果另用新生成的 AES 密钥加密,再用控制端的 RSA 公钥包住这把密钥。这样,广告链路中的其他观察者即使看到传输,也难以读清收集结果。操作者还能让 SDK 通过 new Function(...) 运行送来的 JavaScript,设备画像则帮助它把后续代码只交给少数目标。此时执行仍处在广告 frame 的权限内,取得系统权限还需要进一步利用。
这种安排也解释了为什么“我打开看过,没有异常”很弱。一次普通访问可能恰好不符合目标条件,甚至只是晚于那次有效投递。Eskimi 在给 Citizen Lab 的 10 月 14 日回复中也说,这些广告标签会按设备、IP 和位置换内容,部分活动只面对很窄的 IP 名单,因此通过了第三方扫描。这个说法来自平台对自身处置的说明,与研究者观察到的选择性返回相吻合。
2 没有突破浏览器,也可能读走登录状态
另一条数据路径更直接。Confiant 发现部分广告用 getCookies() 读取 document.cookie,再把结果和设备信息送进广告请求。它们收集到了什么,取决于广告代码被放在谁的页面环境里。
浏览器用源隔离页面,源由协议、主机和端口共同确定。跨源 iframe 不能直接访问发布者的 parent.document。但 cookie 有自己的适用范围,不按端口隔离,共享 Domain 的子域也可能读到同一份 cookie。广告 frame 自己调用 document.cookie 时,仍须看当前文档能取得哪些值。广告若直接写进发布者页面,或进入与其同源的 friendly iframe,还可能取得页面本身的访问权限。脚本从外部地址下载,并不会自动给它建立隔离的执行环境。
还要区分 cookie 的属性。document.cookie 只暴露当前文档可见、且未设 HttpOnly 的 cookie。若登录会话也放在可读范围里,广告代码就能读走该值,后续账号风险取决于服务端怎样验证和使用这份会话。Secure 约束传输协议,SameSite 约束跨站发送条件,都不能替代 HttpOnly 对 JavaScript 读取的限制。即使会话 cookie 已隐藏,同源外部脚本仍可能接触页面上的其他数据。
Confiant 在超过 1,000 个发布者域名的独立广告会话中观察到第一方 cookie 被收集,里面除了统计和广告 ID,还包括部分已登录用户的会话 ID,有时包含 JWT 中的邮箱和全名。在这些页面赋予的权限下,广告已经能取得本不该交给它的数据,外传无需再等一个浏览器零日漏洞。
SafeFrame 的设计通过隔离广告与发布者代码,再由受控 API 传递发布者选择共享的信息。因此,修复要检查广告真正落入哪个 frame、是否与主页面同源、通过接口又暴露了什么。只确认页面上“有 iframe”,无法回答这些问题。对登录和账户页面,最容易核验的办法是减少第三方脚本本身,把敏感会话设为 HttpOnly,再用浏览器检查实际加载链和可见数据。
3 哪些设备真的感染了
Cookie 收集解释了一种已经发生的数据外流,间谍软件感染则需要设备或网络证据继续接上。半岛电视台向 Citizen Lab 提供了攻击期间的网络日志。研究者在已感染设备上归纳出连续时序,先接触 Discover-Tech 广告基础设施,再连接 Candiru 验证服务器,最后与 Candiru 控制服务器通信。验证服务器先初步检查设备,随后才进一步画像和感染。仅有第一段广告接触,离后两项证据仍有距离。
Citizen Lab 记录半岛电视台至少 45 台设备在 2024 至 2025 年被针对。半岛电视台还从其中一台受感染的 Windows 设备分离出 DLL,其硬编码的两个控制域名所指向的服务器,响应匹配研究者建立的 C1 指纹。样本通过 COM 劫持,让系统加载组件时有机会再次运行间谍 DLL。它与 2021 年 Candiru 样本使用不同的 XOR 密钥,但都用 48 字节的密钥循环隐藏字符串,并在结尾丢弃一个不参与解密的特殊空字符。联网自检地址列表的顺序也相同,都是先列 www.google.com,再列 www.microsoft.com。单项技术可以被不同程序使用,这组特征连同基础设施与日志时序,支持 Citizen Lab 以高置信度将该样本识别为 Candiru 间谍软件。
这里的“零点击”描述用户无需点击广告就能进入投递过程,半岛电视台的日志与设备样本则接上了感染结果。Confiant 明确说没有在野捕获完整利用链。它拆出的 SDK 可以精准下发后续 JavaScript,后续代码究竟利用了哪个浏览器漏洞、怎样取得系统中的执行能力,公开报告尚未展示这段完整过程。
更大的数字属于另一组数据。Citizen Lab 分析 Discover-Tech 的 MyDSP 在 2026 年 3 至 6 月的约 37.7 亿次竞价,记录显示其中约 4.42 亿次赢得广告展示。它再按广告名识别疑似带 NOAS 标签的投放,发现这些广告实际出现在 75,373 个应用和 120,768 个网站。这两项是去重后的展示载体数,既不是感染人数,也不说明这些应用或网站的运营者参与了间谍活动。
同样,广告在某政府机构所属网络出现,最多先定位到那个网络出口,不能直接认出哪个人被选中,更不能据此宣布整个机构被入侵。Confiant 提醒,用户可能位于访客网络或共享出口。对防守方,这些记录适合找需要继续调查的设备,接下来还要关联验证、后续通信和主机痕迹。把所有广告接触都算成失陷,会让真正异常的那一小段行为淹没在巨大数字里。
4 要限制的是广告能接触的东西
这次已经有供应链处置。按 Citizen Lab 10 月 15 日公布的记录,Google 在 10 月第一周移除 Discover-Tech 的注册并终止其广告交易访问,IAB Europe 在 10 月 8 日将它移出供应商名单。Beeswax 已移除该公司,Vungle 暂停访问并开展复核,Eskimi 则封禁账户和关联域名。Eskimi 另称其最后一次相关活动在 8 月 6 日停止。这些处置切断的是各平台已识别的买方入口。
广告可以带代码、买方可以按设备挑内容,这两项基础能力仍在。对新闻机构和其他高风险组织,广告与跟踪拦截值得同时放到受管设备和网络出口,移动应用内的广告也要算进去。拦截可能影响正常页面显示或应用功能,需要在受管设备上测试关键业务流程。只按域名或 IP 封禁的出口规则也无法区分共享域内的具体路径。限制广告 ID 和第三方跟踪能减少识别线索,及时更新浏览器与系统则能减少后续攻击可利用的已知漏洞。
检查已有连接时,应从两份研究提供的具体域名和时序入手,保留请求时间、设备、浏览器或应用、后续跳转和主机事件。不要为了复核而访问可疑广告或重新请求其脚本,也不要整段封禁 CloudFront 等共享平台。普通广告接触先用于缩小调查对象。出现验证服务器、控制通信或主机异常后,应保存相关设备的证据并限制其访问,撤销可能暴露的会话,再核查设备当时可访问的资料。
站点运营者还有一项更近的工作,看看自己是否把广告脚本放进了登录页面的同源环境。隔离广告、收紧受控共享接口、保护会话 cookie,都能处理本文第二条无需系统漏洞的数据路径。改完以后用受控、可信的测试素材检验正常投放与登录流程,不能只看配置里勾选了某个隔离选项。安全目标应落在浏览器实际拒绝了哪次跨源读取,以及敏感值有没有离开原本该待的位置。
用户能决定不点击,却很难审查网页替他接回来的每段脚本。站点需要限制广告脚本接触账号数据,受管设备和网络出口需要限制后续投递。这些保护要在广告自动加载时生效,等用户看见可疑横幅再提醒,前面的请求可能已经发出。