domingo, 16 de agosto de 2009

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

No hay comentarios:

Publicar un comentario en la entrada