Introducción
En clusters Kubernetes, el kubelet expone un endpoint HTTPS (puerto 10250) que brinda acceso a datos críticos: métricas de nodos, logs de contenedores, estados de pods e incluso la capacidad de ejecutar comandos dentro de contenedores vivos. Hasta la versión v1.35, la autorización de este API se basaba en un modelo grueso: casi cualquier solicitud requería el permiso nodes/proxy, que otorga control total sobre el nodo. Esto violaba el principio de privilegio mínimo y ampliaba el radio de explosión de un incidente de seguridad.
A partir de Kubernetes v1.36, la autorización fina del kubelet (KubeletFineGrainedAuthz) pasa a General Availability (GA), reemplazando el permiso nodes/proxy por subrecursos específicos para endpoints comunes como /pods, /metrics y /healthz. El feature gate se habilita por defecto y ya no puede desactivarse, lo que obliga a los administradores a migrar sus permisos existentes a políticas más estrictas.
Qué ocurrió
El problema detrás de esta mejora se remonta a una vulnerabilidad crítica descubierta a principios de 2026: investigadores demostraron que otorgar nodes/proxy GET —el permiso mínimo para monitoreo— permitía ejecución remota de código no registrado mediante WebSocket, incluso sin permisos CREATE explícitos. El vector de ataque explotaba el mapeo incorrecto entre el protocolo WebSocket (RFC 6455) y los verbos RBAC en el kubelet:
- WebSocket inicia con un
GETal endpoint/exec. - El kubelet autoriza el
GETcomogeten RBAC, sin verificar que el cliente tengacreatepara la operación subsiguiente. - Un atacante con solo
nodes/proxy GETpuede ejecutar comandos arbitrarios en cualquier pod del nodo.
Esta falla está documentada en kubernetes/kubernetes#83465 y motivó el KEP-2862, que ahora llega a GA en v1.36.
Impacto para DevOps / Infraestructura / Cloud / Seguridad
Riesgo para equipos de operaciones
- Radio de explosión ampliado: Un agente de monitoreo comprometido con
nodes/proxypuede ejecutar código en todos los contenedores del nodo, incluso si solo necesitaba leer métricas. - Exposición en Helm charts: Investigaciones de 2026 encontraron que docenas de charts populares (como
kube-prometheus-stackynode-exporter) distribuían RBAC connodes/proxypor defecto, exponiendo clústeres en producción. - Falta de auditoría: Las operaciones
/execmediante WebSocket no quedan registradas en logs estándar del kubelet, dificultando la detección de intrusiones.
Impacto en seguridad y cumplimiento
- Cumplimiento de principio de mínimo privilegio: La autorización fina permite asignar permisos específicos (
kubelet/metrics,kubelet/pods,kubelet/healthz) sin conceder control total del nodo. - Reducción de superficie de ataque: Eliminar
nodes/proxyen favor de subrecursos específicos reduce el impacto de un compromiso en herramientas de observabilidad.
Datos concretos
- Versión afectada: Clusters con kubelets en v1.32–v1.35 pueden tener
nodes/proxyactivo si usaron Webhook authorization. - CVSS base: No aplica aún, pero el riesgo de RCE no registrado se considera medio-alto por la falta de logs y el alcance de compromiso.
- Componentes críticos:
– RBAC en el API Server.
– Herramientas de monitoreo como Prometheus Node Exporter, cAdvisor y Datadog Agent.
Detalles técnicos
¿Cómo funciona la autorización fina?
El kubelet en v1.36 implementa un doble chequeo de autorización:
- Primera verificación: Para endpoints mapeados a subrecursos finos (ver tabla abajo), el kubelet envía un
SubjectAccessReviewespecífico. Si la verificación falla, continúa. - Fallback: Si no hay permiso para el subrecurso, el kubelet intenta con
nodes/proxypara mantener compatibilidad.
| Endpoint kubelet | Subrecurso RBAC | Permiso mínimo recomendado |
|---|---|---|