it-swarm.com.de

Muss man ein guter Programmierer sein, um eine sichere Quellcode-Analyse durchzuführen?

Eine Person verfügt über gute Kenntnisse der allgemeinen Sicherheitsrisiken, kennt die Top 10-Sicherheitslücken von OWASP und verfügt über Zertifizierungen wie CEH, CISSP, OSCP usw., bei denen es sich eher um Black-Box-Tests handelt. Außerdem hat er den OWASP-Testleitfaden, den Codeüberprüfungsleitfaden usw. und die Spickzettel durchgesehen. Wird er in der Lage sein, eine sichere Codeüberprüfung durchzuführen, ohne mehrere Programmiersprachen zu kennen und diese zu beherrschen?

68
Krishna Pandey

Dies 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 einem Fachexperten (KMU) durchgeführt werden. Im Endprodukt liefert a SME) eine Erklärung mit der Aufschrift "Ich erkläre diesen Code für sicher", mit einem Verständnis, das eine tiefgreifendere Aussage ist als "Ich habe nach einer Reihe von bekannten gesucht Muster und fand keine Probleme. "

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 war in Code, der so aussah:

int storeDataInCircularBuffer(Buffer* dest, const char* src, size_t length)
{
    if (dest->putPtr + length < dest->putPtr)
        return ERROR; // prevent buffer overflow caused by overflow
    if (dest->putPtr + length > dest->endPtr) {
        ... // write the data in two parts
        return OK;
    } else {
        ... // write the data in one part
        return OK;
    }
}

