Es hängt davon ab, was unter "sicherer Quellcode-Analyse" zu verstehen ist. Man kann alles machen, was einem gefällt. Ich nehme an, das Problem ist, wenn jemand anderes nach etwas gefragt hat, das als "sichere Quellcode-Analyse" bezeichnet wird, und man sich fragt, warum man nicht dafür qualifiziert ist.
In vielen Fällen muss eine solche Analyse von durchgeführt werden ein Fachexperte (KMU). Im Endprodukt wird ein KMU eine Erklärung abgeben, in der im Wesentlichen gesagt wird: "Ich erkläre diesen Code für sicher", wobei das Verständnis eine tiefgreifendere Aussage ist als "Ich habe nach einer Reihe bekannter Muster gesucht und keine Probleme festgestellt" / p>
Wenn Sie an der authentischen Übersetzung einer chinesischen Philosophie interessiert wären, würden Sie einer Person vertrauen, die viel über Philosophie wusste und eine Reihe von Spickzettel hatte, um sie zu entziffern, aber kein Chinesisch konnte ?
Ein gutes Beispiel ist ein Fehler, der eine SQL-Engine getroffen hat. Verzeihen Sie mir, dass ich nicht den Namen des Motors oder der Version habe, damit Sie überprüfen können. Seitdem habe ich Probleme, ihn zu finden. Der Fehler war jedoch ergreifend. Der Fehler trat in Code auf, der folgendermaßen aussah:
int storeDataInCircularBuffer (Puffer * dest, const char * src, Größe_t Länge) {if (dest->putPtr + Länge < dest->putPtr) return ERROR ;; // Pufferüberlauf durch Überlauf verhindern if (dest->putPtr + Länge > dest->endPtr) {... // Daten in zwei Teile schreiben return OK; } else {... // schreibe die Daten in einen Teil return OK; }}
Dieser Code sollte Teil eines Ringpuffers sein. In einem kreisförmigen Puffer wickeln Sie sich um, wenn Sie das Ende des Puffers erreichen. Manchmal werden Sie gezwungen, die eingehende Nachricht in zwei Teile zu teilen, was in Ordnung ist. In diesem SQL-Programm befassten sie sich jedoch mit dem Fall, dass die -Länge
groß genug sein könnte, um einen Überlauf von dest->putPtr + length
zu verursachen, wodurch die Möglichkeit eines Pufferüberlaufs entsteht weil die nächste Prüfung nicht richtig funktionieren würde. Also haben sie einen Test durchgeführt: if (dest->putPtr + Länge < dest->putPtr)
. Ihre Logik war, dass die einzige Möglichkeit, wie diese Aussage jemals wahr sein könnte, darin besteht, dass ein Überlauf auftritt, sodass wir den Überlauf abfangen.
Dies führte zu einer Sicherheitslücke, die tatsächlich ausgenutzt wurde und gepatcht werden musste. Warum? Nun, ohne dass der ursprüngliche Autor es weiß, erklärt die C ++ - Spezifikation, dass der Überlauf eines Zeigers ein undefiniertes Verhalten ist, was bedeutet, dass der Compiler alles tun kann, was er will. Als der ursprüngliche Autor es testete, gab gcc tatsächlich den richtigen Code aus. Einige Versionen später hatte gcc jedoch Optimierungen, um dies zu nutzen. Es stellte sich heraus, dass es kein definiertes Verhalten gab, bei dem diese if
-Anweisung ihren Test bestehen konnte, und optimierte sie!
Also für a In wenigen Versionen hatten die Leute SQL-Server, die einen Exploit hatten, obwohl der Code explizite Überprüfungen hatte, um diesen Exploit zu verhindern!
Grundsätzlich sind Programmiersprachen sehr leistungsfähige Werkzeuge, die den Entwickler leicht beißen können. Die Analyse, ob dies eintreten wird, erfordert eine solide Grundlage in der betreffenden Sprache.
(Bearbeiten: Greg Bacon war groß genug, um eine CERT-Warnung zu diesem Thema zu erstellen: Vulnerability Note VU # 162289 C-Compiler Möglicherweise werden einige Umlaufprüfungen stillschweigend verworfen. und auch diese. Danke Greg!)