JavaScript 生态系统中广泛使用的 Protocol Buffers 库 protobuf.js 被披露存在严重漏洞,CVSS 评分为 9.4。该漏洞允许攻击者通过恶意的结构定义(Schema)文件,在应用程序正常处理消息时触发任意代码执行。受影响版本为 8.0.0 及以下的 7.5.4 版本,已发布修复版本 8.0.1 和 7.5.5,官方建议立即升级。
protobuf.js 是 JavaScript 环境中处理 Protocol Buffers 数据格式的主流库。安全公司 Endor Labs 的研究人员估计,该库每周在 NPM 上的下载量接近 5200 万次,并以传递依赖(transitive dependency)的形式嵌入在 @grpc/proto-loader、Firebase SDK 和 Google Cloud 客户端库中。
protobuf.js 采用动态编译设计,每次加载 Schema 时,库会根据消息类型名称动态生成 JavaScript 源代码,并通过 Function() 构造函数执行,以提升运行性能。研究人员指出,该漏洞在于,修复前库未对类型名称进行任何过滤或验证,直接将其拼接到生成的代码字符串中。Function() 的行为本质上与 eval() 相同,若类型名称包含恶意内容,即可在字符串中插入并执行任意 JavaScript 指令。
该漏洞并非在加载 Schema 时触发,而是在应用程序首次需要该类型构造函数时才触发,实际中通常发生在首次解码、编码或创建该类型消息时。
要触发此漏洞,攻击者需能影响应用程序加载的 protobuf 定义或描述符。研究人员指出,虽然这听起来条件有限,但在实际场景中却涵盖多种常见情况。gRPC 定义了标准的服务器反射协议,允许客户端向服务器请求 Schema 定义,若服务器被入侵,攻击者可在响应中夹带恶意类型名称。此外,企业内部或第三方 Schema 注册中心的访问控制一旦出现漏洞,或开发人员在本地加载来源不明的 .proto 文件进行调试,都可能成为攻击入口。
上游修复仅增加了一行代码,在类型名称进入代码生成流程前,使用正则表达式移除所有非字母、数字和下划线的字符,切断恶意内容的注入路径。
开发人员可执行 npm ls protobufjs 命令确认项目中是否存在该包(包括传递依赖),并根据所用版本升级至 8.0.1 或 7.5.5。若生产环境无需在运行时动态编译 Schema,官方也建议使用 pbjs 和 pbts 工具预先生成静态代码,从根本上缩小攻击面。