2012-02-18 18 views
24

Supponendo che un programma C# utilizzi solo codice .NET gestito, è possibile avere una vulnerabilità di sicurezza di buffer overflow all'interno di quel programma? In tal caso, in che modo tale vulnerabilità sarebbe possibile?Gli exploit di overflow del buffer sono possibili in C#?

+0

Overflow del buffer nel senso classico o qualsiasi tipo di sfruttamento del buffer overflow? – Dykam

+0

Controlla le parole chiave 'unchecked' e' unssafe'. –

+0

@Dykam: Nel senso di un exploit. – poke

risposta

43

Sì, ma sono molto più difficili da produrre. È possibile ottenere buffer overflow solo se si utilizzano determinati costrutti non sicuri e non con il codice C# "normale". Il codice di corruzione della memoria non dovrebbe essere possibile, quando il codice è in esecuzione con un trust ridotto.

Qualche possibilità di buffer overflow:

  1. utilizzando la parola chiave unsafe, che permette di puntatori. Il codice non sicuro è altrettanto facile da sbagliare, come il codice basato su puntatore in c o C++.
  2. Utilizzando le API non sicuri, come ad esempio i metodi della classe Marshal
  3. (mono) È possibile disattivare il controllo intervallo di matrice (sicurezza contro le prestazioni trade-off)

ci sono anche alcuni altri modi per danneggiare la memoria a parte i buffer overflow.

  1. StructLayoutKind.Explicit
  2. errati firme di interoperabilità nativa

(Il runtime stesso è scritto in C++, in modo da un bug nel runtime può memoria anche corrotto o un buffer overflow, ma ritengo che fuori del campo di applicazione di questa domanda)

3

Solo se si utilizza la parola chiave unsafe.

3

In un senso assoluto, sì un exploit di buffer è possibile a causa di errori nel runtime .NET. Tuttavia, .NET previene la maggior parte del codice utente finale (tranne l'utilizzo "non sicuro") da questi tipi di problemi, quindi nella vita reale è meno rischioso.

Nella vita reale, la maggior parte dei problemi di questo tipo si verificano dalle chiamate native (DLL COM ecc.) Richiamate dal codice gestito.

14

Sì, in ambienti non sicuri:

unsafe void bufferOverflow(string s) 
{ 
    char* ptr = stackalloc char[10]; 

    foreach (var c in s) 
    { 
     *ptr++ = c; // Bufferoverflow if s.Length > 10 
    } 
} 

"Consenti codice non sicuro" deve essere controllato per questo compilare.

Non è possibile un buffer overflow tradizionale con un array. Effettua il controllo dei limiti prima di accedere a un array, a meno che (CLR) possa garantire che sia sicuro.

+2

+1 per fornire un esempio e menzionare il controllo di compilazione. –

+1

Questo è un po 'errato - Stackalloc non ti permetterà di bufferare l'overflow. –

Problemi correlati