2010-03-03 13 views
11

Nel mondo C++ c'è una varietà di modi per rendere vulnerabile una vulnerabilità: overflow del buffer, gestione di pungiglioni non sicuri, vari trucchi aritmetici, problemi di stampa, stringhe che non terminano con '\ 0' e molti altri. Nonostante la maggior parte di questi problemi siano stati risolti in Java, ci sono alcune cose di cui parlare. Ma c'è qualche lista di tipiche vulnerabilità di codifica specifiche del C#? (e non correlato alla piattaforma .NET stessa)Problemi di sicurezza di codifica specifici per C#?

+2

Penso che questa dovrebbe essere una wiki della comunità. È una buona domanda, ma non c'è una sola risposta. –

+0

@ Frank: perché? Qualsiasi "problema" sarebbe una risposta corretta. –

+1

Questa è una buona domanda e sono stati scritti libri su questo argomento. Penso che sia un po 'ampio per l'overflow dello stack e la maggior parte delle risposte finora sono eccessivamente semplicistiche. – rook

risposta

4

C# è basato su .NET e .NET dovrebbe essere sicuro per tipo, il che significa che nessuno dei tuoi elenchi di orrori si applica a C# oa qualsiasi linguaggio .NET.

Ma poi di nuovo, C# ha una parola chiave unsafe e dopo che tutte le scommesse sono spente.
Consente puntatori reali e tutto ciò che viene fornito con loro.

0

Probabilmente nessuno dalla lista delle preoccupazioni, ma questo è quello di stare attenti con: void*

+0

In che modo 'void *' un problema di sicurezza di codifica specifico per C#? – Dinah

+0

Non c'è "void *" in C#. –

+0

@John Saunders: "void *" è valido in C# ma non è raccomandato, vedere questo: http://msdn.microsoft.com/en-us/library/y31yhkeb%28VS.80%29.aspx –

5

Qui ci sono alcuni problemi che si possono incontrare:

  1. Se avete qualsiasi tipo di interprete di lingua (HTML, JavaScript e SQL sono i tre grandi), quindi è possibile avere ancora vulnerabilità di XSS o di iniezione.
  2. P/Invoke può causare problemi, soprattutto se si sta eseguendo il marshalling personalizzato. Anche se stai chiamando un'API "sicura" tramite P/Invoke, il tuo codice di marshalling potrebbe contenere un bug che corrompe o espone la memoria.
  3. Se si sta eseguendo l'accesso ai file, è necessario assicurarsi che i file siano sempre in directory accettabili. Assicurati di disinfettare da cattivi percorsi assoluti e relativi.
  4. Crittografia. Una buona programmazione crittografica è davvero difficile, e le varie funzioni di sicurezza di .Net non fanno nulla contro gli attacchi cripto.
+0

+1 Completamente corretto, ma sono sicuro che questa non è una lista completa. – rook

+1

Giungeremo a un elenco completo di vulnerabilità proprio nel momento in cui risolviamo il problema di interruzione con la forza bruta. Inoltre, il punto 4 è una categoria di grandi dimensioni che potrebbe essere suddivisa in un numero enorme di vulnerabilità minori. –

+1

anche queste non sono vulnerabilità C#: solo vulnerabilità generali .NET e ASP.NET. –

2

Non proprio. Ho intenzione di fare una dichiarazione audace qui:
Non esiste una "vulnerabilità di codifica specifica di C# che non sia correlata alla piattaforma .net".

Un programma scritto in C++ viene compilato direttamente in un eseguibile della macchina, quindi il compilatore di linguaggio è direttamente responsabile della creazione del codice eseguito, da qui il modo in cui C++ può facilmente "creare una vulnerabilità sfruttabile".

Un programma scritto in C# viene tuttavia compilato in IL, che è l'unica lingua con cui funziona la piattaforma .net. L'ambiente .net crea un eseguibile macchina basato su quel codice IL. Tutto ciò che C# può fare è semplicemente un sottoinsieme di ciò che la piattaforma .net è in grado di fare. Questo è il modo in cui posso esprimere la mia audace affermazione. Tutto ciò che si potrebbe fare con C# che ha creato una vulnerabilità di codifica sarebbe uno dei:
1) Un bug nella piattaforma .net
o
2) L'esecuzione di codice esterno della piattaforma .NET

Quindi il modo la tua domanda è attualmente formulata mi porta a credere che o non sei pienamente consapevole delle enormi differenze tra "scrivere codice in C" e "scrivere codice per la piattaforma .net" o sto fraintendendo la tua domanda. Forse un po 'di entrambi! 8)

Spero che questo aiuti!

-1

Non dimenticare, puoi chiamare qualsiasi C++ da C#. Lo faccio tutto il tempo.Quindi tutti i problemi di sovraccarico del buffer e così via per C++ sono rilevanti anche per C# pari a se è non chiamare direttamente C++ perché C# chiama C++ per farlo funzionare.
Pensaci. E tutte le chiamate COM e le chiamate Marshal sono altrettanto aperte per attaccare normalmente. In Linux è possibile utilizzare le routine _r e in Ver 8 su in VC++ è possibile utilizzare le routine _s per ridurre la possibilità di overflow del buffer (richiede buffer utente e/o dimensioni massime). L'unico modo per fermare le vulnerabilità è spegnere il computer e leggere un libro in background (a meno che non abbia un virus).

+0

Non si può semplicemente chiamare qualsiasi C++ da C#, almeno non direttamente. C# e .Net in generale forniscono un tipo di stringa e gestiscono i buffer; non ti occupi delle funzioni di stringa C, né devi assicurarti di usare le varianti sicure. Questo in realtà non risponde alla domanda, non si notano problemi di sicurezza specifici di C#. – ssube

Problemi correlati