Hotdry.

Article

protobuf.js RCE 漏洞深度分析:恶意 Schema 如何突破沙箱执行任意代码

Protocol Buffers JavaScript 实现存在反序列化代码执行漏洞,攻击者通过恶意 payload 利用 Function() 构造函数的 unsafe 代码生成突破沙箱限制。

2026-04-19security

2026 年 4 月,安全研究社区披露了 protobuf.js 库中的一个关键远程代码执行(RCE)漏洞。该库是 Google Protocol Buffers 的 JavaScript 实现,在 npm 每周下载量接近 5000 万次,广泛用于微服务通信、实时应用和云环境中的结构化数据存储。漏洞编号为 GHSA-xq3m-2v4x-88gg,目前尚未分配 CVE 编号,但已被确认为高危级别。

漏洞根因分析

protobuf.js 的核心功能是将 Protocol Buffers 的 .proto 模式定义编译为 JavaScript 代码。Endor Labs 的安全研究员 Cristian Staicu 发现,该库在动态代码生成过程中存在严重的安全缺陷。具体而言,库内部通过字符串拼接构建 JavaScript 函数,并使用 Function() 构造函数执行这些生成的代码。然而,问题在于库并未对模式定义中派生的标识符(如消息名称、字段名)进行充分的验证和过滤。

当攻击者能够向应用程序提供恶意的 protobuf 模式定义时,可以在模式中注入任意 JavaScript 代码片段。这些代码会被拼接进最终生成的函数中,并在应用程序解析使用该模式的 protobuf 消息时执行。由于 Function() 构造函数在 JavaScript 中拥有较高的权限,攻击代码可以访问宿主进程的环境变量、凭据信息、数据库连接,甚至实现横向移动,渗透到内部基础设施的其它节点。

值得注意的是,该漏洞的利用条件并不苛刻。只要应用程序从不可信来源加载或解析 protobuf 模式定义,攻击者即可触发漏洞。这意味着面向外部提供 protobuf 模式解析服务的 API、动态加载远程模式的教育或协作平台、以及任何接受用户上传 .proto 文件的应用,都可能成为潜在攻击目标。此外,即使是在开发者本地机器上,如果开发者加载并解码来自不可信来源的模式文件,同样可能受到危害。

影响范围与修复状态

该漏洞影响 protobuf.js 8.0.0 及以下版本,以及 7.5.4 及以下版本。漏洞于 2026 年 3 月 2 日由 Endor Labs 报告,库维护者在 3 月 11 日于 GitHub 发布安全补丁。npm 包的修复版本于 4 月 4 日发布 8.x 分支更新,4 月 15 日发布 7.x 分支更新。建议所有使用 protobuf.js 的项目立即升级至 8.0.1 或 7.5.5 及以上版本。

官方补丁的核心修复措施是对类型名称进行清理,剥离所有非字母数字字符,从而阻止攻击者通过特殊字符闭合生成的函数并注入任意代码。然而,安全研究人员指出,从长远来看,最佳实践是完全避免将攻击者可触及的标识符传递到 Function() 构造函数中进行动态代码生成。

防御建议

面对此类漏洞除了及时升级之外,还应采取多层防御策略。首先,系统管理员应当审计项目的传递依赖(transitive dependencies),确保没有通过依赖冲突或版本降级引入存在漏洞的旧版本 protobuf.js。其次,生产环境应严格限制模式加载操作,将所有模式文件视为不可信输入进行验证和沙箱化处理。第三,在可能的场景下,应优先使用预编译的静态模式,而非在运行时动态加载和解析模式定义。最后,建议在运行时启用进程隔离和最小权限原则,限制 protobuf 解析进程所能访问的系统资源范围。

截至目前,尚未观察到该漏洞在野外的主动利用,但鉴于其利用复杂度较低且公开的概念验证代码已发布,安全团队应尽快完成版本升级和防御部署。

资料来源:BleepingComputer、Endor Labs 安全公告

security