elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
25 Mayo 2012, 09:26  


Tema destacado: ¡Aprende hacking con práctica! - WarZone, el wargame de elhacker.net

+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Bugs y Exploits (Moderador: berz3k)
| | |-+  CVE-2009-3080 - Memory Disclosure
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: CVE-2009-3080 - Memory Disclosure  (Leído 1,237 veces)
AlbertoBSD
Estudiante y
Colaborador
***
Desconectado Desconectado

Mensajes: 1.955


Anonymous & Paranoid


Ver Perfil WWW
CVE-2009-3080 - Memory Disclosure
« en: 8 Marzo 2010, 00:29 »

Citar
* an array index error was found in the gdth driver. A local user could send a specially-crafted IOCTL request that would cause a denial of service or, possibly, privilege escalation. The Common Vulnerabilities and Exposures project (cve.mitre.org) has assigned the name CVE-2009-3080 to this issue.

El diff

Código
--- a/drivers/scsi/gdth.c
+++ b/drivers/scsi/gdth.c
@@ -2900,7 +2900,7 @@ static int gdth_read_event(gdth_ha_str *ha, int
handle, gdth_evt_str *estr)
       eindex = handle;
   estr->event_source = 0;
 
-    if (eindex >= MAX_EVENTS) {
+    if (eindex < 0 || eindex >= MAX_EVENTS) {
       spin_unlock_irqrestore(&ha->smp_lock, flags);
       return eindex;
   }

El archivo viejo (vulnerable) solo comprueba el limite superior
Código
2889 static int gdth_read_event(gdth_ha_str *ha, int handle, gdth_evt_str *estr)
2890 {
2891     gdth_evt_str *e;
2892     int eindex;
2893     ulong flags;
2894
2895     TRACE2(("gdth_read_event() handle %d\n", handle));
2896     spin_lock_irqsave(&ha->smp_
lock, flags);
2897     if (handle == -1)
2898         eindex = eoldidx;
2899     else
2900         eindex = handle;
2901     estr->event_source = 0;
2902
2903     if (eindex >= MAX_EVENTS) {
2904         spin_unlock_irqrestore(&ha->smp_lock, flags);
2905         return eindex;
2906     }
2907     e = &ebuffer[eindex];
2908     if (e->event_source != 0) {
2909         if (eindex != elastidx) {
2910             if (++eindex == MAX_EVENTS)
2911                 eindex = 0;
2912         } else {
2913             eindex = -1;
2914         }
2915         memcpy(estr, e, sizeof(gdth_evt_str));
2916     }
2917     spin_unlock_irqrestore(&ha->smp_lock, flags);
2918     return eindex;
2919 }


Handle deberia de ser distinto de menos uno para que se cumpla el else
Código
if (handle == -1)

La falla esta aqui :P

Código
2907 e = &ebuffer[eindex];

Despues de eso

Código
2915 memcpy(estr, e, sizeof(gdth_evt_str));

escribe sobre estr, lo que se encuentre en e, con una longitud de
Código
sizeof(gdth_evt_str)

Problema para hacer el PoC

Para que se produzca la llamada

Código
4089 evt.handle = gdth_read_event(ha, evt.handle, &evt.event);

Antes hay que pasar por

Código
4069 ha = gdth_find_ha(evt.ionode);
4070 if (!ha)
4071 return -EFAULT;
 
Verifica si el dispositivo esta presente.

Para cargar el driver

Desde la consola se puede insertar el modulo de la siguiente manera

Código
$modprobe gdth

References:
[SCSI] gdth: Prevent negative offsets in ioctl CVE-2009-3080
ASA-2010-026 (Avaya)
En línea

Bien Super Divertido
@wifigdlmx
Ivanchuk


Desconectado Desconectado

Mensajes: 466


LLVM


Ver Perfil WWW
Re: CVE-2009-3080 - Memory Disclosure
« Respuesta #1 en: 8 Marzo 2010, 21:16 »

Acá dejo el PoC,

gdth.c
gdth.h

En realidad no está testedo por que no teníamos el hardware :-\, si alguno se anima, please feedback!.

Acceder el driver

1- Es necesario crear el nodo en /dev. Después de haber cargado el módulo con modprobe como dijo Anon hay que fijarse el major number que reservó el kernel para el módulo, ya que el driver lo pide dinámicamente.

Código:
$cat /proc/devices | grep gdth # En el caso que gdth sea el node que referencia el driver!
251 gdth

2- Ejecutar el PoC con
Código:
$gdth_poc /dev/gdth -2 # TODO: El índice está fijo a -4 en el source! corregir PoC.
En línea

Sólo quien practica lo absurdo puede lograr lo imposible.

Join us @ http://foro.h-sec.org
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines