Kernel Local Privilege Escalation "Dirty COW" - CVE-2016-5195
Red Hat Product Security ha tenido conocimiento de una vulnerabilidad en el kernel de Linux, a la cual se le ha asignado el CVE-2016-5195. Este problema se hizo público el día 19 de octubre de 2016 y ha sido evaluado como Importante. Este problema se conoce en los medios como "Dirty COW".
### Información de fondo
Se detectó una condición de concurrencia en la forma como el subsistema de memoria del kernel de Linux manejaba el corte de la Copia al escribir (COW) del mapeo de memoria privada de solo lectura. Un usuario local sin privilegios podría aprovechar esta falla para obtener acceso de escritura de los mapeos de memoria que suelen ser de solo lectura y así aumentar sus privilegios en el sistema.
Esto puede ser aprovechado de forma abusiva por un atacante para modificar los archivos Setuid y elevar privilegios. La explotación de esta vulnerabilidad mediante esta técnica ha sido utilizada. Este error afecta a la mayor parte de distribuciones de Linux.
Red Hat Product Security ha evaluado esta actualización como de impacto de seguridad Importante.
Productos impactados
Se han afectado las siguientes versiones de Red Hat Product:
- Red Hat Enterprise Linux 5
- Red Hat Enterprise Linux 6
- Red Hat Enterprise Linux 7
- Red Hat Enterprise MRG 2
- Red Hat Openshift Online v2
- Red Hat Virtualization (RHEV-H/RHV-H)
Descripción del ataque e impacto
Este fallo le permite a un atacante con una cuenta del sistema local, modificar los binarios en disco, eludiendo los mecanismos de permisos estándares que evitarían la modificación. Esto se lleva a cabo al ejecutar la llamada del sistema madvise(MADV_DONTNEED), mientras se tiene en memoria la página del mmapped ejecutable.
Diagnostique su vulnerabilidad
Acción
Se recomienda a todos los clientes de Red Hat que ejecuten las versiones afectadas del kernel, actualicen el kernel tan pronto como estén disponibles los parches. A continuación encontrará la información sobre los paquetes impactados, al igual que la mitigación recomendada. Se requiere reiniciar el sistema para que la actualización del kernel pueda llevarse a cabo.
Actualizaciones por productos afectados
Un kpatch para los clientes que ejecuten Red Hat Enterprise Linux 7.2 o superior, está disponible. Por favor abra un caso de soporte para obtener acceso al kpatch.
Más información sobre lo que un kpatch significa :
¿Tiene soporte el parche de kernel en vivo (kpatch) en RHEL 7 ?
Producto | Paquete | Recomendación/Actualización |
---|---|---|
Red Hat Enterprise Linux 7 | kernel | RHSA-2016:2098 |
Red Hat Enterprise Linux 7 | kernel-rt | RHSA-2016:2110 |
Red Hat Enterprise Linux 7.1 Extended Update Support* | kernel | RHSA-2016:2118 |
Red Hat Enterprise Linux 6 | kernel | RHSA-2016:2105 |
Red Hat Enterprise Linux 6.7 Extended Update Support* | kernel | RHSA-2016:2106 |
Red Hat Enterprise Linux 6.6 Extended Update Support* | kernel | RHSA-2016:2128 |
Red Hat Enterprise Linux 6.5 Advanced Update Support** | kernel | RHSA-2016:2120 |
Red Hat Enterprise Linux 6.4 Advanced Update Support** | kernel | RHSA-2016:2133 |
Red Hat Enterprise Linux 6.2 Advanced Update Support** | kernel | RHSA-2016:2132 |
Red Hat Enterprise Linux 5 | kernel | RHSA-2016:2124 |
Red Hat Enterprise Linux 5.9 Long Life | kernel | RHSA-2016:2126 |
Red Hat Enterprise Linux 5.6 Long Life | kernel | RHSA-2016:2127 |
RHEL Atomic Host | kernel | pendiente |
Red Hat Enterprise MRG 2 | kernel-rt | RHSA-2016:2107 |
Red Hat Virtualization (RHEV-H/RHV-H) | kernel | pendiente |
*Se requiere una suscripción activa de EUS para poder acceder a este parche.
Por favor contacte al Equipo de ventas de Red Hat o al representante de ventas específico para obtener más información, si su cuenta no tiene una suscripción activa de EUS.
¿Qué es una suscripción Red Hat Enterprise Linux Extended Update Support?
*Se requiere una suscripción activa de AUS para poder acceder a este parche en RHEL 6.X AUS.
Mitigación
CÓMO CONSTRUIR Y UTILIZAR LA SOLUCIÓN SYSTEMTAP
La contramedida systemtap implica la creación de un módulo de kernel (como un controlador) mediante un script systemtap que intercepta la llamada del sistema vulnerable. Se utiliza como una solución stopgap hasta que el kernel corregido sea iniciado en la máquina afectada. Esta solución no requiere un reinicio y se aplica a RHEL 5 6 y 7.
No es posible hacer un módulo que aplique a todos los kernel. Ni siquiera para una familia (e.g., Todos los RHEL5, 6 o 7). Cada versión de kernel requiere un archivo .ko generado para dicho kernel (uname -r).
REQUERIMIENTOS
Para construir el módulo systemtap, se requieren los siguientes paquetes:
- systemtap-client
- systemtap-devel
- gcc (and dependencies)
- kernel-devel-`uname -r`
- kernel-debuginfo-`uname -r`
- kernel-debuginfo-common-`uname -r`
ADVERTENCIA: Los paquetes 'kernel' requieren la misma versión que ejecuta el kernel. Al descargar la versión más reciente impedirá el funcionaminto de systemtap. Por favor descargue la versión exacta en ejecución.
DÓNDE OBTENER LA INFORMACIÓN DE DEPURACIÓN
Por favor consulte la base de conocimientos (KB) https://access.redhat.com/solutions/9907
CÓMO CONSTRUIR EL MÓDULO
1. Después de instalar los paquetes, cree el archivo denominado dirtycow.stp con este contenido:
probe kernel.function("mem_write").call ? { $count = 0 } probe syscall.ptrace { // includes compat ptrace as well $request = 0xfff } probe begin { printk(0, "CVE-2016-5195 mitigation loaded") } probe end { printk(0, "CVE-2016-5195 mitigation unloaded") }
2. Guarde el archivo. Compílelo mediante este comando:
# stap -g -p 4 -m dirtycow_`uname -r|tr -cd [:digit:]` dirtycow.stp dirtycow_26183985.ko
En el ejemplo anterior, el archivo .ko tiene un número que identifica su versión de kernel. En ese caso. es 2.6.18-398.el5. Este módulo puede utilizarse en otros sistemas con la versión de kernel exacta, sin tener que instalar debugs/debuginfos/systemtap. Solo copie el archivo al servidor con el mismo kernel y prosiga al siguiente paso.
3. Para cargar el módulo, ejecute el comando insmod <.ko file>. Por ejemplo:
# insmod dirtycow_26183985.ko
4. Verifique si está cargado:
# lsmod| grep dirty dirtycow_26183985 101688 0
5. Para descargar el módulo, use el comando rmmod o reinicie el sistema.
IMPORTANTE
- El módulo no sobrevive el arranque: no es vuelto a cargar tras de un arranque del sistema.
- Después del reinicio, el módulo debe volverse a cargar de forma manual.
- Si se ha actualizado o cambiado el kernel, este módulo debe cargarse en el nuevo kernel.
- Si arrancó en un kernel diferente sin la corrección, se deberá cargar un nuevo módulo compatible.
- Un kernel corregido no necesita la carga del módulo.
Por favor consulte el error 1384344 para los pasos detallados de mitigación.
Comments