2012-02-18 18 views
24

Suponiendo que un programa C# usa solo código .NET administrado, ¿es posible tener una vulnerabilidad de seguridad de desbordamiento del búfer dentro de ese programa? De ser así, ¿cómo sería posible tal vulnerabilidad?¿Son posibles exploits de desbordamiento de búfer en C#?

+0

Desbordamiento de búfer en el sentido clásico, o cualquier tipo de aprovechamiento de desbordamiento de búfer? – Dykam

+0

Echa un vistazo a las palabras clave 'no verificada' y' insegura'. –

+0

@Dykam: En el sentido de un exploit. – poke

Respuesta

43

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

Unas posibilidades de desbordamientos de búfer:

  1. usando la palabra clave unsafe, que permite a los punteros. El código no seguro es tan fácil de equivocarse, como el código basado en puntero en c o C++.
  2. Utilización de las API inseguras, tales como los métodos de la clase Marshal
  3. (Mono) Puede desactivar la comprobación de rango de matriz (seguridad frente a los resultados del comercio-off)

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

  1. StructLayoutKind.Explicit
  2. erróneos firmas de interoperabilidad nativa

(El tiempo de ejecución en sí está escrito en C++, por lo que un error en el tiempo de ejecución puede memoria también corruptos o desbordar un buffer, pero considero que fuera de alcance para esta pregunta)

3

En un sentido absoluto, sí es posible un aprovechamiento de memoria intermedia debido a errores en el tiempo de ejecución de .NET. Sin embargo, .NET evita la mayoría del código 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 (COM dlls, etc.) invocadas desde el código administrado.

14

Sí, en entornos no seguros:

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 revisado para que esto se compila.

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

+2

+1 para dar un ejemplo y mencionar el control de compilación. –

+1

Esto es algo incorrecto: stackalloc no le permitirá desbordamiento de búfer. –

Cuestiones relacionadas