Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-42089 — 本地包安装助手过于信任调用者提供的包名。在yeoman-environment中,缺失的生成器可以在没有用户确认的情况下被安装,将攻击者控制的项目元数据转变为包安装和代码执行路径。 | Kitploit
工具/GitHubGitHub/0xmrma/cve-2026-42089
漏洞分析代码分析漏洞利用供应链安全论文与研究学习与教育
GitHub0xmrma/cve-2026-42089

CVE-2026-42089

本地包安装助手过于信任调用者提供的包名。在yeoman-environment中,缺失的生成器可以在没有用户确认的情况下被安装,将攻击者控制的项目元数据转变为包安装和代码执行路径。

查看仓库
22个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2026-42089

本地包安装助手过度信任调用者提供的包名。在 yeoman-environment 中,缺失的生成器可能在未经用户确认的情况下被安装,将攻击者控制的项目元数据转变为包安装和代码执行路径。

介绍

我在审查 generator-jhipster 时,基于一个简单的安全问题发现了此漏洞:

攻击者控制的项目元数据能否让开发者工具在用户未明确请求的情况下获取并执行第三方代码?

在这种情况下,答案是肯定的。

最初看起来像 JHipster 问题的问题,结果在 yeoman-environment 中有着更深层的上游根本原因。

漏洞行为出现在 Yeoman 的本地生成器安装流程中,其中调用者提供的缺失包会在未经用户确认的情况下自动安装。在下游消费者将攻击者控制的包名传入该路径的情况下,这就足以创建一个真实的包安装和代码执行链。

该问题被分配为 CVE-2026-42089。

yeoman-environment: yeoman-environment on GitHub
包: yeoman-environment (npm)
CVE: CVE-2026-42089

此漏洞影响了 yeoman-environment,即 Yeoman 生成器加载和引导流程背后的运行时层。官方项目将其描述为处理生成器生命周期和发现的组件,截至 2026 年 6 月 26 日,npm 包页面显示每周下载量为 1,466,426,使其成为 JavaScript 工具生态系统中广泛部署的包。

photo0

攻击链

攻击者控制的项目配置 -> 调用者提供的生成器包名 -> yeoman-environment 静默安装缺失包 -> 下游工具加载已安装的生成器代码 -> 在 CLI 引导期间实现包安装和代码执行


yeoman-environment 的作用

yeoman-environment 是基于 Yeoman 的工具背后的运行时和生成器加载层。

除其他功能外,它还处理:

  • 生成器查找
  • 本地仓库管理
  • 缺失生成器的包安装
  • 生成器的注册和加载

这意味着它直接位于信任边界上。

相关的问题不在于 Yeoman 是否“只是一个本地工具”。

相关的问题在于:不可信输入能否影响包安装和代码加载行为?

在这种情况下,答案是肯定的。


为什么这个攻击面值得关注

我关注的不是内存损坏或仅崩溃的 bug。

更重要的目标是扩展和包解析攻击面。

任何满足以下条件的系统:

  • 从另一层接受包名,
  • 自动安装它们,
  • 然后使其可用于加载

都值得密切审查。

当下游消费者可以从项目本地数据中派生出这些包名时,这一点尤其重要。

这正是普通配置可能悄然转变为安全边界的地方。

这就是值得关注的正确方向。


我关注的边界

我首先通过 generator-jhipster 重现了该行为。

重要的路径是:

  • 项目本地的 .yo-rc.json 声明了一个蓝图包
  • JHipster 在 CLI 引导期间读取该蓝图条目
  • 缺失的蓝图包被传入 Yeoman 的安装路径
  • Yeoman 静默安装它们
  • 下游逻辑随后导入蓝图 CLI 模块

这意味着即使是一个无害的命令,例如:

root@kitploit:~
jhipster --help

也可能在请求的命令完成之前就触及包安装。

这是一个真实的信任边界失效。

下游触发器帮助暴露了它,但不安全的默认行为在于 Yeoman。


根本原因

这个 bug 很简单。

在 yeoman-environment 中,易受影响的方法是:

root@kitploit:~
async installLocalGenerators(packages) {
    const entries = Object.entries(packages);
    const specs = entries.map(([packageName, version]) => `${packageName}${version ? `@${version}` : ''}`);
    const installResult = await this.repository.install(specs);
    const failToInstall = installResult.find(result => !result.path);
    if (failToInstall) {
        throw new Error(`Fail to install ${failToInstall.pkgid}`);
    }
    await this.lookup({ packagePaths: installResult.map(result => result.path) });
    return true;
}

该方法直接将调用者提供的包名通过以下方式安装:

root@kitploit:~
this.repository.install(specs)

而无需事先提示用户。

这就是核心漏洞。

为什么可利用

因为包名不必来自受信任的来源。

如果下游消费者从攻击者控制的项目元数据中派生它们,那么利用链就很直接:

  • 攻击者间接控制包名
  • 下游工具将它们传递给 Yeoman
  • Yeoman 静默安装它们
  • 下游代码继续,新安装的包可供加载

这不仅仅是“包安装发生了”。

这是不可信输入在无明确同意边界的情况下进入包安装接收器。


为什么这是一个安全问题,而不仅仅是工具行为

重要的区别在于从不可信输入静默安装。

以下两者之间存在真正的区别:

  • 用户明确决定安装一个包,和
  • 框架因为项目本地数据导致调用者请求而静默安装一个包

当包在之后立即变得可加载时,这种区别甚至更加重要。

问题不在于存在第三方生成器。

问题在于:Yeoman 默认将调用者提供的包名视为可安装,而无需用户确认。

这使得不安全的下游信任假设变得实质性更糟。

这正是修复添加确认关卡的原因。


PoC

我使用了两层证明,因为它们同时展示了根本原因和实际下游影响。

