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
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
0 comentarios:
Publicar un comentario en la entrada