风险重重:npm 包自删除机制详解

风险重重:那些会自行删除的反监考软件包

TL博士

这些软件包会自动删除。 八月份的十五天里,一位 npm 管理员使用七个账户,以九个不同的名称发布了九个软件包,并亲自撤回了其中八个。每个软件包的保留时间从十三小时缩短到了十七分钟。这种技术并非他们独有:另外七个来自不同管理员、携带完全不同有效载荷的软件包,也被发布者自行撤回,平均撤回时间为 37.8 分钟。在大多数防御机制运行之前,这些软件包就已经被移除,安装也已经完成。

注册表中公开的所有内容都会轮换;有效载荷则不会。 所有九个产品都搭载了字节完全相同的设备。 bin/ 目录中,三个软件包名称和两个账户在相隔十五天的情况下,SHA-256 摘要值完全相同。内容标识是该运营商唯一没有破坏的追踪信号,而他们从未撤回的那个软件包正是所有信息得以被分析的原因。

安装人员并非受害者,而且无论如何他们都面临着严重的风险。 这个工具并非面向开发者:它通过隐藏的屏幕截图、屏幕文本提取和将答案返回到叠加层来绕过远程监考。 无论谁执政 npm install 是预期受益人,而不是目标对象。 他们还会运行一个未签名的二进制文件,该文件会解密浏览器 cookie 存储,而该账户会在一小时内自动删除。这样一来,他们既无法获得修复,也无法事后审核运行过的文件,更无法在不透露安装原因的情况下报告损害。

生态系统: npm,在 PyPI 上也观察到了同样的模式。 期: 2026年6月至8月。

测量

停留时间是指包裹出现到消失之间的时间间隔,根据注册中心的元数据计算得出。这些是实际测量值,而非估计值。

小包装已发布(UTC)左侧站立者
moidev2026-08-16 16:315h 58m
moidevx2026-08-17 03:2413h 23m
moidevz2026-08-26 03:3812h 56m
moideva2026-08-26 18:581h 33m
amicat2026-08-28 20:4817 m
bmcat2026-08-28 21:1747 m
eyevox2026-08-28 21:4421 m
moidevh2026-08-31 03:2247 m

按出版顺序阅读,出版窗口缩短了四十多倍——从最长的13小时23分钟缩短到最短的17分钟。前四期平均出版时长为八个半小时;后四期平均出版时长为三十三分钟。8月28日,在短短77分钟内,就有三期出版后又被撤回。

这种收缩并非渐进式的,而是集中在8月26日至28日之间,变化的原因在于运营商对包裹安全存放时间的估计。

此处的所有提现操作均由发布者发起。每个提现操作的注册表文档都显示维护者列表为空。 时间。未发表 记录——这是撤稿而非下架的标志。第九包, eyiouss从未被撤回;正因如此,这一切才能被调查。

存在第二种提款机制,不应与此机制混淆。只有当…… 有效载荷版本 如果包裹被取出且完好无损,31 个包裹的平均等待时间约为 73 小时。这些替换包裹按预定批次送达,留下一个空壳——一个 的package.json 声明一个 它不发送任何文件——其唯一功能是保存名称。这种机制是按计划进行的日常维护。而这种机制则是经过调整的曝光窗口。

删除后哪些内容幸存下来

这九个包裹属于同一运营商: 莫伊德夫, moidevx, moidevz, 莫伊德瓦, moidevh, 朋友, bmcat, 眼沃克斯eyiouss这些名称没有任何约定俗成的规则——任何追踪这些名称的人 莫伊德夫 stem 将会错过其中一半以上的内容——而且这些内容是从七个不同的账户发布的,几乎全部都是在一次性电子邮件域名上注册的。

它们共同之处在于,它们都包含一条毫无存在理由的清单条目:

