Frage:
Muss man ein guter Programmierer sein, um eine sichere Quellcode-Analyse durchzuführen?
Krishna Pandey
2015-11-25 00:15:00 UTC
view on stackexchange narkive permalink

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?

Er kann keine gründliche Überprüfung des sicheren Codes durchführen, wenn er die Sprachen nicht kennt, in denen der zu überprüfende Code geschrieben wurde.
Bitte schreiben Sie nicht in die dritte Person: P.
Können Sie alle Exploits unter http://www.underhanded-c.org/ abfangen und verstehen (die ziemlich kurz sind und ausführlich erklärt werden)? Das ist eine Sprache.
@drewbenn - Schöne Website, die Sie erwähnt haben. # NᴏᴠɪᴄᴇIɴDɪsɢᴜɪsᴇ :)
@drewbenn Ein weiteres gutes Beispiel ist http://escape.alf.nu/ - es ist unglaublich schwierig, XSS durch Desinfektion zu verhindern. Bei den meisten Aufgaben müssen Sie genau wissen, wie JavaScript und HTML funktionieren und interagieren.
"Um den Code eines anderen zu verstehen, muss man doppelt so gut sein wie beim Schreiben von Grund auf neu."
Wenn das Thema der «Überprüfung des sicheren Codes» nicht mehrere Programmiersprachen abdeckt, muss diese Person auch nicht viele Programmiersprachen beherrschen, nur um dies zu erreichen. Es sollte ausreichen, die in der Anwendung verwendeten Sprachen zu kennen.
Selbst ein guter Programmierer zu sein, reicht wahrscheinlich nicht aus, um eine gründliche Analyse des sicheren Codes gegen Code durchzuführen, der absichtlich versucht, etwas zu verschleiern. Man muss ein großartiger und geduldiger Programmierer sein.
Ist der zu untersuchende Code möglicherweise in Brainf * ck geschrieben? Ich würde es in diesem Fall nicht wagen, eine korrekte Implementierung auch nur von Fakultät zu erkennen
Es ist zu bedenken, dass ein Großteil dieser Arbeit unglaublich langwierig ist und es für viele "KMU" schwierig ist, ihre Aufmerksamkeit auf die Themen zu lenken. Auf dem Gebiet gibt es ausreichend Platz für Menschen, die zwar keine Einsteins sind, aber methodisch und sehr detailliert arbeiten und möglicherweise dazu beitragen, die Arbeit anderer "Experten" zu koordinieren.
Sieben antworten:
Cort Ammon
2015-11-25 03:11:04 UTC
view on stackexchange narkive permalink

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!)

