Vulnerabilidad de Runc CVE-2019-5736 en un host

Nota perev. : Anoche, Aleksa Sarai, ingeniero de contenedores senior en SUSE Linux, dijo a la lista de correo oss-sec de una vulnerabilidad de seguridad crítica runc / LXC que podría permitir a un atacante acceder a un contenedor aislado para obtener privilegios de root en el sistema host. Dado que el problema se identificó en la implementación de referencia del tiempo de ejecución del contenedor, runc, afecta a numerosos sistemas de contenedores, incluidos Docker / Moby, Podman , cri-o (y Kubernetes). Los detalles se presentan a continuación en la forma de traducir el mensaje de un ingeniero en una lista de correo.


Soy uno de los mantenedores de runc (el tiempo de ejecución de contenedor subyacente utilizado por Docker, cri-o, containerd, Kubernetes, etc.). Recientemente se supo de una vulnerabilidad que verificamos y reparamos.

Investigadores que descubrieron la vulnerabilidad:

  • Adam Iwaniuk;
  • Borys Popławski.

Además, Aleksa Sarai (es decir, I) descubrió que el LXC también se ve afectado por una versión más sofisticada de esta vulnerabilidad.

Breve reseña


La vulnerabilidad permite que un contenedor malicioso (con mínima interacción del usuario) sobrescriba el binario del host runc y, por lo tanto, pueda ejecutar código con privilegios de root en el host. El grado de interacción del usuario es tal que le permite ejecutar cualquier comando (no importa si el atacante controla el comando) con privilegios de root dentro del contenedor en cualquiera de estos contextos:

  • Crear un nuevo contenedor a partir de una imagen controlada por un atacante;
  • Conexión ( docker exec ) a un contenedor existente al que el atacante tenía previamente acceso de escritura.

Esta vulnerabilidad no está bloqueada por la política predeterminada de AppArmor o la política predeterminada de SELinux en Fedora * (porque los procesos del contenedor parecen haber comenzado con container_runtime_t ). Sin embargo, está bloqueado por el uso correcto de los espacios de nombres de usuario (donde la raíz del host no se asigna al espacio de nombres de usuario del contenedor).

El vector CVSSv3 (con una calificación de 7.2) es el siguiente:

AV:L/AC:H/PR:L/UI:R/S:C/C:N/I:H/A:H

El problema se le asigna CVE-2019-5736 .

* El problema se aplica solo al paquete moby-engine en Fedora. El paquete docker , como podman , está protegido de su funcionamiento, ya que inicia los procesos de container_t como container_t .

Parches


Estoy aplicando el parche apropiado para solucionar el problema ( 0001-nsenter-clone-proc-self-exe-to-avoid-exposing-host-b.patch ). Se basa en la rama HEAD , aunque el código en libcontainer/nsenter/ cambia tan raramente que el parche probablemente se aplica a casi cualquier versión antigua de la base de código runc con la que está tratando.

Tenga en cuenta que el parche que envío a la rama principal de runc es una versión modificada de este parche, aunque son funcionalmente idénticos (si todavía no ha parcheado sus archivos con el parche adjunto, le recomendamos que use la versión ascendente).

Código de explotación secundario


Algunos proveedores solicitaron un código de explotación para asegurarse de que los parches resolvieran el problema. Dado que el problema es muy grave (especialmente para los proveedores de nube pública), decidimos proporcionar dicho código. El exploit que escribí es más general que el código original proporcionado por los investigadores y funciona para el LXC (no requiere modificaciones fuertes para poder aplicarlo a otros entornos ejecutables vulnerables). Los detalles sobre cómo usar el código de explotación se proporcionan en README .

De acuerdo con las reglas de OpenWall, el código de explotación se lanzará públicamente 7 días después del CRD (es decir, 18 de febrero de 2019). Si tiene un tiempo de ejecución de contenedor, asegúrese de que no se vea afectado por esta vulnerabilidad.

Impacto en otros proyectos


Cabe señalar que en el curso de una investigación más profunda del problema, descubrí que el LXC tiene una vulnerabilidad similar, y ya presionaron un parche similar de nuestro desarrollo conjunto. LXC es un poco más difícil de operar, pero el problema en sí es el mismo.

Una discusión con representantes de systemd-nspawn llevó a la conclusión de que no son vulnerables (ya que tienen un método diferente para conectarse al contenedor para LXC y runc).

Los representantes de Apache Mesos también se pusieron en contacto conmigo, informando que también son vulnerables (creo que simplemente usaron el código de explotación que se publicará). Es muy probable que la mayoría de los tiempos de ejecución de los contenedores sean vulnerables si no han tomado previamente medidas muy inusuales para mitigar su impacto potencial.

Otras noticias


Hemos configurado un boletín para futuras vulnerabilidades de seguridad: el proceso de unirse a él se describe aquí (se basa en la lista de correo de anuncios de seguridad de Kubernetes). Únase si distribuye tiempos de ejecución para contenedores que dependen de runc (u otros proyectos OCI).

PD Del traductor


Problema CVE-2019-5736 en rastreadores de distribuciones populares de Linux:


... y la publicación del blog de Kubernetes (consulte la sección "¿Qué debo hacer?").

Source: https://habr.com/ru/post/439964/


All Articles