Dieser Code sollte Teil eines Ringpuffers sein. Wenn Sie in einem kreisförmigen Puffer das Ende des Puffers erreichen, wickeln Sie sich um. Manchmal zwingt Sie dies dazu, die eingehende Nachricht in zwei Teile zu teilen, was in Ordnung ist. In diesem SQL-Programm befassten sie sich jedoch mit dem Fall, dass length groß genug sein könnte, um einen Überlauf von dest->putPtr + length Zu verursachen, wodurch die Möglichkeit eines Pufferüberlaufs geschaffen wurde, da die nächste Prüfung nicht funktionieren würde Recht. Also haben sie einen Test durchgeführt: if (dest->putPtr + length < 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 !

Daher hatten die Benutzer für einige Versionen 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 mit Leichtigkeit beißen können. Die Analyse, ob dies eintreten wird, erfordert eine solide Grundlage in der betreffenden Sprache.

(Bearbeiten: Greg Bacon war großartig genug, um eine CERT-Warnung zu diesem Thema zu erstellen: Vulnerability Note VU # 162289 C-Compiler können einige Wraparound-Prüfungen stillschweigend verwerfen. und auch this related Eins. Danke Greg!)

116
Cort Ammon

Ich denke, Sie müssen ein guter Programmierer sein, um erfolgreich zu sein, also würde ich empfehlen, einer zu werden. Möglicherweise fehlen Ihrem Toolkit/Scanner viele Dinge. Ich empfehle ehrlich gesagt nicht, sich vollständig auf Tools zu verlassen, die Ihren Code für Sie scannen, da sich die Exploits ständig ändern und jemand möglicherweise so codiert hat, dass der Scanner die Sicherheitslücken nicht erkennen kann.

Die Fähigkeit, Code zu durchlaufen und zu sehen, wie er funktioniert und wie er nicht funktionieren sollte, ist grundlegend, um die Softwareentwicklung zu sichern. Ein Entwickler, der sich der Sicherheitsprobleme bewusst ist, ist genau das, was Sie für die Herstellung eines soliden Produkts benötigen, und genau das, was Sie während einer Codeüberprüfung benötigen.

Ja, Sie können mit Ihren Scannern und Toolkits auf Schwachstellen zeigen und klicken und nach Schwachstellen suchen. Im großen Stil wird dies jedoch nicht sehr effektiv sein. Wissen Sie, wie viel effektiver Sie wären, wenn Sie sich den Code selbst ansehen und feststellen könnten, ob er gut oder schlecht ist? Waaaay besser.

Versuchen Sie nicht, eine sichere Codeüberprüfung zu bestehen, wenn Sie nicht wissen, was Sie tun, aber geben Sie die Idee nicht sofort auf, wenn Sie das Gefühl haben, nicht an einem Punkt zu sein, an dem Sie eine gute Überprüfung durchführen können. Ich empfehle, zu lernen, indem Sie Ihre eigenen Modellprüfungen für sicheren Code erstellen und diese einige Male durchgehen, um sicherzustellen, dass alles in Ordnung ist.

Trotzdem sollten Sie auf jeden Fall lernen, nicht nur zu codieren, sondern auch gut zu codieren.

27
Mark Buffalo

Es ist zweifelhaft, ob ein Sicherheitsexperte die Quellcode-Analyse effektiv durchführen kann, ohne auch ein erfahrener Programmierer zu sein. Viele Schwachstellen sind das Ergebnis technischer oder syntaktischer Codierungspraktiken, die auf geringfügige Weise missbraucht werden. Ein fehlendes Semikolon, ein Gleichheitszeichen anstelle eines Doppelgleichzeichens, eine Array-Grenze, die am ersten Tag doppelt definiert ist, aber eine Version in der nachfolgenden Version geändert wird, fehlende Klammern, Speicherlecks, alle haben zu Sicherheitslücken geführt. Ein erfahrener Entwickler kann diese sehen, ein Anfänger jedoch wahrscheinlich nicht.

Ihr Sicherheitsexperte sollte die Ingenieure dazu ermutigen, automatisierte Scan-Tools wie statische Code-Analysatoren, Fuzz-Tester und dynamische App-Verifizierer zu verwenden. Helfen Sie den Entwicklungsteams, die Eingabevalidierung, Injektionsangriffe und Vertrauensgrenzen zu verstehen. Bauen Sie das Bewusstsein dafür auf, dass Sicherheitsmängel angemessen priorisiert und schnell behoben werden müssen. Planen und führen Sie Pen-Tests durch. Und am wichtigsten ist, dass die Ingenieure Code-Überprüfungen der Arbeit der anderen durchführen.

Ja, der Sicherheitsexperte sollte in der Lage sein, den Code zu lesen. Dies bedeutet jedoch nicht, dass er als Schiedsrichter für die Codesicherheit qualifiziert ist.

14
John Deters

Das hängt von Ihren Erwartungen ab. Sicherheitslücken, die durch Designprobleme verursacht werden (dh fehlender CSRF-Schutz, nur rudimentäre Implementierung eines Protokolls usw.), können wahrscheinlich gefunden werden, wenn der Tester über umfassende Kenntnisse der Sicherheitskonzepte verfügt, auch wenn er nur in der Lage ist, den Codefluss ohne zu verfolgen tiefere Kenntnisse der spezifischen Programmiersprache.

Sprachspezifische Sicherheitsprobleme wie Pufferüberläufe, Fehler nacheinander, Behandlung von Unicode oder \0, Probleme, die durch die Größe der Datentypen und signierte oder nicht signierte usw. verursacht werden, werden jedoch nicht gefunden, wenn der Tester dies getan hat Keine tieferen Kenntnisse der Sprache, der schlechten Praktiken und der typischen sprachspezifischen Unsicherheitsmuster. Nehmen Sie als Beispiel die Geschichte der Java - Sicherheitslücken, bei denen nicht einmal die Java - Expertenentwickler die Löcher bemerkten, die sie in die Sandbox der Sprache gestanzt hatten, indem sie der Sprache Reflexion hinzufügten und nur externe Experten) mit einem tiefen Verständnis der Sprache Interna entdeckt die Mängel.

12
Steffen Ullrich

Die Überprüfung von sicherem Code erfordert nicht nur Kenntnisse der Hochsprache, sondern auch der Compileroptionen und der tatsächlichen Funktionsweise des Codes auf der CPU! Hochsprachen können Code effizient schreiben, da sie einen Großteil der Komplexität verbergen. Viele Fehler und Bugs verbergen sich jedoch in der Komplexität. Wie in einer anderen Antwort ausgeführt, versuchen Compiler, das Richtige zu tun, aber Sie müssen wirklich verstehen, was vor sich geht, indem Sie den Code zerlegen und ein tiefes Verständnis dafür entwickeln, wie er funktioniert.

Dieses Verständnis ist auch bei Skriptsprachen wie JavaScript erforderlich, die den Code auf hoher Ebene für CPU-Anweisungen und die Speicherzuweisung interpretieren. Leider wäre diese Bewertung plattformabhängig. Siehe zum Beispiel unter https://en.m.wikipedia.org/wiki/Interpreted_language .

3
Stone True

Muss man ein guter Programmierer sein, um eine sichere Quellcode-Analyse durchzuführen?

Nein.

Wird er in der Lage sein, eine sichere Codeüberprüfung durchzuführen, ohne mehrere Programmiersprachen zu kennen und diese zu beherrschen?

Nein.

Programmieren ist mehr als Fachwissen über die Funktionsweise verschiedener Sprachen. Dies ist eines der Dinge, die Sie benötigen, um ein guter Programmierer zu sein, und es ist auch eines der Dinge, die Sie benötigen, um Quellcode aus Sicherheitssicht (oder einer anderen Qualität) analysieren zu können.

Während Sie kein guter Programmierer sein müssen, müssen Sie die beteiligten Sprachen beherrschen.

3
Jon Hanna

Um die Gefahr von Seitenkanalangriffen richtig zu erkennen, müssen Sie die Hardware kennen. Es gibt wirklich hässliche Seitenkanalangriffe, wie das Ausführen eines nicht privilegierten Prozesses auf einem Multi-CPU-Setup parallel zu einem privilegierten Prozess, der eine Verschlüsselungs-/Entschlüsselungsaufgabe ausführt und prüft, welche gemeinsam genutzten Cache-Zeilen in welcher Art von zeitlichem Muster oder durch verschmutzt werden Timing der jeweiligen Lieferung bestimmter Mustersequenzen, die verschlüsselt werden.

Da Verschlüsselungsalgorithmen von Mathematikern und anderen Theoretikern einer intensiven Prüfung unterzogen werden, werden Seitenkanalangriffe immer wichtiger, um das Spiel wieder zu öffnen. Der Nachteil ist, dass sie für eine bestimmte Implementierung, einen bestimmten Code und eine bestimmte Hardware entwickelt werden müssen.

1
user92881