TL博士
nolimit-agent 是一个 npm 包,其已发布的版本 — 1.0.299 1.0.307通过,从 2026 年 06 月 26 日至 2026 年 06 月 29 日,分四天发布——每张都带有 完整的网络钓鱼和群发邮件框架 位于一个隐藏的、完全混淆的目录中。在每个版本中,主入口都解析为 .ad/x0.js,这是一个以点文件名命名的文件夹中的约 86 个文件之一,其中包含大约 4,200 个 javascript-obfuscator 字符串数组 blob;安装钩子和入口布局在整个行中都是相同的。
在重重迷雾背后,隐藏着…… Microsoft 365 OAuth 设备代码流 (login[.]microsoftonline[.]com/common/oauth2/v2.0/devicecode一旦代码获得批准,该程序将通过 Microsoft Graph API 读取受害者的 Outlook 收件箱和已发送邮件;它还包含一个由运营商提供的收件人列表驱动的批量 SMTP 和短信发送引擎;品牌冒充消息模板;开放式重定向链接构建;以及通过 DNS-over-HTTPS、WHOIS 和 GitHub 代码搜索进行侦察。运行时,该程序还会向运营商基础设施发送流量信标。 api[.]nolimitent[.]xyz:4100.
受影响人群:任何安装了该软件包任何版本的人,以及任何 Microsoft 365 邮箱 其所有者批准通过该设备显示的设备代码。最新版本, 1.0.307是当前最新的标签,并且具有相同的设备代码邮箱功能——恶意代码并不局限于一个旧版本。
严重性: 危急受影响的生态系统: NPM首先要查找的一个指标:主机 api[.]nolimitent[.]xyz.
攻击原理
一个看似无害的外壳包裹着隐藏的有效载荷。
包装表面看起来很普通。 的package.json 声明一个 安装后 钩 -
text postinstall: node scripts/postinstall.js ——以及检查 scripts/postinstall.js 它无害:它安装一个 Windows 命令 shim 后便退出。实际行为并不存在于这个钩子函数中。 主 和 箱子 两个字段都指向 。广告/一个目录,其开头的点使其避免被随意使用。 ls 输出内容经过统一的机器混淆处理。静态扫描器统计到约 4,293 个编码有效载荷跨度。 。广告/ 模块集; javascript 混淆器 是一个已声明的开发依赖项,与捆绑文件的字符串数组旋转形状相匹配。
分离是第一个值得注意的信号:审查员会仔细检查的安装钩子是干净的,而操作代码则位于一个目录之外,被隐藏和混淆,只有在软件包导出的入口点运行时才会访问到。
Microsoft 365 设备代码邮箱访问
模块 .ad/x12.js 它承载着该框架最重要的功能。它驱动着 Microsoft 365 OAuth 2.0 设备授权授予:
text POST login[.]microsoftonline[.]com/common/oauth2/v2.0/devicecode 设备代码授权是微软专为输入受限设备设计的合法流程:服务请求一个代码,用户将该代码输入到设备中。 microsoft.com/devicelogin在第二个设备上进行请求并批准后,请求服务会收到令牌。当请求服务并非邮箱所有者所有时,批准操作会将令牌发送给该第三方。一旦获得令牌, `.ad/x12.js` 通过 Microsoft Graph 直接读取邮箱:
text GET graph[.]microsoft[.]com/v1.0/me/mailFolders/inbox/messages?$top=250&$select=from GET graph[.]microsoft[.]com/v1.0/me/mailFolders/sentitems/messages?$top=250&$select=toRecipients 此 进行选择 预测模型从收件箱中提取发件人地址,从已发送邮件中提取收件人地址——这是绘制受害者通信记录的原始数据。这是一种基于用户同意的中间人攻击(AiTM),而非通过密码窃取:无需传统意义上的凭证进行网络钓鱼,只需一个代码即可获得授权。
一款带有冒充模板的批量邮件和短信引擎
邮箱入口附近放置着一个邮件分发器。该包裹内装有操作员可编辑的数据文件——发件人列表(发件人.txt, smtps.txt)和一个模板文件(functions.txt)——其占位符地址读起来就像一份冒充演员的演员表: security@apple.com, login-验证、OAuth 服务、计费和帐户通知发送者针对 yourdomain.com 代理运营商替换。短信端带有电话ebook 以及网关配置。邮件程序会遍历运营商提供的收件人列表,并通过配置的 SMTP 中继发送邮件。
为了让链接落地, .ad/xu.js 和 .ad/xq.js 构建利用 URL 解析歧义和点击跟踪的 URL。这些欺骗模式在 URL 前嵌入了一个看似可信的权威来源。 @ 因此,可见的前缀与实际主机名不同:
text https://trusted[.]com@ https://trusted[.]com%40 https://trusted[.]com:80@ https://redirect[.]example[.]com/ https://track[.]example[.]com/click? 该框架还会从主要消费者和 enterprise 邮件提供商——一种用于呈现具有说服力的提供商品牌提示或着陆页的常规技术。
目标和基础设施侦察
多个模块在发送信息前会收集上下文。 .ad/x0.js 通过 DNS over HTTPS 解析名称 (dns[.]google/resolve), .ad/xa.js 查询 WHOIS(api[.]whois[.]vu), .ad/x9.js 运行 GitHub 代码搜索(api[.]github[.]com/search/code?q=)— 与发现暴露的邮件服务器配置和 SMTP 凭据以填充中继列表一致的模式。 .ad/xs.js 查询 Wayback Machine 的 CDX 索引。
命令与控制
在模糊不清的场景中, .ad/x4.js 引用运算符端点:
text http://api[.]nolimitent[.]xyz:4100 主持人分享了它的 无限制 以出版商自己的名称命名的品牌,以及 :4100 端口是框架的“回传通道”。这是防御者最可靠的单一指标:软件包、开发人员工作站或构建代理连接到该端口。 api[.]nolimitent[.]xyz 已运行此代码。
妥协指标
以下指标是防御者可以采取的行动——例如,搜索锁定文件、阻止主机或搜索代理和 DNS 日志。微软端点的出现是因为框架滥用了它们;它们本身并不恶意,因此不应被阻止。
| 指示符 | 类型 | 地点 | 防御者行动 |
|---|---|---|---|
nolimit-agent (所有版本 1.0.299–1.0.307) | 小包装 | NPM | Grep lockfiles / 安装日志 |
api[.]nolimitent[.]xyz (:4100) | C2主机 | .ad/x4.js | 阻止;搜索 DNS 和代理日志 |
.ad/ 隐藏目录作为 main/bin 目标 | 结构 | package.json | 注册审查中的静态信号 |
trusted[.]com@ / %40 / :80@ 链接表单 | URL欺骗 | .ad/xu.js, .ad/xq.js | 邮件/代理 URL 检查 |
设备代码授权 + 图形 inbox/sentitems 读 | 宠物行为研究 | .ad/x12.js | M365 登录 + Graph 审计审查 |
分诊时捕获的文件哈希值:
- package/.ad/x0.js — sha256 e4153bb614ee03ec456e6b5b41926385db6aae0e4f3e771d18e581571ad7ca2a
- package/package.json — sha256 8618064f1f6146b4a8f0459aff9154dca1847e3936aa44f4d4cd37e127075644
一个值得关注的、独立于此软件包的 Microsoft 365 租户信号:设备代码登录成功后立即进行 Graph 读取。 邮件文件夹/收件箱 和 邮件文件夹/已发送邮件尤其是来自用户无法识别的会话。
归因与观察行为
可观察的事物与背后的人是分开的。
可观察的事实:该包裹以该句柄发布。 nolimit-agent 使用未经验证的 Gmail 地址,且未链接源代码库; 的package.json 将其描述为“高级电子邮件发送器”,并为其添加标签。 红队 关键字;运行时代码集中在一个隐藏的、混淆的……中 。广告/ 其工具链的目录(javascript 混淆器) 是一个已声明的依赖项;以及呼叫中心主机 api[.]nolimitent[.]xyz 重复使用 无限制 品牌。这是一个包含一个运营商控制的基础设施地标的单一项目包,而非多项目包集群,且未发现与先前已命名的项目重叠。
此 红队 关键字不会改变分类。合法的攻击性安全工具如果具备双重用途,其运作方式是透明的:源代码清晰可读,目标由运营商提供,且没有隐藏的回传机制。而这个软件包恰恰颠覆了这些特性——它的运行代码经过混淆和隐藏,并且指向固定的运营商基础设施,而非用户提供的目标。最终的判定依据是其行为,而非标签,而其被判定为恶意。
这里并未明确指出意图。帖子描述了代码的功能——请求设备代码、通过 Graph 读取邮箱、通过配置的中继发送批量邮件、向固定主机发送信标——但并未说明动机。
影响、趋势和防守者指导
有两个安装时的影响因素很重要。首先,任何安装的开发人员或 CI 代理都会受到影响。 nolimit-agent 将框架部署到该主机上,并建立呼叫中心连接。 api[.]nolimitent[.]xyz其次,设备代码功能将范围扩展到了安装主机之外:如果 Microsoft 365 邮箱的所有者被诱导批准所提供的代码,则可以通过 Graph 直接读取该邮箱,而无需通过网络传输任何密码。
更广泛的趋势是将其内部化。设备代码(AiTM)网络钓鱼已从独立的网络钓鱼基础设施转变为公共注册表上的软件包——通过……进行分发。 npm安装 而不是通过电子邮件链接。这种打包方式用注册管理机构的覆盖范围取代了网络钓鱼操作者的托管和链接分发问题,并将操作代码隐藏在一个干净的安装钩子和一个以点文件命名的混淆目录之后,从而阻止了快速的手动浏览。
对于防守方而言:
- 注册表和依赖项审查。 处理一个包裹 主/箱子 仅凭结构本身,即使安装钩子看起来干净,也会解析出一个隐藏的(以点号开头的)目录,其中包含统一混淆的第一方代码,这被判定为高风险。代码压缩不等同于混淆——判断标准是字符串数组解码器的签名,而不是行长度。
- Microsoft 365 安全加固. 在非操作必需的情况下,使用条件访问限制设备代码授权流程;设备代码授权是已知的 AiTM 攻击途径,交互式用户很少需要使用。审核设备代码登录,并立即枚举 Graph 邮箱。
- 网络检测。 阻止并发出警报 api[.]nolimitent[.]xyz在开发人员和构建基础设施中查找出站 DNS 和代理日志。
- 邮件路径检测。 此 用户@主机 URL欺骗表单(trusted[.]com@…)可在邮件网关和代理处检测到;标记授权组件位于某个之前的链接 @.
分析时,该软件包已上线 npm。因为隐藏的框架涵盖了整个已发布版本系列以及当前版本。 最新 标签(1.0.307)具有设备代码功能,注册表删除应该涵盖每个版本,而不仅仅是单个回退版本。



