Descripción
Una vulnerabilidad en el kernel de Linux (para arquitecturas de 64 bits) permite escalar privilegios obteniendo permisos de root. Dicha vulnerabilidad puede ser explotada de forma local y su exploit ya se encuentra en circulación; por este motivo es fundamental tomar las medidas preventivas comentadas en el presente aviso.
Sistemas Afectados
- Kernel de 64 bits a partir de la versión 2.6.27
Detalle
La vulnerabilidad identificada por el CVE-2010-3301 describe un defecto en la emulación de binarios para arquitecturas de 32 bits (IA32 system call emulation) en el kernel de Linux (para la versión de 64 bits), dentro de las versiones 2.6.27-2.6.36-rc1 a rc4. El problema se presenta al validar incorrectamente un valor de 64 bits que es almacenado en el registro %rax, el cual puede lanzar un «out-of-bounds system call table access» y ejecutar código arbitrario en el contexto del kernel. Un usuario local podría utilizar esta vulnerabilidad para elevar sus privilegios.
Esta vulnerabilidad, la cuál ya había sido resuelta y parcheada en el 2007 (CVE-2007-4573) surge como consecuencia de una incorrecta optimización implementada en las rutinas de bajo nivel en el fichero arch/x86_64/ia32/ia32entry.S. A continuación se muestra parte del código vulnerable:
La llamada mediante ia32_sys_call_table usando el registro ‘rax’ sin un correcta comprobación puede permitir efectuar llamadas a direcciones fuera de la tabla de llamadas con privilegios de root. Al parecer, en las últimas versiones del kernel los desarrolladores han eliminado la macro LOAD_ARGS32: «movl offset+72(%rsp),%eax» encargada de solucionar el bug reportado en el 2007 y que permitía cargar de forma segura el registro ‘rax’ previniendo su explotación y es por este motivo por el que permanece en las versiones actuales del kernel.
Solución
Hasta que se actualice el kernel a una versión parcheada que resuelva dicha vulnerabilidad se aconseja como medida provisional deshabilitar la emulación de ficheros ELF de 32 bits. Esta solución fue propuesta por Terje Malmedal en las lista de correo de Fulldisclosure:
echo ':32bits:M:0:x7fELFx01::/bin/echo:' > /proc/sys/fs/binfmt_misc/register
La salida de dicho comando creará el fichero /proc/sys/fs/binfmt_misc/32bits con el siguiente contenido:
# cat /proc/sys/fs/binfmt_misc/32bits enabled interpreter /bin/echo flags: offset 0 magic 7f454c4601
Lo que conseguimos con esta solución es registrar un nuevo tipo de fichero con el identificador ‘x7fELFx01’ con el objetivo de invocar /bin/echo cada vez que un binario de 32 bits sea ejecutado. Dicho identificador está dividido en dos partes, los primeros 4 bytes se corresponden con el magic number mientras que el último byte (x01′) indica que se trata de un objeto de 32 bits.
Esta solución no debe ser implementada cuando se necesiten emular binarios de 32 bits en arquitecturas x86_64. En este caso se aconseja no descargar ni ejecutar archivos sospechosos y actualizar el kernel tan pronto esté disponible una nueva versión parcheada.
Para restaurar el Sistema Operativo al comportamiento por defecto utilice el siguiente comando.
# echo -1 > /proc/sys/fs/binfmt_misc/32bits