Grave Vulnerabilidad en Kernel Linux 2.6.37-3.x.x x86_64


Grave Vulnerabilidad en Kernel Linux 2.6.37-3.x.x x86_64

Como siempre la vulnerabilidad permite la elevación de privilegios y es por esto que es una vulnerabilidad grave, como lo relatan en SEGU-INFO la vulnerabilidad afecta a todos los kernels (de 64 bits) desde la versión 2.6.37 a la 3.8.8 que hayan sido compilados con la opción CONFIG_PERF_EVENTS.

La vulnerabilidad paso un poco desapercibida hasta que alguien hizo público un exploit para aprovechar la vulnerabilidad. Como dice en segu-info no es para los que usan trinity son todos los Kernel de 64bits desde el 2.6.37 al 3.X.

Básicamente, antes de la llamada a sw_perf_event_destroy existe una llamada a perf_swevent_init, donde se inicializa un entero con signo al valor de event->attr.config, procedente del puntero a la estructura *event:

staticint perf_swevent_init(struct perf_event *event)

{

    int event_id = event->attr.config;

if (event->attr.type != PERF_TYPE_SOFTWARE)

returnENOENT;

Posteriormente, se hace una llamada asw_perf_event_destroyy aquí ese valor entero con signo es tratado como un entero sin signo de 64 bits:

staticvoid sw_perf_event_destroy(struct perf_event *event)

{

        u64 event_id = event->attr.config;

WARN_ON(event->parent);

static_key_slow_dec(&perf_swevent_enabled[event_id]);

swevent_hlist_put(event);

}

Como en perf_swevent_initel entero es tratado con signo, solo es comprobado en su límite superior, dejando abierta la posibilidad de que se introduzca un entero negativo que posteriormente en sw_perf_event_destroy, al ser “convertido” en u64, nos dará un entero positivo.

Debido a que el valor de event->attr.config es controlable por el usuario, cuando se efectua la llamada al sistema correspondiente mediante la estructuraperf_event_attr, es posible mapear una zona de memoria y obtener el control de la misma haciendo que se apunte a esa dirección. Si se llega a ejecutar nuestra zona de memoria con un shellcode instalado allí, este se ejecutaría con permisos de root.

Petr Matousek da una explicación completa y de recomendable estudio en la lista de bugzilla de Red Hat.

El parche fue añadido al repositorio del kernel el mismo mes. Básicamente consiste en promover la variable event_id‘ al tipo ‘u64, evitando así la falta de una comprobación apropiada:

staticint perf_swevent_init(structperf_event *event)

{

   int event_id = event->attr.config;

+   u64 event_id = event->attr.config;

if (event->attr.type != PERF_TYPE_SOFTWARE)

  return ENOENT;

Estaba viendo el código y básicamente lo que entendí es que la función del entero que debería tener signo al ser tratado sin signo permite agregar un Setuid es decir un permiso especial +4000 lo que permitirá a cualquier usuario ejecutar comandos desde un archivo o consola con todos los privilegios :S

Informacion Sacada de:

http://blog.segu-info.com.ar/2013/05/vulnerabilidad-exploit-y-actualizacion.html

Si no viste el exploit aquí esta de nuevo 😀

http://fucksheep.org/~sd/warez/semtex.c

http://unaaldia.hispasec.com/2013/05/vulnerabilidad-en-el-kernel-linux.html

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s