PoC 1:标准下游触发器

第一个证明使用了未修改的 generator-jhipster。

我创建了一个项目,其根目录 .yo-rc.json 引用了一个尚未安装的蓝图包,然后运行:

root@kitploit:~
jhipster --help

这导致 JHipster 在帮助完成之前就将缺失的蓝图传入 Yeoman 的本地生成器安装流程。

重要的结果是:

  • 一个看似无害的命令到达了包解析和安装行为
  • 项目本地元数据足以触发安装路径

这清晰地建立了真正的触发条件。

PoC 2:受控的包执行路径

第二个证明使用了一个受控的本地注册表和一个旨在安全展示导入时副作用的包。

这很重要,因为我想展示更强的故事:

  • 项目本地元数据影响包选择
  • Yeoman 静默安装该包
  • 下游逻辑加载已安装的蓝图 CLI 模块
  • 在引导期间代码执行变得可达

这是最强的证据链,因为它将问题从:

“意外的安装尝试”

推进到:

“安装加上下游代码加载路径实际上是可到达的”

这是信任边界失效变得难以忽视的节点。


为什么选择这样的 PoC

第一个 PoC 证明了静默安装行为。

第二个 PoC 证明了为什么这种行为重要。

这种分离很重要。

一个停留在:

“可以安装一个包”

的报告,比展示以下内容的报告弱:

  • 攻击者控制的输入到达安装路径
  • 安装在没有确认的情况下发生
  • 下游逻辑使代码执行可达

这才是完整的故事。


受影响范围

在咨询处理期间和本地审查中,该行为被追溯到 installLocalGenerators() 的引入点:

root@kitploit:~
yeoman-environment 2.9.0

因此受影响范围为:

root@kitploit:~
>= 2.9.0 且 < 6.0.1

修复版本为:

root@kitploit:~
6.0.1

修复分析

修复正确且最小化。

在 6.0.1 中,installLocalGenerators() 被修改为在安装前添加确认步骤,除非明确请求强制安装。

修复后的形状如下:

root@kitploit:~
async installLocalGenerators(packages, forceInstall = false) {

然后:

root@kitploit:~
const { aproveInstall } = await this.adapter.prompt({
    message: `以下包需要在本地仓库中安装: ${specs.join(', ')}。是否继续?`,
    type: 'confirm',
    name: 'aproveInstall',
    default: false,
});

如果用户拒绝,安装将被中止。

这是正确的修复,因为它恢复了缺失的信任边界:

  • 调用者提供的包名不再默认静默安装
  • 需要明确的用户批准
  • 下游工具不能再依赖意外的隐式信任

该修复提交于:

root@kitploit:~
78d2af7

通过:

root@kitploit:~
PR #753

这正是你在此类安全漏洞中想要的修复类型:

  • 小
  • 直接
  • 易于理解
  • 与易受影响的接收器本身相关

严重性和分类

该问题被合理对待为严重,因为其影响不仅仅是表面的或令人惊讶的行为。

易受影响的行为可能导致:

  • 攻击者选择的包安装
  • 从无害的命令路径访问包基础设施的网络连接
  • 下游代码加载可达性
  • 受影响消费者的开发者环境受损

与该问题关联的 CVSS 向量为:

root@kitploit:~
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H

这对于下游利用故事是有意义的:

  • 本地执行上下文
  • 低复杂度
  • 不需要先前的权限
  • 需要用户交互
  • 一旦包执行路径到达,就会产生高机密性、完整性和可用性影响

披露

此问题最初是作为针对 generator-jhipster 的私有报告提交的,因为那是我最初验证的真实世界触发路径。

在分类期间,JHipster 维护者指出自动安装行为本身在 yeoman-environment 中,并引用了上游修复。

这导致了正确的转向:

  • 将根本原因缩小到 Yeoman
  • 将 JHipster 视为受影响的下游消费者
  • 私下向上游报告问题

Yeoman 维护者审查了问题,确认了受影响范围,并通过私有公告跟踪了它。

该报告后来被分配为:

CVE-2026-42089

该公告还记录了通过 generator-jhipster 的真实下游触发路径。

这是一个很好的例子,说明协调披露有时需要多一步:

  • 首先识别实际的触发器
  • 然后识别真正的所有权边界

在这里,下游复现是有用的,但上游包才是 CVE 的正确位置。


这个漏洞真正教给你的

关键教训很简单:

包安装是一个安全边界,即使在本地开发者工具中也是如此

很多人本能地低估此类问题,因为它们发生在 CLI 工具中。

这是一个错误。

真正的问题不在于工具是否是本地的。

真正的问题是:

不可信输入能否使工具在没有明确用户决策的情况下获取并信任代码?

在这种情况下,答案是肯定的。

这才是真正的要点。

此问题还强化了良好的漏洞研究中的一些重要内容:

  • 你首先复现的产品不一定总是真正的根本原因所有者
  • 下游 PoC 通常使风险变得明显
  • 上游信任边界错误才是实际修复所属的地方

这正是这个 CVE 的样子。


关键点

  • 包安装助手是安全边界
  • 调用者提供的包名不应默认静默安装
  • 本地项目元数据在影响扩展加载时可能变得危险
  • generator-jhipster 中的下游复现清晰地暴露了问题
  • 根本原因仍然属于 yeoman-environment
  • 添加明确的确认关卡是正确的修复

结语

这个漏洞不是关于花哨的有效载荷。

而是关于提出正确的信任边界问题。

一个下游工具让项目本地数据影响包选择。 Yeoman 在未经确认的情况下安装了缺失的包。 剩余的代码加载链完成了其余工作。

这就是为什么它变成了 CVE-2026-42089。

修复于 yeoman-environment 6.0.1。

下载工具