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

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);Verifica si el dispositivo esta presente.
4070 if (!ha)
4071 return -EFAULT;
Para cargar el driver
Desde la consola se puede insertar el modulo de la siguiente manera
Código
$modprobe gdthReferences:
[SCSI] gdth: Prevent negative offsets in ioctl CVE-2009-3080
ASA-2010-026 (Avaya)










Autor





En línea

, si alguno se anima, please feedback!.