Strumenti dinamici per rilevare le vulnerabilità nelle applicazioni software scritte in c?

0

Sto facendo un progetto per rilevare vulnerabilità in Windows 7/8 per applicazioni software. Alcuni dei quali hanno il codice sorgente disponibile e altri no.

Suggerire qualche tecnica che possa aiutarmi a rilevare le vulnerabilità in fase di compilazione o in fase di esecuzione.

C'è un modo nuovo che può essere utilizzato per scoprire la vulnerabilità del buffer overflow?

    
posta Aslan 21.02.2013 - 10:29
fonte

4 risposte

2
  • Avalanche è uno strumento di rilevamento dei difetti dinamici che genera "input of death" - dati in ingresso che riproducono criticità bug e vulnerabilità nel programma analizzato.

  • BoundsChecker è uno strumento di verifica della memoria e di convalida delle chiamate API utilizzato per lo sviluppo di software C ++ con Microsoft Visual C ++ .

  • Valgrind è un framework di strumenti per la creazione di strumenti di analisi dinamica. Esistono strumenti Valgrind in grado di rilevare automaticamente molti bug di gestione della memoria e di threading e di profilare i programmi in dettaglio.

  • ! exploitable (pronunciato "bang exploitable") è un'estensione di debug di Windows (Windbg) che fornisce un'analisi automatica degli arresti anomali e valutazione del rischio di sicurezza. Lo strumento innanzitutto crea gli hash per determinare l'univocità di un arresto anomalo e assegna quindi una valutazione di vulnerabilità allo schianto: Exploitable, Probable Exploitable, Probably Not Exploitable o Unknown.

risposta data 21.02.2013 - 12:54
fonte
2

Di solito uso il fuzzing per identificare vulnerabilità nel software con o senza il codice sorgente. La tecnica fuzzing consiste nel manipolare gli input di un'applicazione in modo semi-automatico per produrre errori che dovrai studiare in seguito utilizzando un debugger o ispezionando il codice sorgente.

Ad esempio, è possibile programmare un fuzzer per il formato PDF e utilizzarlo per generare file PDF non validi e aprirli con il software che si suppone non riuscirà correttamente quando legge file PDF non conformi.

Con un fuzzer puoi testare migliaia di combinazioni diverse di input che coprono molti casi, ma è un metodo che non garantisce che non ci siano errori.

Puoi utilizzare la Peach Fuzzing Platform che è un buon framework per implementare i fuzzer e include gli strumenti per aprire automaticamente il debugger e registrare gli input quando viene trovato un errore.

    
risposta data 21.02.2013 - 13:22
fonte
0

Rilevare vulnerabilità nel codice C è hard science e rimane un problema aperto. Lo strumento più conosciuto per questo è ancora il cervello umano. Questa è chiamata recensione del codice . Questo tipo di cose funzionano è che ti occupi di mettere l'onere della prova sullo sviluppatore.

In effetti, la situazione comune è che lo sviluppatore ha prodotto il codice, quindi il revisore cerca di dare un senso a questo. Ma lo sviluppatore non aggiusterà nulla finché il revisore dimostrerà una vulnerabilità. Questo è ciò che accade in molti progetti software in cui i "recensori" sono "Internet in generale" e il fornitore di software propone una patch solo quando è stato trovato e pubblicato un vero e proprio exploit. Questo è abbastanza insoddisfacente.

Invece, chiedi allo sviluppatore di scrivere codice chiaro con molti commenti, in modo che un revisore con accesso al codice sorgente possa capire cosa fa il codice, e vedere perché i buffer non sono ovviamente sovrasfruttati. In queste condizioni la revisione del codice può essere efficiente, soprattutto perché costringe lo sviluppatore a avere una visione chiara del proprio compito.

Strumenti dinamici come Valgrind sono grandiosi come strumenti di debug, ma non così grandi nel rilevare potenziali vulnerabilità. Ti diranno se si è verificato un overflow del buffer durante i test , non se un potrebbe essersi verificato con dati di input diversi .

C è una lingua difficile perché devi pensare a tutto. Una fonte comune di buffer overflow in C è la gestione delle stringhe di caratteri, poiché C non ha stringhe di caratteri che valgono quel nome, solo una matrice di caratteri con la convenzione di uno zero terminale. Altri linguaggi di programmazione offriranno stringhe reali che possono essere concatenate e divise e condivise come se fossero semplici interi; tali stringhe evitano un sacco di buffer overflow semplicemente essendo molto più semplici da usare. Di couse, le stringhe semplici da usare richiedono una sorta di gestione automatica della memoria, che sia un garbage collector o conteggio dei riferimenti (in una certa misura, C ++ può fare il conteggio dei riferimenti per le stringhe, ma è comunque necessario riconvertire in array di caratteri quando si interagisce con il sistema operativo).

Nessuna delle risposte precedenti si applica direttamente al problema di rilevamento delle vulnerabilità nelle applicazioni esistenti. Mostra solo che il tuo compito è difficile . Si può dimostrare che è impossibile in tutte le generalità (non si possono mai rilevare automaticamente le vulnerabilità tutte ).

    
risposta data 21.02.2013 - 13:27
fonte
0

Puoi sempre provare a decompilare i programmi, ma il risultato può variare notevolmente, quindi se lo strumento dovrebbe funzionare almeno semiautomaticamente, immagino che ciò che stai chiedendo sia fuzzing , almeno per codice già compilato questo è un modo.

Non sono sicuro del motivo per cui proverai a fare analisi dinamiche, ma se hai il codice, ti consiglio di dare un'occhiata a analisi statica .

EDIT: Viene in mente, anche una scienza difficile, consultare gli articoli su Modellazione e ragionamento supportati dal computer. La prova del tuo codice è corretta invece di trovare errori potrebbe essere qualcosa che vale la pena esaminare per te.

    
risposta data 21.02.2013 - 12:52
fonte

Leggi altre domande sui tag