tutorial solucion seguridad programacion pila overflows example desbordamiento contramedidas camara c# .net security

solucion - ¿Son posibles las explotaciones de desbordamiento de búfer en C#?



desbordamiento de pila (4)

Suponiendo que un programa C # use solo código .NET administrado, ¿es posible tener una vulnerabilidad de seguridad de desbordamiento de búfer dentro de ese programa? Si es así, ¿cómo sería posible tal vulnerabilidad?


En un sentido absoluto, sí es posible un exploit de búfer debido a errores en el tiempo de ejecución de .NET. Sin embargo, .NET evita que la mayoría de los códigos de usuario final (excepto el uso ''inseguro'') de este tipo de problemas, por lo que en la vida real es menos riesgoso.

En la vida real, la mayoría de los problemas como este ocurrirán a partir de llamadas nativas (dll COM, etc.) invocadas desde código administrado.


Sí, en ambientes inseguros:

unsafe void bufferOverflow(string s) { char* ptr = stackalloc char[10]; foreach (var c in s) { *ptr++ = c; // Bufferoverflow if s.Length > 10 } }

"Permitir código no seguro" tiene que ser verificado para que esto se compile.

No se puede un desbordamiento de búfer tradicional con una matriz. Hará una verificación de límites antes de acceder a una matriz a menos que (CLR) pueda garantizar que sea seguro.


Sí, pero son mucho más difíciles de producir. Solo puede obtener desbordamientos de búfer si usa ciertas construcciones no seguras, y no con el código C # "normal". El código que corrompe la memoria no debería ser posible en absoluto, cuando su código se ejecuta con una confianza reducida.

Algunas posibilidades para desbordamientos de búfer:

  1. Usando la palabra clave unsafe , que permite punteros. El código inseguro es tan fácil como equivocarse, como el código basado en puntero en c o c ++.
  2. Uso de API inseguras, como los métodos de la clase Marshal
  3. (Solo Mono) Puede deshabilitar la verificación del rango del arreglo (compromiso de seguridad vs. rendimiento)

También hay algunas otras formas de corromper la memoria aparte de los desbordamientos de búfer.

  1. StructLayoutKind.Explicit
  2. Firmas de interoperabilidad nativas incorrectas

(El tiempo de ejecución en sí está escrito en C ++, por lo que un error en el tiempo de ejecución también puede dañar la memoria o desbordar un búfer, pero considero que está fuera del alcance de esta pregunta)


Sólo si utiliza la palabra clave unsafe .