CVE-2025-30065: RCE mediante deserialización de esquemas de Apache Parquet
Una vulnerabilidad de ejecución remota de código de máxima gravedad en la biblioteca Java de Apache Parquet permite a los atacantes ejecutar código arbitrario en cualquier sistema que lea un archivo Parquet malicioso. CVSS 10.0. Afecta prácticamente a todas las canalizaciones de macrodatos que utilizan el formato Parquet, incluidas Spark, Flink, Hive y los almacenes de datos en la nube.
| Atributo | Valor |
|---|---|
| ID de CVE | CVE-2025-30065 |
| Vector CVSS | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-502: Deserialización de datos no confiables |
| Publicada | 1 de abril de 2025 |
| Explotación | No se ha informado de explotación activa (existe una PoC pública) |
¿Qué es CVE-2025-30065?
Apache Parquet es un formato de almacenamiento en columnas ampliamente utilizado en ecosistemas de macrodatos. El módulo parquet-avro de las versiones hasta la 1.15.0 contiene una vulnerabilidad de deserialización en el código de análisis de esquemas. Cuando una aplicación Java lee un archivo Parquet que contiene un esquema Avro manipulado, el analizador deserializa referencias de clases controladas por el atacante, lo que permite ejecutar código arbitrario en el contexto de la aplicación lectora.
Esto resulta especialmente peligroso porque las canalizaciones de datos ingieren habitualmente archivos Parquet procedentes de fuentes externas: buckets de S3, socios de datos, cargas de usuarios e integraciones ETL. Cualquier canalización que procese archivos Parquet no confiables es vulnerable.
⚠ Vector de ataque a la cadena de suministro
CVE-2025-30065 crea un escenario convincente de ataque a la cadena de suministro: un atacante capaz de introducir archivos Parquet maliciosos en una canalización de datos —mediante un proveedor de datos comprometido, una configuración incorrecta de un bucket de S3 o un ataque de intermediario— obtiene la capacidad de ejecutar código en la infraestructura de procesamiento de datos, que podría incluir AWS EMR, Databricks, Azure HDInsight o clústeres locales de Hadoop que operen con credenciales privilegiadas de la nube.
Sistemas afectados
| Componente | Versiones afectadas | Versión corregida |
|---|---|---|
| parquet-avro (Java) | <= 1.15.0 | 1.15.1+ |
| Apache Spark (utiliza parquet-avro) | Cualquiera que utilice la biblioteca afectada | Actualizar la biblioteca |
| Apache Flink | Cualquiera que utilice la biblioteca afectada | Actualizar la biblioteca |
| Apache Hive | Cualquiera que utilice la biblioteca afectada | Actualizar la biblioteca |
| Amazon EMR | Versiones que utilicen parquet-avro <= 1.15.0 | Actualizar EMR o sustituir el JAR |
| Databricks Runtime | Versiones que utilicen la biblioteca afectada | Versiones DBR corregidas por Databricks |
Detalles técnicos
La vulnerabilidad se encuentra en la clase AvroSchemaConverter de parquet-avro. Al convertir un esquema Parquet en un esquema Avro, el código procesa metadatos del esquema que pueden contener nombres de clases arbitrarios. Estos nombres de clases se utilizan para realizar instanciaciones mediante reflexión sin validarlos contra una lista de permitidos.
# Representación conceptual de la ruta de código vulnerable
public Schema convert(MessageType parquetSchema) {
// Los metadatos del esquema pueden contener cadenas controladas por el atacante
String javaClass = parquetSchema.getField("java_class");
// Peligroso: instancia una clase arbitraria a partir de una cadena
Class> clazz = Class.forName(javaClass); // RCE aquí
return clazz.newInstance();
}
# Archivo Parquet manipulado con un esquema malicioso (conceptual)
{
"schema": {
"type": "record",
"name": "exploit",
"fields": [],
"java_class": "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl",
"avro.java.string": "[código de bytes malicioso codificado en base64]"
}
}
Explotación mediante una cadena de gadgets
El atacante crea un archivo Parquet cuyos metadatos del esquema Avro hacen referencia a una cadena de gadgets de Java: una secuencia de instanciaciones de clases que termina permitiendo la ejecución de código arbitrario. Commons Collections, Spring Framework y otras bibliotecas Java habituales proporcionan cadenas de gadgets adecuadas para este ataque.
Quién está expuesto
Cualquier aplicación Java que:
- Utilice la versión 1.15.0 o una anterior de
parquet-avro - Lea archivos Parquet de fuentes externas o potencialmente no confiables
- No haya implementado la validación del origen de los archivos
Los entornos de alto riesgo incluyen:
- Lagos de datos: buckets de S3/GCS/ADLS que ingieren datos de socios
- Plataformas de análisis: funciones de autoservicio para cargar datos
- Canalizaciones ETL: cualquier canalización que lea fuentes de datos externas
- Mercados de datos: plataformas que distribuyen conjuntos de datos Parquet
- Canalizaciones de entrenamiento de ML: ingesta de datos de entrenamiento procedentes de fuentes externas
Mitigación
- Actualizar parquet-java a la versión 1.15.1 o posterior: la corrección añade validación mediante una lista de permitidos para los nombres de clases incluidos en los metadatos del esquema
- Auditar las fuentes de archivos Parquet: inventariar todas las ubicaciones por las que los archivos Parquet entran en su entorno
- Implementar la validación del origen de los archivos: procesar únicamente archivos Parquet procedentes de fuentes verificadas criptográficamente
- Ejecutar las canalizaciones de datos con privilegios mínimos: limitar el radio de impacto garantizando que los roles de ejecución de las canalizaciones cuenten con políticas IAM de privilegio mínimo
- Aplicar restricciones al tráfico saliente de la red: los clústeres de procesamiento de datos deben tener restringido el acceso saliente a Internet para limitar el impacto posterior a la explotación
- Implementar protecciones contra la deserialización de Java: herramientas como SerialKiller pueden proporcionar defensa en profundidad frente a ataques de deserialización
Capacidad de detección de KENSAI
- Análisis de dependencias: el escáner SCA de KENSAI identifica versiones <= 1.15.0 de
parquet-avroen las dependencias de aplicaciones Java y en los archivos de compilación de Maven/Gradle - Análisis de imágenes de contenedores: detecta archivos JAR vulnerables en imágenes de Docker y despliegues de Kubernetes
- Evaluación de la exposición de las canalizaciones: identifica canalizaciones de datos con endpoints de ingesta de Parquet expuestos al exterior
- Inventario de activos en la nube: cartografía clústeres de EMR, espacios de trabajo de Databricks y otras infraestructuras de procesamiento de datos para evaluar sus versiones
¿Es vulnerable su canalización de datos a CVE-2025-30065?
KENSAI analiza sus aplicaciones Java, imágenes de contenedores e infraestructura de datos en la nube para detectar versiones vulnerables de Parquet. Proteja sus canalizaciones de datos antes de que los atacantes las exploten.
Analice su infraestructura de datos →