Sunday, 10 February 2008

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

11 comments:

  1. Increible, si ayer mismo me enteré del vmsplice y ayer mismo ya vi la version 2.6.24.1 que lo corregía en parte, ahora de buena mañana ya está la 2.6.24.2 que lo corrigió totalmente. Para que luego digan... si es que no hay color, han sido rapidisimos. Enhorabuena kernel team!

    ReplyDelete
  2. Sip, sin contar con que existían ya parches no oficiales o versiones git que corregían el fallo.

    Es lo bueno q

    ReplyDelete
  3. Para aquellos con muchos servidores, es posible desactivar la llamada syscall insertando un modulo. No son muchas las aplicaciones que lo usan. Es un areglo rápido para las maquinas con soporte para modulos.

    http://www.linux.it/~md/software/novmsplice.tgz
    http://www.linux.it/~md/software/novmsplice.tgz

    ReplyDelete
  4. pregunta ¿para solucionar hay que recompilar el kernel? dices que para aplicarlo simplemente:

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

    ¿luego a recompilar?

    ReplyDelete
  5. Hola,

    Sí, tienes que recompilar e instalar el nuevo kernel si quieres que los cambios sean efectivos y es la única manera de solucionar el problema definitivamente.

    Si quieres parchear el fallo "en el aire" puedes utilizar el fichero disable-vmsplice-if-exploitable.c que comentaba en el post, el cual lo compilas, ejecutas y desactiva vmsplice, pero cuando vuelvas a reiniciar si no has aplicado el parche y recompilado o actualizado a 2.6.24.2 seguirás teniendo el mismo problema.


    Saludos

    ReplyDelete
  6. ok, gracias por la info, buen blog. saludos.

    ReplyDelete
  7. Oye, gracias por la información , en mi caso soy nuevo en linux y me llamó la atención lo del "núcleo personalizado" ¿tienes algún vínculo o información sobre como hacer ésto?, ¿es algo manejable a nivel "novato"? o ¿es algo que puede tener riesgos?, gracias de antemano

    ReplyDelete
  8. [...] tarde, en http://blogs.ua.es/jgaliana/2008/02/11/bug-en-el-nucleo-linux-afecta-a-versiones-anteriores-a-26241/ se comenta que tal kernel (2.6.24.1) corrige el fallo de manera parcial, por lo que el autor del [...]

    ReplyDelete
  9. Hola,

    Respondiendo a #7 quería decir que yo me creo mi configuración y compilo el kernel a mano, es decir descargo las fuentes de kernel.org, lo configuro, compilo e instalo.

    Si te interesa el tema y quieres echarle un ojo te dejo un enlace donde hablan sobre cómo hacerlo.

    Saludos

    ReplyDelete
  10. Esto habla de la eficiencia de linux. LINUX pa todo el mundo. Je je

    ReplyDelete
  11. [...] do Linux está com um bug da versão 2.6.17 até a versão 2.6.24.1, então eu fui buscar mais detalhes sobre o problema e o que fazer pra corrigir esse [...]

    ReplyDelete