Kommentare sind nicht für eine ausführliche Diskussion gedacht. Diese Konversation wurde [in den Chat verschoben] (http://chat.stackexchange.com/rooms/32179/discussion-on-answer-by-cort-ammon-does-one-need-to-be-a-good- Programmierer-zu-Perf).
Ja. Ich sollte beachten, dass ein Analyst ohne Kenntnis der Sprache möglicherweise nicht einmal weiß, was der Programmierer tut (geschweige denn alle Sicherheitsprobleme finden kann) oder warum. Einige Sprachen haben einige sehr interessante Funktionen, die nicht offensichtlich sind, wenn Sie die Sprache nicht gut kennen. Hoffentlich hätten die meisten derartigen Kommentare Kommentare für den Analysten, aber ich würde mich nicht vollständig auf Kommentare verlassen, die Sie leiten.
Diese Art von Verhalten eines Compilers lässt mich immer wieder fragen: Angesichts der Tatsache, dass der Compiler * weiß *, dass es undefiniertes Verhalten gibt und dass undefiniertes Verhalten zu 100% in Ihrem Code nicht gewünscht ist, konnte der Compiler dies nicht warnen, wenn Sie so etwas tun? Dies könnte Tonnen von Fehlern verhindern ....
@Bakuriu: In C ++ treten solche "nicht vorkommenden" Fälle routinemäßig auf, ohne dass ein Fehler vorliegt, wenn Vorlagen spezialisiert oder Inline-Funktionsaufrufe mit konstanten Parametern optimiert werden - und in diesen Fällen kann die Optimierung für die Leistung von entscheidender Bedeutung sein. Für einen Compiler wäre es ziemlich schwierig, zuverlässig zwischen "Programmierer hat etwas Undefiniertes geschrieben" und "Programmierer hat eine gültige generische Funktion auf eine gültige Weise verwendet, für die ich besseren Code als den generischen Fall generieren kann" zu unterscheiden und Warnungen nur im ersteren Fall zu melden .
Mark Buffalo
2015-11-25 00:34:21 UTC
view on stackexchange narkive permalink

Ich denke, Sie müssen ein guter Programmierer sein, um erfolgreich zu sein, daher 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 zum Schritt Durch Code zu sehen, wie es funktioniert und wie es 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 auf Schwachstellen zeigen und klicken und nach diesen suchen Mit Ihren Scannern und Toolkits wird es im großen Stil 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 können eine gute Bewertung abgeben. 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.

Beachten Sie auch, dass Scanner nur nach bekannten Schwachstellen / Angriffsvektoren suchen
John Deters
2015-11-25 00:34:41 UTC
view on stackexchange narkive permalink

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 den Code lesen können, aber das bedeutet nicht, dass er als Schiedsrichter qualifiziert ist Codesicherheit.

Steffen Ullrich
2015-11-25 01:30:12 UTC
view on stackexchange narkive permalink

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 Vertiefte Kenntnisse der spezifischen Programmiersprache.

Sprachspezifische Sicherheitsprobleme wie Pufferüberläufe, Fehler nacheinander, Behandlung von Unicode oder \ 0 , Probleme, die durch verursacht werden Die Größe der Datentypen und der signierten oder nicht signierten Datentypen usw. wird nicht ermittelt, wenn der Tester keine tieferen Kenntnisse der Sprache, der schlechten Praktiken und der typischen sprachspezifischen Unsicherheitsmuster hat. Nehmen Sie als Beispiel die Geschichte der Java-Schwachstellen, bei denen nicht einmal die Entwickler von Java-Experten 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 von Die Sprachinternalen haben die Fehler festgestellt.

Stone True
2015-11-25 09:04:12 UTC
view on stackexchange narkive permalink

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 ebenfalls erforderlich mit Skriptsprachen wie JavaScript, die den Code auf hoher Ebene in CPU-Anweisungen und Speicherzuordnung interpretieren. Leider wäre diese Bewertung plattformabhängig. Siehe zum Beispiel unter https://en.m.wikipedia.org/wiki/Interpreted_language.

Dies ist die wahre Antwort. Vor 15 Jahren haben Sicherheitsexperten Fehler gefunden, Exploits geschrieben, Artikel über neue Techniken geschrieben usw. Jetzt werden sie nur noch "zertifiziert", werfen ein paar Begriffe herum, die sie möglicherweise nur auf konzeptioneller Ebene verstehen (z. B. Pufferüberlauf, haben Sie jemals geschrieben eine?), und denken, sie sind die gleichen wie die Pionier-Hacker. Zwei völlig unterschiedliche Ballspiele. Das Bestehen einer Werkzeugprüfung ist nicht gleichbedeutend mit Sicherheit. Weder überlebt ein Fuzzer.
Nicht wahr, wenn Sie sich auf viele moderne Sprachen wie Java und JavaScript konzentrieren.
@NeilSmithline In diesen Fällen ist es sogar noch schlimmer, denn wie es auf der CPU ausgeführt wird, hängt jetzt davon ab, auf welcher CPU es ausgeführt wird (und im Fall von JavaScript, in welchem ​​Interpreter es ausgeführt wird).
@NeilSmithline - Ich glaube, Sie müssen noch verstehen, wie die Skriptsprachen wie JavaScript den Code auf hoher Ebene in CPU-Anweisungen und die Speicherzuordnung interpretieren, um mit Sicherheit sagen zu können, dass ein bisschen Code sicher ist. Leider wäre diese Bewertung plattformabhängig.
Hmm ... Es scheint mir nicht so, aber offensichtlich stimmen andere dir zu.
@NeilSmithline - Bearbeitete Antwort, um einen Link zum Betrieb von interpretierten / Skriptsprachen bereitzustellen.
@horsehair und vor 15 Jahren gab es im übertragenen Sinne 3 Sicherheitsexperten, die einen Monat menschlicher Zeit mit einem Fehler verbrachten, und jetzt finden Zehntausende innerhalb von Minuten Dutzende von Fehlern. Fortschritte bei automatisierten Tools, die auf früheren Arbeiten aufbauen, die nur wenige ausführen konnten, aber viele verwenden können, und die auf den Schultern von Riesen stehen. Unglaublich nützlich und die Welt sehr verbesserend. Zitieren Sie für Ihre abweisende Niederlage * und denken Sie, sie sind die gleichen wie die Pionier-Hacker *. Wer denkt das konkret und woher weißt du das?
@TessellatingHeckler - Vor 15 Jahren haben mehr als 3 Sicherheitsexperten den Code überprüft. Bereits 1998 überprüften Hunderte sehr junger Programmierer Code und erfanden Dinge wie Ganzzahlüberläufe (im Zusammenhang mit Sicherheits-Exploits), während sich die Sicherheitsexperten des Unternehmens (zu dieser Zeit) weitgehend auf unzureichende Tools stützten. Ich war in meiner Jugend mit einigen dieser Gruppen beschäftigt. Ihr Punkt über Zehntausende von Menschen, die jetzt Fehler finden, ist relevant. Moderne Bug-Jäger sind Programmierer, nicht nur "zertifizierte Sicherheitsexperten", und viele verbringen ihre Zeit damit, Code zu überprüfen.
@TessellatingHeckler - In den "alten Zeiten" haben die Leute den Code geprüft, weil sie daran interessiert waren (manchmal aus weniger als ehrlichen Gründen). Die berühmte Sicherheitsanfälligkeit über Pufferüberlauf wurde von aleph one erläutert in seiner berühmten Zeitung in Phrack, obwohl "Hacker" vorher bekannt war. Der Unterschied zwischen damals und heute besteht darin, dass sich die Menschen damals für Sicherheit interessierten, weil sie sie (im Großen und Ganzen) liebten. Jetzt schauen sich viele Menschen die Gehälter an, lassen sich zertifizieren und bekommen einen Sicherheitsjob. Nicht die gleiche Motivation oder Fähigkeitsstufe. Ausnahmen bestehen.
Jon Hanna
2015-11-25 17:58:54 UTC
view on stackexchange narkive permalink

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

Nein.

Kann er eine Leistung erbringen? Sichere Codeüberprüfung ohne Kenntnis mehrerer Programmiersprachen und Beherrschung dieser?

Nein.

Programmierung beinhaltet 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 einer Sicherheitsperspektive (oder einer anderen Qualität) analysieren zu können.

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

Also nach dir, Beherrschung der Sprache =?
@K.P. Entschuldigung, ich folge dir nicht.
Mein Verständnis ist, dass die Beherrschung der Sprache jemanden zu einem guten Programmierer machen sollte. ist das nicht so?
Kaum. Sie könnten jede Nuance einer Sprache kennen und nicht gut in Design, Problemlösung, Algorithmusauswahl, invarianter Definition, Testentwicklung oder dem größten Teil des Debuggens sein. Die Beherrschung der Sprache ist sicherlich wichtig, aber nicht das Wichtigste. In der Tat vielleicht weniger für die Programmierung als für die Quellanalyse (ein Programmierer, der eine bestimmte Funktion nicht kennt, kann das Problem auf andere Weise angreifen, jemand, der ein Programm analysiert, der eine bestimmte Funktion, die tatsächlich verwendet wurde, nicht kennt, sollte es besser lernen in der Lage sein, die Auswirkungen zu analysieren).
Designwissen wird wahrscheinlich auch benötigt, da Schwachstellen manchmal eher in einem schlechten Design als in einer fehlerhaften Implementierung liegen können.
@reirab Ich würde sagen, dass alle Fähigkeiten eines Programmierers für die Analyse hilfreich wären, aber wenn Design einen Fehler erkennen kann, sind andere Fähigkeiten erforderlich, als wenn man sich für das beste Design entscheiden kann (wie das Kritisieren und Produzieren von Kunst). Aber in der Lage zu sein, eine Eigenart in einem Sprachverhalten zu bemerken, ist für die Analyse wichtiger als das Schreiben.
Ein guter Programmierer muss in der Lage sein, alle Bits zusammenzufügen, um eine funktionierende Anwendung zu erstellen. Das brauchen Sie für die Sicherheitsanalyse nicht. Als ob Sie kein Auto bauen müssen, um zu überprüfen, ob es sicher zu fahren ist. Sie können überprüfen, ob eine Anwendung sicher ist, ohne selbst eine sichere Anwendung erstellen zu können. Sie können ein guter Richter in einem Schönheitswettbewerb sein, während Sie selbst hässlich sind.
@gnasher729 Und natürlich können Sie überprüfen, ob eine Anwendung sicher ist, wenn Sie über die erforderlichen Fähigkeiten verfügen, um eine sichere Anwendung zu erstellen, die viele andere Kriterien erfüllt.
@JonHanna - Sie werden keine Beherrschung einer Sprache entwickeln, ohne viel Zeit damit zu verbringen, darin zu programmieren. Es würde mich überraschen, jemanden zu treffen, der eine Sprache beherrscht, aber nicht gut darin programmiert (obwohl beide mehrdeutige Begriffe sind).
@horsehair gut, sie könnten ihre Beherrschung der Sprache verbessern, indem sie vielleicht darin geschriebene Software analysieren. Für Programmierer ergibt sich sicherlich eine viel tiefere Kenntnis einer Sprache aus der Art der Analyse, die wir bei der Überprüfung von Code durchführen müssen, als beim Schreiben.
Eine vollständige Beherrschung der Sprache ist nicht erforderlich, wenn wir davon ausgehen, dass etwas, das für den Sicherheitsprüfer zu kompliziert ist, automatisch unsicher ist.
user92881
2015-11-25 16:48:20 UTC
view on stackexchange narkive permalink

Um die Gefahr von Seitenkanalangriffen richtig einzuschätzen, müssen Sie über Hardware verfügen. 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 Übermittlung 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.

Befasst sich nicht wirklich mit Programmierkenntnissen, dem Hauptpunkt der Frage.


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...