TL博士
这些软件包会自动删除。 八月份的十五天里,一位 npm 管理员使用七个账户,以九个不同的名称发布了九个软件包,并亲自撤回了其中八个。每个软件包的保留时间从十三小时缩短到了十七分钟。这种技术并非他们独有:另外七个来自不同管理员、携带完全不同有效载荷的软件包,也被发布者自行撤回,平均撤回时间为 37.8 分钟。在大多数防御机制运行之前,这些软件包就已经被移除,安装也已经完成。
注册表中公开的所有内容都会轮换;有效载荷则不会。 所有九个产品都搭载了字节完全相同的设备。 bin/ 目录中,三个软件包名称和两个账户在相隔十五天的情况下,SHA-256 摘要值完全相同。内容标识是该运营商唯一没有破坏的追踪信号,而他们从未撤回的那个软件包正是所有信息得以被分析的原因。
安装人员并非受害者,而且无论如何他们都面临着严重的风险。 这个工具并非面向开发者:它通过隐藏的屏幕截图、屏幕文本提取和将答案返回到叠加层来绕过远程监考。 无论谁执政 npm install 是预期受益人,而不是目标对象。 他们还会运行一个未签名的二进制文件,该文件会解密浏览器 cookie 存储,而该账户会在一小时内自动删除。这样一来,他们既无法获得修复,也无法事后审核运行过的文件,更无法在不透露安装原因的情况下报告损害。
生态系统: npm,在 PyPI 上也观察到了同样的模式。 期: 2026年6月至8月。
测量
停留时间是指包裹出现到消失之间的时间间隔,根据注册中心的元数据计算得出。这些是实际测量值,而非估计值。
| 小包装 | 已发布(UTC) | 左侧站立者 |
|---|---|---|
moidev | 2026-08-16 16:31 | 5h 58m |
moidevx | 2026-08-17 03:24 | 13h 23m |
moidevz | 2026-08-26 03:38 | 12h 56m |
moideva | 2026-08-26 18:58 | 1h 33m |
amicat | 2026-08-28 20:48 | 17 m |
bmcat | 2026-08-28 21:17 | 47 m |
eyevox | 2026-08-28 21:44 | 21 m |
moidevh | 2026-08-31 03:22 | 47 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.js | 0c293be90c10c8a7618d25f4c4811fa63612b7bc5199b86e10bb31eb36c716dd |
bin/uia_extract.exe | e2fda5aa8397799669f29258f69e803cf05d322c1d93269eef6754ca024c3865 |
bin/chrome_cookies.ps1 | 21b61ec810331850d72423c40c5448e6cd310c4cfad6aed54f92cd7e7cac5f3a |
bin/stealth_capture.ps1 | c9baf5897c03b941c54f736df5af9243ad28794a9e69746d41d4f4a34065589c |
bin/uia_extract.py | c20b38c63efd9221930095c54b42cdd5adffa1972c44c4578226cbe1e4dbac3e |
bin/uia_get_text.ps1 | 4a3f3ada0bdf13aa8e89edb8af817c7816296147dae5be25f169ff960d28a87c |
还有两个信号也印证了这一点。其中三个软件包分别于8月17日、8月26日和8月31日的UTC时间03:24、03:38和03:22发布——这16分钟的时间跨度跨越15天,涉及三个不同的账户。而且,其中两个账户注册在同一个一次性邮箱域名下,这使得它们之间的关联性独立于代码本身。
账目
以下是发布有效载荷的 npm 发布者帐户,以及每个帐户上传的软件包及其保留时间:
| 发布商帐户 | 小包装 | 电子邮件域 | 左侧站立者 |
|---|---|---|---|
letol39119 | moidev:1.0.0 | hutdot.com(一次性) | 5h 58m |
so1d1a7i27 | moidevx:1.0.0 | ogzmail.com(一次性邮箱) | 13h 23m |
lololololol435678 | eyiouss:3.0.21, 3.0.22, 4.0.1 | ogzmail.com(一次性邮箱) | 仍在出版 |
tagadob568 | moidevz:1.0.0 | ebflyai.com(一次性) | 12h 56m |
tayihim489 | moideva:1.0.0 | prodbits.com(一次性) | 1h 33m |
sahihai123 | amicat:1.0.0, bmcat:2.0.9, eyevox:1.0.0 | 消费者网络邮件 | 17米/47米/21米 |
heytoshan | moidevh: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-utils | other | 724.2分钟 |
七个软件包,平均耗时 37.8 分钟,均与考试软件无关。
三个不相关的有效载荷,三组不相关的帐户,一种共享的技术。
窗户为何关闭
2026 年期间,注册表的环境发生了一些变化,最明显的解释是扫描速度加快了。
直到最近,恶意软件包主要还是事后才被发现:用户注意到问题、下游报告或定期扫描。检测延迟以天为单位计算。但这已不再是唯一的检测方式。对新发布的软件包进行近实时分析—— Xygeni 的恶意软件早期预警 在业内日益增多的此类系统中,它大大缩短了出版和审查之间的差距。
面对这种情况,运营者有两个选择:要么让有效载荷更难识别,要么缩短其可供查看的时间。第二种方法成本更低,无需任何工程设计,而且注册表免费提供此机制:在 npm 的 72 小时撤回窗口期内,发布者可以单方面移除软件包,并且之后可以重复使用该名称。撤回操作对运营者没有任何成本。
时间安排吻合。上述两位操作员都收敛到一个数值并保持稳定,而不是漂移,这才是经过精心调校的参数,而非仅仅为了方便而调整。而且,他们收敛的参数——几十分钟——位于预设值附近。cis它需要安装在合适的位置,才能通过自动检测,同时还要保证包装能够安装到位,以便送达目标受众。
这仍然只是一个假设。时间数据无法区分对扫描的响应、对注册表强制执行的响应,也无法区分运营商之间相互学习导致的正常运营成熟过程。无需推断即可得出的结论范围更窄,但仍然有用: 曝光窗口现在非常短,任何依赖于发布后检查包装的控制措施都与操作员设定的时间赛跑。 不依赖于检查的控制措施(例如按年龄隔离、禁用安装脚本)不受该种族的影响,这也是优先选择这些措施的实际原因。
怎么办
按年龄隔离。 停留时间表中的所有组件都没能存活13个小时。如果采用“依赖项版本必须存在72小时后才能安装”的策略,那么所有这些组件都会被排除在外,而不会检测到任何问题。
默认情况下禁用安装脚本。 –忽略脚本 移除了语料库中窃取凭证的软件包所依赖的分发机制。但它对用户故意运行的工具无效,因为该工具是预先部署的。cis理解这种区别至关重要。
将失踪事件视为安全事件。 当已安装的依赖项停止解析时发出警报。证据仍然保存在您的锁定文件中,而不是注册表中。
追踪内容,而不是名称。 以上六个摘要与软件包名称、发布者帐户或版本字符串无关——该操作员已证明他们会更改每个字段。如果注册表端有一条规则,规定新注册帐户在一小时内撤回其唯一软件包属于可报告的模式,那么仅凭元数据,这条规则就会触发此处所有软件包的响应。
如果您正在考虑安装此类产品: 注册表难以捕获的那些特性,恰恰也是让你束手无策的特性。没有发布者需要承担责任,没有更新途径,也没有你运行过的任何记录。
指标
| 类型 | 价值 |
|---|---|
| 文件 | bin/kalamasha-tool.js — 非-standard 垃圾箱入口点 |
| SHA-256 | 0c293be90c10c8a7618d25f4c4811fa63612b7bc5199b86e10bb31eb36c716dd |
| SHA-256 | e2fda5aa8397799669f29258f69e803cf05d322c1d93269eef6754ca024c3865 |
| 工艺应用 | 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——一次性邮箱域名 |
案例
- npm 取消发布策略 — 出版商可以在 72 小时内无需干预即可删除软件包。






