Icono del sitio Una Al Día

Elevación de privilegios en el kernel Linux desde el año 2001

Existen varios errores de validación en los valores de la estructura de datos «proto_ops». Esto podría ser aprovechado por un atacante local para elevar privilegios a través de llamadas a funciones con una estructura de datos «proto_ops» especialmente manipuladas. Esta vulnerabilidad existe desde el año 2001, y afecta a los kernel 2.4 y 2.6 de Linux.

La estructura «proto_ops» está definida en la librería net.h de Linux. Los protocolos usan esta estructura para realizar distintas funciones: bind, connect, etc.

Cuando un protocolo no va a implementar una de estas funciones debería asignar la función «sock_no_*» adecuada. Por ejemplo en el caso del puntero «sendpage» cuando este valor no va a ser usado debería de ser inicializado a la función «sock_no_sendpage» que está definida e implementada en sock.h y sock.c respectivamente.

La estructura «proto_ops» debería ser inicializada por completo por los distintos protocolos implementados en Linux, pero no siempre es así; por ejemplo en «bnep_sock_ops» (el tipo «proto_ops» de bluetooth) el campo «connect» entre otros, sí apunta a «sock_no_connect» sin embargo los campos «getsockopt», «compat_setsockopt», «sendpage» y «splice_read» no son definidos haciendo referencia a un puntero nulo.

Se hecho público un exploit que aprovecha esta vulnerabilidad.

Parche para la rama 2.6:
http://git.kernel.org/?p=linux/kernel/git/stable/linux-2.4.37.y.git;a=commitdiff_plain;h=c18d0fe535a73b219f960d1af3d0c264555a12e3

Parche para la rama 2.4:
http://git.kernel.org/linus/e694958388c50148389b0e9b9e9e8945cf0f1b98

Victor Antonio Torre
vtorre@hispasec.com

Más información:

CVE:
CVE-2009-2692

Red Rat bugzilla:
https://bugzilla.redhat.com/show_bug.cgi?id=516949#c10

struct proto_ops:
http://lxr.linux.no/linux+v2.6.30.4/include/linux/net.h#L150

struct proto_ops bnep_sock_ops
http://lxr.linux.no/linux+v2.6.30.4/net/bluetooth/bnep/sock.c#L169

Acerca de Hispasec

Hispasec Ha escrito 7093 publicaciones.

Salir de la versión móvil