Categories
Linux

Grave fallo en el núcleo Linux afecta a versiones entre 2.6.17 y 2.6.24.1: Solución

Ha salido a la luz un bug en el kernel Linux que afecta a versiones entre la 2.6.17 y 2.6.24.1. En concreto afecta a la syscall vmsplice y permite a usuarios no autorizados leer y escribir en posiciones de memoria arbitrarias haciendo posible una escala de privilegios local a root.

Las distribuciones más importantes en sus versiones del kernel por defecto están afectadas: Ubuntu Gutsy 7.10, Fedora 8, OpenSuse 7.3, Debian, etc

En securityfocus han archivado el advisory de seguridad, podeis leerlo en Linux Kernel Multiple Prior to 2.6.24.1 Multiple Memory Access Vulnerabilities. Incluye información para solucionar el problema, además de código para saber si tu kernel está afectado.

SOLUCIÓN

Existe un parche para desactivar vmsplice en vivo (en el aire) y de esta manera el parche no funcionará, ya que busca la dirección de sys_vmsplice (via /proc/kallsyms) y reemplaza el primer byte con una instrucción RET (mediante mmap a /dev/kmem), lo podeis encontrar aquí:

http://www.ping.uio.no/~mortehu/disable-vmsplice-if-exploitable.c

Pero la solución realmente pasa por actualizar a 2.6.24.1.

ACTUALIZACIÓN 01:00 AM: Al parecer el kernel 2.6.24.1 sólo corrige parcialmente el fallo.

Según indican en la lkml existe una variante que aún afecta a esta versión y explican cómo solucionar completamente esta fallo.

He adaptado estas instrucciones para crear un parche que funcione en la versión 2.6.24.1 y corrige totalmente el fallo del vmsplice, está probado y funciona perfectamente:

— a/fs/splice.c 2008-02-08 20:55:30.000000000 +0100
+++ b/fs/splice.c 2008-02-11 22:00:53.000000000 +0100
@@ -1242,6 +1242,12 @@
if (unlikely(!base))
break;

+ /* CVE-2008-0009, CVE-2008-0010 fix */
+ if(!access_ok(VERIFY_READ, base, len)) {
+ error = -EFAULT;
+ break;
+ }
+
/*
* Get this base offset and number of pages, then map
* in the user pages.

Lo podeis descargar desde aqui.

Para aplicarlo simplemente:

penelope:/usr/src/linux# patch -p1 <../patch-vmsplice-2.6.24.1.diff
patching file fs/splice.c

Sólo queda recompilar el kernel e instalarlo.

ACTUALIZACIÓN 10:00 AM: kernel.org ha lanzado la versión oficial 2.6.24.2 que corrige totalmente el fallo de igual manera.

De todos modos el bug ya estaba corregido en versiones git, y no afectaba a kernels securizados con grsecurity, pax o selinux.

Podeis encontrarlo en kernel.org

Este es un ejemplo de la rapidez con la que responde el software libre ante problemas de seguridad, algo impensable en el modelo de software privativo en el cúal normalmente se demora demasiado el lanzamiento de parches o soluciones ante incidencias de seguridad críticas, algo inaceptable.

Podeis encontrar información sobre la incidencia y parches no oficiales para los kernels por defecto de Debian:

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=464953

En la rama oficial no estoy seguro si ya se ha incluido el parche ya que yo uso un núcleo personalizado.

Ya se ha producido la actualización de los núcleos de debian, teneis más información en el informe detallado junto con los paquetes deb.

ACTUALIZACIÓN: aep nos cuenta en los comentarios que existe un módulo para el kernel que soluciona el fallo en el aire, para los servidores que no hayan podido reiniciarse aún.

En la nueva versión 2.6.24.1 y 2.6.24.2 sigue funcionando el parche de bootsplash 3.1.6 presentado anteriormente en este blog.

Feliz upgrade!

Este post fue barrapunteado: post original