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
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
Deja una respuesta