30 de Marzo, 2006

Multiplication integer overflow

Es una iniciativa interesante que algunos desarrolladores de OpenBSD tengan un blog en undeadly.

Ejemplo de ello es un artículo muy interesante en Multiplication Considered Harmful, del blog de Ray Lai.

Tampoco es que no haya literatura al respecto, pero me parece que Ray lo ha explicado bastante claro. Al menos eso me ha parecido de buena mañana :).

Un desbordamiento numérico, traducción libre:

Un desbordamiento numérico ocurre cuando una operación hace crecer o disminuir un número fuera de límites, dando como resultado un valor mucho mayor o menor de lo esperado.

El primer ejemplo que nos encontramos está bastante claro:

/* un tipo caracter tiene de tamaño un BYTE, lo que le
 * permite almacenar 256 valores, en este caso del -128 al 127
 * por ser con signo (implícito si no se usa unsigned)
 */
char a, b;

a = b = 127;
a = a * b;     /* desbordamiento! */

/* esperaríamos que 'a' valiera 16129, pero
 * 'no cabe' dentro de un tipo char, así que obtenemos
 * un 1 como resultado del overflow :o
 */

Esto puede ocurrir con otras operaciones, pero es bastante fácil que pase con una multiplicación.

¿Y qué ocurre cuando el resultado de esa multiplicación va destinado a indicar una cantidad de memoria que queremos reservar? Pues un desastre, y si además uno de los operandos puede ser influido por la entrada del usuario: ahí tenemos una vulnerabilidad ;).

Anotación por Juan J. Martínez, clasificada en: c, programming.

Hay 1 comentario

Gravatar

... ser interesante una segunda parte de esta anotación ¿no crees? (guiño).

por r0sk, en 2006-03-31 11:55:43

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Algunas anotaciones relacionadas: