Dipende da cosa si intende per "analisi sicura del codice sorgente". Si può fare tutto ciò che si vuole. Il problema, presumo, è quando qualcun altro ha chiesto qualcosa chiamato "analisi sicura del codice sorgente" e ci si chiede perché non si è qualificati per questo.
In molti casi, tale analisi deve essere eseguita da un esperto in materia (PMI). Nel prodotto finale, una PMI fornirà una dichiarazione che sostanzialmente dice "Dichiaro che questo codice è sicuro", con una comprensione che è un'affermazione più profonda di "Ho cercato un mucchio di modelli noti e non ho trovato problemi". / p>
Se fossi interessato alla traduzione autentica di una filosofia cinese, ti fideresti di una persona che conosceva molto la filosofia e aveva un mucchio di foglietti per aiutarla a decifrarla, ma in realtà non conosceva il cinese ?
Un ottimo esempio che mi viene in mente è un bug che ha colpito un motore SQL. Perdonami se non ho il nome di quale motore o quale versione puoi verificare, ho avuto problemi a trovarlo da allora. Tuttavia, l'errore è stato toccante. L'errore era in un codice simile a questo:
int storeDataInCircularBuffer (Buffer * dest, const char * src, size_t length) {if (dest->putPtr + length < dest->putPtr) return ERROR ; // previene l'overflow del buffer causato da un overflow if (dest->putPtr + length > dest->endPtr) {... // scrive i dati in due parti return OK; } else {... // scrive i dati in una parte return OK; }}
Questo codice doveva essere parte di un buffer circolare. In un buffer circolare quando raggiungi la fine del buffer, ti avvolgi. A volte questo ti costringe a suddividere il messaggio in arrivo in due parti, il che va bene. Tuttavia, in questo programma SQL, si preoccupavano del caso in cui length
potesse essere abbastanza grande da causare un overflow di dest->putPtr + length
, creando un'opportunità per un buffer overflow perché il prossimo controllo non funzionerebbe bene. Quindi mettono in un test: if (dest->putPtr + length < dest->putPtr)
. La loro logica era che l'unico modo in cui questa affermazione potrebbe essere vera è se si è verificato un overflow, quindi rileviamo l'overflow.
Questo ha creato un buco di sicurezza che è stato effettivamente sfruttato e ha dovuto essere corretto. Perché? Bene, all'insaputa dell'autore originale, la specifica C ++ dichiara che l'overflow di un puntatore è un comportamento indefinito, il che significa che il compilatore può fare tutto ciò che vuole. Come è successo, quando l'autore originale l'ha testato, gcc ha effettivamente emesso il codice corretto. Tuttavia, alcune versioni successive, gcc ha avuto ottimizzazioni per sfruttare questo. Ha visto che non esisteva un comportamento definito in cui l'istruzione if
poteva superare il suo test e l'ha ottimizzata!
Quindi, per un poche versioni, le persone avevano server SQL che avevano un exploit, anche se il codice aveva controlli espliciti per prevenire tale exploit!
Fondamentalmente i linguaggi di programmazione sono strumenti molto potenti che possono mordere lo sviluppatore con facilità. Analizzare se ciò accadrà richiede una solida base nella lingua in questione.
(Modifica: Greg Bacon è stato abbastanza bravo da trovare un avviso CERT su questo: Nota sulla vulnerabilità VU # 162289 Compilatori C potrebbe ignorare silenziosamente alcuni controlli avvolgenti. e anche questo correlato. Grazie Greg!