No eventos de seguridad de Docker
Esta página enumera las vulnerabilidades de seguridad que Docker mitigó, de tal manera que los procesos ejecutados en contenedores de Docker nunca fueron vulnerables al fallo, incluso antes de que se solucionara. Esto asume que los contenedores se ejecutan sin añadir capacidades adicionales o no se ejecutan como --privileged.
La lista a continuación no está ni de lejos completa. Más bien, es una muestra de los pocos fallos que se ha observado que han atraído revisiones de seguridad y vulnerabilidades divulgadas públicamente. Con toda probabilidad, los fallos que no han sido reportados superan con creces a los que sí. Por suerte, dado que el enfoque de Docker es seguro por defecto mediante apparmor, seccomp y la eliminación de capacidades, es probable que mitigue los fallos desconocidos tan bien como lo hace con los conocidos.
Errores mitigados:
- CVE-2013-1956,
1957,
1958,
1959,
1979,
CVE-2014-4014,
5206,
5207,
7970,
7975,
CVE-2015-2925,
8543,
CVE-2016-3134,
3135, etc.:
La introducción de espacios de nombres de usuario sin privilegios provocó un gran aumento en la superficie de ataque disponible para los usuarios sin privilegios al otorgarles acceso legítimo a llamadas al sistema que antes eran exclusivas de root, como
mount(). Todos estos CVE son ejemplos de vulnerabilidades de seguridad debido a la introducción de espacios de nombres de usuario. Docker puede usar espacios de nombres de usuario para configurar contenedores, pero luego no permite que el proceso dentro del contenedor cree sus propios espacios de nombres anidados a través del perfil seccomp predeterminado, lo que hace que estas vulnerabilidades no sean explotables. - CVE-2014-0181,
CVE-2015-3339:
Estos son fallos que requieren la presencia de un binario setuid. Docker deshabilita los binarios setuid dentro de los contenedores a través de la bandera de proceso
NO_NEW_PRIVSy otros mecanismos. - CVE-2014-4699:
Un fallo en
ptrace()podría permitir la escalada de privilegios. Docker deshabilitaptrace()dentro del contenedor usando apparmor, seccomp y eliminandoCAP_PTRACE. ¡Tres niveles de protección allí! - CVE-2014-9529:
Una serie de llamadas a
keyctl()diseñadas podría causar DoS del kernel o corrupción de memoria. Docker deshabilitakeyctl()dentro de los contenedores usando seccomp. - CVE-2015-3214,
4036: Estos son fallos en controladores de virtualización comunes que podrían permitir a un usuario del sistema operativo invitado ejecutar código en el sistema operativo anfitrión. Explotarlos requiere acceso a los dispositivos de virtualización en el invitado. Docker oculta el acceso directo a estos dispositivos cuando se ejecuta sin
--privileged. Curiosamente, estos parecen ser casos en los que los contenedores son "más seguros" que una máquina virtual, yendo en contra de la creencia común de que las máquinas virtuales son "más seguras" que los contenedores. - CVE-2016-0728:
Un uso después de la liberación (use-after-free) causado por llamadas a
keyctl()diseñadas podría llevar a una escalada de privilegios. Docker deshabilitakeyctl()dentro de los contenedores usando el perfil seccomp predeterminado. - CVE-2016-2383:
Un fallo en eBPF (el DSL especial dentro del kernel utilizado para expresar cosas como filtros seccomp) permitía lecturas arbitrarias de la memoria del kernel. La llamada al sistema
bpf()está bloqueada dentro de los contenedores de Docker usando (irónicamente) seccomp. - CVE-2016-3134,
4997,
4998:
Un fallo en setsockopt con
IPT_SO_SET_REPLACE,ARPT_SO_SET_REPLACEyARPT_SO_SET_REPLACEque causa corrupción de memoria o escalada de privilegios local. Estos argumentos están bloqueados porCAP_NET_ADMIN, que Docker no permite por defecto.
Errores no mitigados:
- CVE-2015-3290,
5157: Fallos en el manejo de interrupciones no enmascarables del kernel permitían la escalada de privilegios. Se pueden explotar en contenedores de Docker porque la llamada al sistema
modify_ldt()no está bloqueada usando seccomp. - CVE-2016-5195:
Se encontró una condición de carrera en la forma en que el subsistema de memoria del kernel de Linux manejaba la rotura de copia en escritura (COW) de asignaciones de memoria privada de solo lectura, lo que permitía a usuarios locales sin privilegios obtener acceso de escritura a la memoria de solo lectura. También conocido como "dirty COW".
Mitigaciones parciales: en algunos sistemas operativos esta vulnerabilidad se mitiga mediante la combinación del filtrado seccomp de
ptracey el hecho de que/proc/self/memsea de solo lectura.