¿Cómo evitar que Memcpy provoque un desbordamiento de Heap?

3

Estoy siguiendo la presentación de la lección de seguridad Stanford CS155 para aprender sobre el desbordamiento de enteros. Hoy aprendí que la función memcpy () puede llevar a un desbordamiento. La presentación dice: Si tengo un código como el siguiente, la función segunda memcpy () puede desbordar el montón .

void  func( char *buf1, *buf2,    unsigned int len1, len2) {
  char temp[256];
  if (len1 + len2 > 256) {return -1}    // length check
  memcpy(temp, buf1, len1); // cat buffers
  memcpy(temp+len1, buf2, len2);
  do-something(temp);   // do stuff
}

¿Cómo puedo prevenir el desbordamiento? ¿Qué debo cambiar en memcpy() para que no cause un desbordamiento?

    
pregunta green 13.03.2016 - 17:02
fuente

1 respuesta

2

El problema es que está agregando los dos enteros antes de realizar la verificación de longitud.

if (len1 + len2 > 256) {return -1}    // length check

Si len1 y / o len2 son lo suficientemente grandes, la adición desbordará , y la verificación de la longitud puede pasar aunque los valores de len1 y / o len2 son demasiado grandes. Para estar seguro, debe verificar dos veces:

if ((len1 > 256) || (len2 > 256) ||(len1 + len2 > 256)) {return -1}

Para un ejemplo, intente configurar len1 y len2 a UINT_MAX/2+1 . Entonces, len1 + len2 (generalmente) será 0 .

    
respondido por el sleske 14.03.2016 - 11:23
fuente

Lea otras preguntas en las etiquetas