alta

CVE

CVE-2026-41242

CWE

CWE-94

Sistemas afectados

  • protobufjs <= 7.5.4
  • protobufjs 8.0.0
  • Aplicaciones Node.js que usan las APIs de reflexión de protobufjs
  • Aplicaciones que cargan archivos .proto o descriptores JSON influidos por el atacante
  • Consumidores transitivos a través de @grpc/proto-loader, los SDK de Firebase, los SDK de Google Cloud y herramientas dinámicas de gRPC

protobufjs, la implementación de JavaScript ampliamente usada de Protocol Buffers, divulgó CVE-2026-41242 el 16 de abril de 2026. La vulnerabilidad permite que los metadatos de esquema de protobuf controlados por el atacante lleguen a la generación de código en tiempo de ejecución de JavaScript sin suficiente validación.

El paquete afectado es común en los grafos de dependencias de Node.js, tanto en uso directo como transitivo a través de herramientas de gRPC, SDK de Firebase, SDK de Google Cloud, gateways conscientes del protocolo y herramientas de depuración para desarrolladores. La condición vulnerable es más estrecha que “cualquier instalación de protobufjs”: la aplicación debe cargar una definición de protobuf o descriptor JSON controlado o influido por el atacante a través de las APIs de reflexión, y luego alcanzar la ruta de código generado para ese tipo.

Versiones afectadas

El paquete npm afectado es protobufjs:

  • versiones de protobufjs <= 7.5.4
  • versión de protobufjs 8.0.0

Las versiones parcheadas son:

  • protobufjs 7.5.5
  • protobufjs 8.0.1

Los equipos deben revisar tanto las dependencias directas como las transitivas. Muchos servicios no importan protobufjs directamente, sino que lo reciben a través de paquetes como @grpc/proto-loader, clientes de Firebase, clientes de Google Cloud y herramientas dinámicas de inspección de gRPC.

Causa raíz

protobufjs puede compilar datos derivados del esquema en funciones de JavaScript por rendimiento. Antes de la corrección, los nombres de tipo y las referencias de tipo controlados por el esquema podían interpolarse en el código fuente generado y ejecutarse con el constructor Function.

Eso significa que un descriptor malicioso puede convertir un campo que los desarrolladores normalmente tratan como metadatos de esquema inertes en código. La carga útil se ejecuta en el proceso Node.js que cargó el descriptor, con acceso a las variables de entorno de ese proceso, credenciales de servicio, permisos del sistema de archivos y alcance de red.

Condiciones previas de explotación

Las aplicaciones están directamente expuestas cuando todo lo siguiente es cierto:

  • Un atacante puede controlar o influir en un archivo .proto o descriptor JSON.
  • La aplicación carga esa definición con las APIs de reflexión de protobufjs, como la carga de descriptores o Root.fromJSON.
  • La aplicación realiza una operación que provoca la generación de código para el tipo controlado por el atacante, como decodificar, codificar o instanciar.

Las aplicaciones que solo decodifican mensajes con esquemas confiables y controlados por versiones escritos por el equipo de la aplicación no están directamente expuestas a esta ruta de ataque. Los casos de mayor riesgo son la carga dinámica de esquemas y la reutilización de esquemas entre límites de confianza.

Dónde aparece esto en sistemas reales

El riesgo práctico es mayor de lo que la condición previa pueda sugerir. Los patrones de exposición comunes incluyen:

  • Sistemas de ingesta multiinquilino donde los clientes suben descriptores de protobuf.
  • Clientes, proxies y herramientas de depuración dinámicas de gRPC que obtienen descriptores de servicios remotos.
  • Registros de esquemas internos donde una cuenta comprometida puede publicar un descriptor consumido por otros equipos.
  • Integraciones con socios que cargan definiciones de protobuf provistas por proveedores en tiempo de ejecución.
  • Estaciones de trabajo de desarrolladores que decodifican tráfico capturado con archivos de esquema de terceros.

En esos patrones, los archivos .proto y los descriptores JSON son efectivamente entradas de código. Deberían revisarse, fijarse y aislarse como dependencias ejecutables.

Remediación

Actualiza protobufjs a una versión corregida:

npm install protobufjs@^7.5.5
# o, para la línea 8.x:
npm install protobufjs@^8.0.1

Luego verifica el árbol de dependencias resuelto:

npm ls protobufjs

Si una dependencia transitiva fija una versión afectada, actualiza el paquete padre o usa el mecanismo de anulación establecido del gestor de paquetes del repositorio hasta que las dependencias upstream se pongan al día.

Guía de endurecimiento

Parchea primero, luego reduce la superficie de ataque del esquema:

  • No cargues definiciones de protobuf ni descriptores JSON desde fuentes no confiables en producción.
  • Prefiere artefactos de protobuf estáticos precompilados donde no se requiera compilación de esquema en tiempo de ejecución.
  • Fija las dependencias de esquema externas a versiones inmutables y verifica los checksums.
  • Aísla los workers de procesamiento de esquemas si clientes, socios o servicios remotos pueden influir en los descriptores.
  • Trata .proto, OpenAPI y otras entradas de generación de código como artefactos revisados por seguridad, no como documentación inofensiva.

Detección y respuesta

Busca versiones directas y transitivas de protobufjs en los lockfiles y en los artefactos desplegados. En el código, busca rutas de carga dinámica como Root.fromJSON, carga de descriptores, obtención remota de esquemas o clientes de reflexión de gRPC.

Para los servicios expuestos, revisa los registros en busca de subidas de esquema u obtenciones de descriptores inesperadas antes del despliegue parcheado. Si una versión afectada procesó descriptores no confiables, rota los secretos disponibles para el proceso Node.js e inspecciona la actividad de red saliente del servicio durante la ventana de exposición.

De la investigación a la remediación

Comprueba si este patrón existe en tu código

Convierte esta investigación en un flujo de remediación. Analiza dependencias y manifiestos para detectar riesgos similares en la cadena de suministro y prioriza las correcciones con contexto de alcanzabilidad.

Referencias