“垃圾桶”: { ”": "bin/kalamasha-tool.js" } }

我们在移除前保留了五份副本。在这五份副本中,全部 箱/ 目录是字节相同的:

文件SHA-256
bin/kalamasha-tool.js0c293be90c10c8a7618d25f4c4811fa63612b7bc5199b86e10bb31eb36c716dd
bin/uia_extract.exee2fda5aa8397799669f29258f69e803cf05d322c1d93269eef6754ca024c3865
bin/chrome_cookies.ps121b61ec810331850d72423c40c5448e6cd310c4cfad6aed54f92cd7e7cac5f3a
bin/stealth_capture.ps1c9baf5897c03b941c54f736df5af9243ad28794a9e69746d41d4f4a34065589c
bin/uia_extract.pyc20b38c63efd9221930095c54b42cdd5adffa1972c44c4578226cbe1e4dbac3e
bin/uia_get_text.ps14a3f3ada0bdf13aa8e89edb8af817c7816296147dae5be25f169ff960d28a87c

还有两个信号也印证了这一点。其中三个软件包分别于8月17日、8月26日和8月31日的UTC时间03:24、03:38和03:22发布——这16分钟的时间跨度跨越15天,涉及三个不同的账户。而且,其中两个账户注册在同一个一次性邮箱域名下,这使得它们之间的关联性独立于代码本身。

账目

以下是发布有效载荷的 npm 发布者帐户,以及每个帐户上传的软件包及其保留时间:

发布商帐户小包装电子邮件域左侧站立者
letol39119moidev:1.0.0hutdot.com(一次性)5h 58m
so1d1a7i27moidevx:1.0.0ogzmail.com(一次性邮箱)13h 23m
lololololol435678eyiouss:3.0.21, 3.0.22, 4.0.1ogzmail.com(一次性邮箱)仍在出版
tagadob568moidevz:1.0.0ebflyai.com(一次性)12h 56m
tayihim489moideva:1.0.0prodbits.com(一次性)1h 33m
sahihai123amicat:1.0.0, bmcat:2.0.9, eyevox:1.0.0消费者网络邮件17米/47米/21米
heytoshanmoidevh:1.0.0消费者网络邮件47 m

so1d1a7i27哈哈哈哈哈哈435678 共享 ogzmail.com 注册域名——将仍然托管有效副本的帐户与发布该副本的帐户关联起来的链接 莫伊德夫 比原计划提前两周。 sahihai123 8 月 28 日,在短短 77 分钟内,发布并撤回了三个不同的软件包名称。 嘿托山 已注册、已发布 moidevh47 分钟后,他又撤回了该帖子;这仍然是该账号发布的唯一帖子。

这些账户均未通过邮箱验证,没有经过验证的源代码控制链接,也没有发布过任何无关项目。其中七个账户中有六个已不再托管任何内容。

其中一个包裹从未被提取。 eyiouss:4.0.1 该问题自8月16日发布以来,截至撰写本文时仍可解决。八个数据点无法恢复;整个战役完全根据剩余的数据点重建。即使是习惯性删除数据点的操作员,最终也会留下一个数据点。

该工具的功能

eyiouss:4.0.1 它在 npm 上将自己描述为“面向现代 Web 应用程序的高性能 DOM 实用程序和诊断桥接器”。它是一个屏幕截图和答案检索工具,旨在远程考试监考系统下运行,其源代码也明确说明了这一点。

启动器在运行 Electron 运行时之前,会将其复制到一个虚假的文件名下,并说明它要避免的是什么:

// 🛡️ 隐蔽二进制文件名称:绝不能与真正的 Testpad 名称冲突! const STEALTH_NAME = 'SearchApp.exe';  

同一个文件的头部称其为 反普罗克特幽灵监视者 并实现了一个重生循环,重生速度越快,重生间隔就越长。此外,该进程还会提高自身的优先级。 为了对抗监考CPU限速当考试应用程序获得焦点时,将其从前台移出,并终止 Safe Exam Browser 子进程。 taskkill /F /T.

捕获过程通过一个捆绑的 PowerShell 脚本运行,该脚本在执行策略被禁用且窗口被隐藏的情况下调用,同时通过 Windows UI 自动化并行采集屏幕文本。排队的图像和文本被提交到嵌入式浏览器中的语言模型会话,并将结果渲染在一个始终置顶的叠加层中。该连接被故意延迟,代码中给出了原因: 避免永久性 NETSTAT 暴露.

包裹也运送 chrome_cookies.ps1,标题 铬饼干提取器它通过 DPAPI 解密 Chrome 和 Edge 的 Cookie,并读取最多四个浏览器配置文件的 Cookie 数据库。cisely:我们没有在任何已发布的 JavaScript 文件中找到通过名称调用的脚本。目前存在且可访问的是调用部分,它会将存储的会话 cookie 注入到嵌入式浏览器中。

安装人员的立场

没有人会误装这个软件。它除了在受监控的考试中运行外没有任何功能,其输出结果只是在用户屏幕上叠加显示答案。这个具有欺骗性的软件包描述根本不是针对安装程序的——它实际上是针对注册表以及之后审核计算机的任何人的。安装程序很清楚自己要安装的是什么;描述的存在就是为了…… 记录 安装情况并未反映这一点。

受到伤害的是从未接触过 npm 的第三方:举办考试的机构、其他考生,以及所有依赖该证书的下游人员。

但因此安装程序并不安全,这一点值得详细说明,因为消失的软件包模型本身就会造成安全隐患。

他们运行的是一个未经授权的二进制文件。 uia_extract.exe 该文件由一个已不存在的帐户编译而成,没有源代码,也没有构建来源信息。同一个文件(通过哈希值)已被重新发布。 letol39119, so1d1a7i27, 哈哈哈哈哈哈435678, tagadob568, tayihim489, sahihai123嘿托山 十五天过去了。没有维护者可以咨询,没有代码库可以查阅,也没有历史记录可以查看——所有发布过该文件的用户都自行删除了。

他们赋予了它恶意软件所需的全部功能。 一个隐藏进程,以虚假名称运行,解密浏览器 cookie 存储,持续读取屏幕,终止安全软件,并在被终止后重新启动。目前,cookie 解密仅限于某一家供应商的域名,并服务于用户自身的会话。这种范围的改变只需一行代码,即使更改名称、账户或上传文件,也不会影响交付模式。

他们无法获得修复。 该软件包在一小时内被撤下。没有更新途径,没有提示,也无法得知他们安装的版本与朋友安装的版本不同。机器上的版本将一直保留在那里。

他们无法审计自己运行的内容。 他们的锁定文件现在引用了一个已无法解析的软件包。如果他们之后想要确定机器上安装了哪些软件包(例如在发生故障或纠纷之后),注册表中没有任何记录可以提供给他们。

他们无法举报伤害行为。 被此工具入侵的用户无法在不披露安装原因的情况下提交滥用报告。这并非偶然。注册表滥用报告是发现短生命周期软件包的主要渠道,而该运营商的用户群体本身就缺乏利用这一渠道的能力。唯一剩下的威胁是自动扫描——而十七分钟的检测窗口正是针对自动扫描而设计的。

受害者结构和停留时间是同一事实的两次呈现。这也解释了时间线上的异常现象:如果撤出是出于对投诉的恐惧,那么长期受欢迎的产品组合应该首先被撤出。但事实并非如此,因为投诉从未出现。

相同的模式,不同的运算符

监考人员并非孤身一人,最明显的并行运行是在不相关的有效载荷上运行。

8月24日至27日期间,出现了四个npm软件包,其名称借用自双因素身份验证工具—— 身份验证-一次性密码, 密钥-2fa, secretkey2fa双因素认证密钥 ——共包含十六个版本。每个版本都从其各自新注册的帐户发布(贝伊洛尔, jeanpaul686g, zzzalipay, dluuuuu所有邮件均未经验证,没有一封邮件提供已验证的源代码控制链接,也没有一封邮件发布其他内容。所有邮件均已被其发布者撤回。

该有效载荷与考试软件无关。它会读取浏览器凭据存储和 Discord 令牌,并针对 Minecraft 启动器发起 Xbox Live 身份验证攻击,以获取刷新令牌。以下是安装程序。 is 普通意义上的受害者——这使得比较变得有用,因为无论如何交付行为都是相同的。

这四个循环按发表顺序运行,耗时分别为 274.9 分钟、37.8 分钟、37.6 分钟和 35.7 分钟:第一次尝试耗时较长,之后逐渐收敛到一个有效值。另外三个包裹属于其他运营商,也表现出相同的撤回行为。

小包装操作者左侧站立者
octopus-action侦察信标2.5分钟
mt-ts-serverless-starter侦察信标9.6分钟
2fa-secretkey双因素认证封面名称35.7分钟
secretkey2fa双因素认证封面名称37.6分钟
secretkey-2fa双因素认证封面名称37.8分钟
auth-otp双因素认证封面名称274.9分钟
hex-encode-utilsother724.2分钟

七个软件包,平均耗时 37.8 分钟,均与考试软件无关。

三个不相关的有效载荷,三组不相关的帐户,一种共享的技术。

窗户为何关闭

2026 年期间,注册表的环境发生了一些变化,最明显的解释是扫描速度加快了。

直到最近,恶意软件包主要还是事后才被发现:用户注意到问题、下游报告或定期扫描。检测延迟以天为单位计算。但这已不再是唯一的检测方式。对新发布的软件包进行近实时分析—— Xygeni 的恶意软件早期预警 在业内日益增多的此类系统中,它大大缩短了出版和审查之间的差距。

面对这种情况,运营者有两个选择:要么让有效载荷更难识别,要么缩短其可供查看的时间。第二种方法成本更低,无需任何工程设计,而且注册表免费提供此机制:在 npm 的 72 小时撤回窗口期内,发布者可以单方面移除软件包,并且之后可以重复使用该名称。撤回操作对运营者没有任何成本。

时间安排吻合。上述两位操作员都收敛到一个数值并保持稳定,而不是漂移,这才是经过精心调校的参数,而非仅仅为了方便而调整。而且,他们收敛的参数——几十分钟——位于预设值附近。cis它需要安装在合适的位置,才能通过自动检测,同时还要保证包装能够安装到位,以便送达目标受众。

这仍然只是一个假设。时间数据无法区分对扫描的响应、对注册表强制执行的响应,也无法区分运营商之间相互学习导致的正常运营成熟过程。无需推断即可得出的结论范围更窄,但仍然有用: 曝光窗口现在非常短,任何依赖于发布后检查包装的控制措施都与操作员设定的时间赛跑。 不依赖于检查的控制措施(例如按年龄隔离、禁用安装脚本)不受该种族的影响,这也是优先选择这些措施的实际原因。

怎么办

按年龄隔离。 停留时间表中的所有组件都没能存活13个小时。如果采用“依赖项版本必须存在72小时后才能安装”的策略,那么所有这些组件都会被排除在外,而不会检测到任何问题。

默认情况下禁用安装脚本。 –忽略脚本 移除了语料库中窃取凭证的软件包所依赖的分发机制。但它对用户故意运行的工具无效,因为该工具是预先部署的。cis理解这种区别至关重要。

将失踪事件视为安全事件。 当已安装的依赖项停止解析时发出警报。证据仍然保存在您的锁定文件中,而不是注册表中。

追踪内容,而不是名称。 以上六个摘要与软件包名称、发布者帐户或版本字符串无关——该操作员已证明他们会更改每个字段。如果注册表端有一条规则,规定新注册帐户在一小时内撤回其唯一软件包属于可报告的模式,那么仅凭元数据,这条规则就会触发此处所有软件包的响应。

如果您正在考虑安装此类产品: 注册表难以捕获的那些特性,恰恰也是让你束手无策的特性。没有发布者需要承担责任,没有更新途径,也没有你运行过的任何记录。

指标

类型价值
文件bin/kalamasha-tool.js — 非-standard 垃圾箱入口点
SHA-2560c293be90c10c8a7618d25f4c4811fa63612b7bc5199b86e10bb31eb36c716dd
SHA-256e2fda5aa8397799669f29258f69e803cf05d322c1d93269eef6754ca024c3865
工艺应用SearchApp.exe 编写于合法的 Electron 运行时旁边
行为powershell -ExecutionPolicy Bypass -File - windowsHide: true
行为taskkill /F /T 针对安全考试浏览器进程
元数据维护者列表为空 time.unpublished 记录
账户letol39119、so1d1a7i27、lolololol435678、tagadob568、tayihim489、sahihai123、heytoshan
账号注册ogzmail.com、hutdot.com、ebflyai.com、prodbits.com——一次性邮箱域名

案例

sca-tools-软件-成分分析工具
确定软件风险的优先级、进行补救并加以保护
注册免费账号。
不需要信用卡。

保护您的软件开发和交付

使用 Xygeni 产品套件