¿Por qué no causa un desbordamiento del búfer cuando una cadena grande se valida por longitud?

1

Sé que muchos ataques de desbordamiento de búfer en los servidores se realizan mediante el envío de cadenas de entrada muy grandes a través de algún formulario HTML, etc. muy largo. Sin embargo, me imagino que la cadena debe cargarse en un búfer de tamaño fijo en la memoria para verificar su longitud en primer lugar. ¿Por qué esto no puede causar un desbordamiento de búfer?

    
pregunta Magnus 26.10.2016 - 17:51
fuente

1 respuesta

3

Codifico exclusivamente en lenguajes de alto nivel donde el desbordamiento de búfer no es un problema, así que me disculpo por no tener un ejemplo de código para ti.

Ejemplo; cuando escribe una cadena en la memoria que se recibió a través de la red: (datos no confiables)

  1. Se asigna un espacio de memoria para almacenar la cadena entrante.
  2. Se lee una cadena desde la red en trozos. En muchos casos, se desconoce la longitud.
  3. La cadena se escribe en la posición inicial de la asignación anterior. Se agregan datos adicionales en ese punto hasta que se encuentre el delimitador deseado. (es decir, \n en una solicitud HTTP)

    • Si la cadena es demasiado larga, entonces los datos se desbordan más allá del espacio asignado, posiblemente sobrescribiendo la memoria adicional asignada para otro propósito. Esto a menudo produce un choque seguro; pero en circunstancias específicas, tales ataques pueden tener graves consecuencias, especialmente si la cadena inyectada se interpretará como un código ejecutable.

    • Una aplicación segura asignará un búfer más grande según sea necesario. Esto ocurre automáticamente en un lenguaje de alto nivel.

    • Como alternativa, puede truncar o rechazar datos que superen la longitud máxima.

Se pueden encontrar ejemplos adicionales en Wikipedia

También hay ataques de solo lectura que se realizan en programas inseguros:

  • Si se asigna un búfer, pero la escritura está incompleta (es decir, la cadena recibida es más corta que la longitud esperada), entonces habrá datos aleatorios restantes en ese búfer. Si el atacante accede posteriormente al búfer, se puede robar la memoria aleatoria.

    La mayoría de los idiomas de alto nivel anularán los búferes asignados, pero esto es menos eficiente, por lo que algunos idiomas ofrecen una opción (o predeterminada) para omitir el paso de cero.

  • Las vulnerabilidades de desbordamiento de enteros podrían usarse para omitir las verificaciones de longitud más adelante en el programa. Si se utiliza un valor entero editado malintencionadamente para leer las ubicaciones de la memoria o para establecer el límite de longitud de una operación de lectura, se puede robar la memoria aleatoria.

    Se produciría un desbordamiento de enteros si las matemáticas se realizan antes de la validación. Por ejemplo, if(requestedDataLength + someModifier < limit) debería cambiarse a if(requestedDataLength < limit - someModifier) .

    El desbordamiento de enteros se puede usar para ataques que no están relacionados con la asignación de búfer. Muchos lenguajes de alto nivel se ven afectados por el desbordamiento de enteros, pero esto es menos común.

Las consecuencias pueden variar, pero en el peor de los casos podría resultar en el robo de credenciales de acceso o datos confidenciales.

En un lenguaje de alto nivel, la asignación de búferes y el manejo de la longitud son automáticos, y estas vulnerabilidades normalmente no pueden surgir.

    
respondido por el George Bailey 26.10.2016 - 18:14
fuente

Lea otras preguntas en las etiquetas