Was sollte jeder Programmierer über Sicherheit wissen? [geschlossen]


427

Ich bin ein IT-Student und bin jetzt im 3. Jahr an der Universität. Bis jetzt haben wir viele Themen im Zusammenhang mit Computern im Allgemeinen studiert (Programmierung, Algorithmen, Computerarchitektur, Mathematik usw.).

Ich bin mir sehr sicher, dass niemand alles über Sicherheit lernen kann, aber sicher, dass jeder Programmierer oder IT-Student ein "Mindestwissen" darüber wissen sollte, und meine Frage ist, was ist dieses Mindestwissen?

Können Sie einige E-Books oder Kurse vorschlagen oder irgendetwas kann helfen, mit diesem Weg zu beginnen?



118
Regel 1: Vertraue niemals den Eingaben des Benutzers. Nicht einmal, wenn es deine Großmutter ist
Anthony Forloney

2
..und dieser Thread hat auch die tollen Informationen - stackoverflow.com/questions/72394/…
Sripathi Krishnan

Meine Frage
betrifft

1
Beobachten Sie Ihre Fehlermeldungen. Während Sie benutzerfreundlich sein möchten, kann der Unterschied zwischen "Dieses Konto existiert nicht" und "Das Passwort ist ungültig" in einigen Fällen gefährlich sein.
Michael Mior

Antworten:


551

Beachten Sie die folgenden Grundsätze, wenn Sie möchten, dass Ihre Anwendungen sicher sind:

  • Vertraue niemals einer Eingabe!
  • Überprüfen Sie die Eingabe aller nicht vertrauenswürdigen Quellen - verwenden Sie Whitelists und keine Blacklists
  • Planen Sie von Anfang an Sicherheit - das können Sie am Ende nicht anbringen
  • Halten Sie es einfach - Komplexität erhöht die Wahrscheinlichkeit von Sicherheitslücken
  • Halten Sie Ihre Angriffsfläche auf ein Minimum
  • Stellen Sie sicher, dass Sie sicher versagen
  • Verwenden Sie Verteidigung in der Tiefe
  • Halten Sie sich an das Prinzip des geringsten Privilegs
  • Verwenden Sie die Bedrohungsmodellierung
  • Unterteilen - Ihr System ist also nicht alles oder nichts
  • Das Verstecken von Geheimnissen ist schwierig - und im Code verborgene Geheimnisse bleiben nicht lange geheim
  • Schreiben Sie keine eigene Krypto
  • Die Verwendung von Krypto bedeutet nicht, dass Sie sicher sind (Angreifer suchen nach einem schwächeren Glied).
  • Achten Sie auf Pufferüberläufe und wie Sie sich vor diesen schützen können

Es gibt einige ausgezeichnete Bücher und Artikel online, in denen es darum geht, Ihre Anwendungen sicher zu machen:

Trainieren Sie Ihre Entwickler in den besten Praktiken zur Anwendungssicherheit

Codebashing (bezahlt)

Sicherheitsinnovation (bezahlt)

Sicherheitskompass (bezahlt)

OWASP WebGoat (kostenlos)


+1 "Software ausnutzen: Wie man Code bricht" ist ein großartiges Buch, aber die Diashow, mit der Sie verlinkt sind, ist schrecklich.
Turm

7
Leider ist es in einem modernen System fast unmöglich, das Prinzip der geringsten Privilegien zu instanziieren. Zum Beispiel enthält der Linux-Kernel (Quelle, die ich derzeit verwende) über 9,4 Millionen Zeilen C-Code und über 400.000 Assembly-Zeilen, die alle in einem uneingeschränkten Kontext ausgeführt werden. Eine einfache (möglicherweise beabsichtigte) Fehleinschätzung in einer dieser Millionen Zeilen gefährdet das gesamte System. Vielleicht wird sich in den nächsten ein oder zwei Jahrhunderten eine Lösung ergeben, vielleicht auch nicht, da sich niemand wirklich um die Schaffung sicherer Betriebssysteme / Sprachen / Frameworks kümmert.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

1
Ich würde dieser Liste "The Web Application Hacker's Handbook" hinzufügen.
outcassed

34
Ersetzen Sie "Niemals Benutzereingaben vertrauen!" zu "Niemals einer Eingabe vertrauen!". Eingaben, die von anderer Software stammen, sollten genauso behandelt werden wie Benutzereingaben. Beispielsweise würden die meisten Benutzer bei der Protokollierung von Websites das Feld Benutzer-Agent / Browser-ID nicht als "Benutzereingabe" betrachten, aber es kann genauso einfach beispielsweise a enthalten SQL-Injektion.
Peteris

2
@ L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳ Nun, es gibt dieses experimentelle Microsoft Research-Betriebssystem (Singularity), das auf .NET basiert und auf Sicherheit als primäres Ziel abzielt (kein Pufferüberlauf, yay!). Keine gemeinsame Nutzung des Prozessspeichers, keine Selbständerung des Codes, selbst die Gerätetreiber sind nur ein weiterer softwareisolierter Prozess in .NET. Ein ziemlich interessantes Konzept, aber es wäre sehr schwierig, dies auf die Menschen zu übertragen (vor allem kann es keine Abwärtskompatibilität mit vorhandener Software oder sogar Treibern herstellen; ein bisschen wie in den ersten 10 Jahren von Linux: D).
Luaan

102

Regel Nr. 1 der Sicherheit für Programmierer: Rollen Sie nicht Ihre eigenen

Verwenden Sie immer eine gut gestaltete, gut getestete und ausgereifte Sicherheitsplattform, ein Framework oder eine Bibliothek, um die Arbeit für Sie zu erledigen, es sei denn, Sie sind selbst Sicherheitsexperte und / oder Kryptograf . Diese Dinge wurden jahrelang von Experten und Hackern gleichermaßen durchdacht, gepatcht, aktualisiert und untersucht. Sie möchten diese Vorteile nutzen und sie nicht durch den Versuch, das Rad neu zu erfinden, verwerfen.

Das heißt nicht, dass Sie nichts über Sicherheit lernen müssen. Sie müssen auf jeden Fall genug wissen, um zu verstehen, was Sie tun, und sicherstellen, dass Sie die Tools richtig verwenden. Wenn Sie jedoch jemals anfangen werden, Ihren eigenen Kryptografiealgorithmus, Ihr Authentifizierungssystem, Ihr Eingabedesinfektionsmittel usw. zu schreiben, halten Sie an, treten Sie einen Schritt zurück und erinnern Sie sich an Regel 1.


10
Dies ist meiner Meinung nach eine schlechte Regel. Sie können im Wesentlichen nur aufgrund der von Ihnen ausgewählten Plattform angesprochen werden und nicht aufgrund eines echten Interesses an Ihrem Vermögen. Denken Sie an alle Sicherheitslücken in Plattformen von Drittanbietern und an alle Produkte, die sofort anfällig sind, nur weil sie diese verwenden. Ich würde meine Sicherheit nicht so schnell einem Dritten anvertrauen.
Fosco

9
Ich denke, dies ist eine gute Regel für Crypto - das Rollen Ihrer eigenen Verschlüsselung ist ein Rezept für eine Katastrophe. Das Rollen Ihrer eigenen Blog-Engine ist jedoch möglicherweise sicherer, wie Fosco betont. Wenn Sie Ihre eigene rollen, ist es weniger wahrscheinlich, dass Sie von automatisierten Angriffen erfasst werden, mit denen WordPress-Installationen zu kämpfen haben.
James P McGrath

5
Wenn es um Krypto geht, ist diese Regel absolut korrekt. Schreiben Sie keine eigene Krypto, Punkt. Wenn es darum geht, Plattformen von Drittanbietern zu verwenden, kommt es darauf an. Einige Plattformen sind von Natur aus sicherer, einige Plattformen sind von Natur aus weniger sicher, und die meisten Plattformen bieten wahrscheinlich einige Sicherheitsfunktionen, aber auch einige bekannte Angriffsmethoden. Nehmen Sie die jüngste Rails-Sicherheitslücke, die eine Sicherheitslücke bei github verursacht hat . Zweifellos bietet Rails viele Sicherheitsfunktionen, aber auch einige leistungsstarke Funktionen mit unsicheren Standardeinstellungen.
Michael Kopinsky

7
Wenn es um Krypto geht, rollen Sie nicht Ihre eigenen - sondern verstehen Sie, was Sie verwenden. Wenn Sie nicht verstehen, warum die Verwendung des gleichen Verschlüsselungsschlüssels für RC4 für zwei Nachrichten eine schreckliche Idee ist, lesen Sie diese Informationen, bevor Sie beispielsweise eine Stream-Verschlüsselung verwenden.
Christopher Creutzig

3
Selbst nach dem HeartBleed-Fehler ist dies offensichtlich eine gute Regel. Stellen Sie sich vor, wie schwierig es gewesen wäre, in einem benutzerdefinierten oder proprietären Projekt einen Heatbleed-ähnlichen Fehler zu finden. Wenn Sie Ihre eigenen rollen, verstecken Sie sich nur hinter der Dunkelheit und wissen nicht, welche Fehler ausgenutzt werden könnten.
Sqeaky

71

Jeder Programmierer sollte wissen, wie man Exploit-Code schreibt.

Ohne zu wissen, wie Systeme ausgenutzt werden, stoppen Sie versehentlich Schwachstellen. Zu wissen, wie man Code patcht, ist absolut bedeutungslos, es sei denn, Sie wissen, wie Sie Ihre Patches testen. Sicherheit ist nicht nur eine Reihe von Gedankenexperimenten, Sie müssen wissenschaftlich sein und Ihre Experimente testen.


10
Ich würde argumentieren, dass dies überhaupt nicht notwendig ist. Halten Sie sich einfach an das Prinzip: Wenn der Angreifer eine Speicherbeschädigung jeglicher Art verursachen kann, betrachten Sie sich als Eigentümer. Sie müssen nicht auf die Details des tatsächlichen Schreibens (funktionierender) Exploits eingehen.
Newgre

6
@newgre Nicht jede Sicherheitsanfälligkeit ist ein Pufferüberlauf. Das Common Weakness Enumeration-System deckt einige tausend Sicherheitslücken ab. Ein Programmierer muss den Verstand des Angreifers verstehen, sonst macht er unwissentlich Fehler.
Turm

1
Ich weiß, dass nicht jeder von ihnen ein Pufferüberlauf ist, aber alles, was normalerweise als "Exploit" bezeichnet wird, basiert auf einer Art Speicherbeschädigung: Pufferüberläufe, Double-Frees, Heap-Überläufe, ganzzahlige Überläufe, Formatzeichenfolgen usw. Natürlich gibt es auch andere Dinge wie Logikfehler, aber das war zunächst nicht das Thema dieser Antwort.
Newgre

5
@newgre Das ist eine Art von Exploit, aber heute werden mehr Exploits geschrieben, um Fehler in Webanwendungen zu beheben, als Probleme mit der Speicherbeschädigung. Exploits werden mithilfe von SQL Injection, Local File Include, CSRF und XSS geschrieben. Dies sind die häufigsten Probleme. (Quelle: Exploit-db.com )
Turm

1
Ich stimme dem zu, wenn Sie selbst Exploits schreiben können, können Sie verstehen, was einem Hacker maximal in den Sinn kommen kann!
Linuxeasy

42

Sicherheit ist ein Prozess, kein Produkt.

Viele scheinen diese offensichtliche Tatsache zu vergessen.


23

Ich empfehle, CWE / SANS TOP 25 der gefährlichsten Programmierfehler zu überprüfen . Es wurde für 2010 mit dem Versprechen aktualisiert, in Zukunft regelmäßig aktualisiert zu werden. Die Revision 2009 ist ebenfalls verfügbar.

Von http://cwe.mitre.org/top25/index.html

Die 2010 CWE / SANS Top 25 der gefährlichsten Programmierfehler sind eine Liste der am weitesten verbreiteten und kritischsten Programmierfehler, die zu schwerwiegenden Software-Schwachstellen führen können. Sie sind oft leicht zu finden und leicht auszunutzen. Sie sind gefährlich, da sie es Angreifern häufig ermöglichen, die Software vollständig zu übernehmen, Daten zu stehlen oder zu verhindern, dass die Software überhaupt funktioniert.

Die Top 25-Liste ist ein Tool für Aufklärung und Sensibilisierung, mit dem Programmierer die Art von Schwachstellen verhindern können, von denen die Softwareindustrie betroffen ist, indem allzu häufige Fehler identifiziert und vermieden werden, die auftreten, bevor Software überhaupt ausgeliefert wird. Softwarekunden können dieselbe Liste verwenden, um nach sicherer Software zu fragen. Forscher in der Software-Sicherheit können die Top 25 verwenden, um sich auf eine enge, aber wichtige Teilmenge aller bekannten Sicherheitslücken zu konzentrieren. Schließlich können Software-Manager und CIOs die Top-25-Liste als Maßstab für den Fortschritt ihrer Bemühungen zur Sicherung ihrer Software verwenden.


1
Beachten Sie, dass die vier häufigsten Fehler in dieser Liste (und auch einige andere) dieselben fehlerhaften Eingaben sind.
Chris Dodd

13

Ein guter Einstiegskurs könnte der MIT-Kurs für Computernetzwerke und Sicherheit sein . Eine Sache, die ich vorschlagen würde, ist, die Privatsphäre nicht zu vergessen. Datenschutz ist in gewisser Hinsicht eine grundlegende Grundlage für die Sicherheit und wird in technischen Kursen zum Thema Sicherheit nicht häufig behandelt. In diesem Kurs zu Ethik und Recht in Bezug auf das Internet finden Sie möglicherweise Material zum Thema Datenschutz .


Der MIT Kurs Link funktioniert nicht
AntonioCS

1
Links behoben (vorerst). Vielen Dank.
Tvanfosson


8

Die Bedeutung sicherer Standardeinstellungen in Frameworks und APIs:

  • Viele frühe Web-Frameworks sind in Vorlagen standardmäßig nicht aus HTML entkommen und hatten aus diesem Grund XSS-Probleme
  • Viele frühe Web-Frameworks machten es einfacher, SQL zu verketten, als parametrisierte Abfragen zu erstellen, die zu vielen SQL-Injection-Fehlern führten.
  • Einige Versionen von Erlang (R13B, möglicherweise andere) überprüfen standardmäßig keine SSL-Peer-Zertifikate, und es gibt wahrscheinlich viel Erlang-Code, der für SSL-MITM-Angriffe anfällig ist
  • Der XSLT-Transformator von Java ermöglicht standardmäßig die Ausführung von beliebigem Java-Code. Dadurch sind viele schwerwiegende Sicherheitslücken entstanden.
  • Mit den XML-Parsing-APIs von Java kann das analysierte Dokument standardmäßig beliebige Dateien im Dateisystem lesen. Mehr Spaß :)

5

Sie sollten über die drei A wissen. Authentifizierung, Autorisierung, Prüfung. Ein klassischer Fehler besteht darin, einen Benutzer zu authentifizieren, ohne zu prüfen, ob der Benutzer berechtigt ist, eine Aktion auszuführen, damit ein Benutzer die privaten Fotos anderer Benutzer anzeigen kann, wie es die Diaspora getan hat. Viele, viele weitere Menschen vergessen Audit. Sie müssen in einem sicheren System feststellen können, wer was wann getan hat.


1
Nicht jede Autorisierung erfordert eine Authentifizierung. "Von ABAC zu ZBAC" kontrastiert die NBAC-Zugriffskontrolle (authentifizierungsbasiert) mit Lösungen, für die keine Authentifizierung erforderlich ist. "IBAC, RBAC, ABAC und sogar CBAC - Claims Based Access Control basieren alle auf Authentifizierung ... Der Einfachheit halber werden sie in diesem Dokument als Einzellösung behandelt und diejenigen Versionen ignoriert, die Aspekte der ZBAC-Architektur implementiert haben. Sie werden zusammen als AutheNtication bezeichnet Based Access Control (NBAC). "
Mike Samuel

4
  • Denken Sie daran, dass Sie (der Programmierer) alle Teile sichern müssen, der Angreifer jedoch nur einen Knick in Ihrer Rüstung finden muss.
  • Sicherheit ist ein Beispiel für "unbekannte Unbekannte". Manchmal wissen Sie nicht, was die möglichen Sicherheitslücken sind (bis dahin).
  • Der Unterschied zwischen einem Fehler und einer Sicherheitslücke hängt von der Intelligenz des Angreifers ab.

4

Ich würde folgendes hinzufügen:

  • Wie digitale Signaturen und digitale Zertifikate funktionieren
  • Was ist Sandboxing?

Verstehen Sie, wie verschiedene Angriffsmethoden funktionieren:

  • Pufferüberlauf / -unterlauf / etc im nativen Code
  • Social Engineerring
  • DNS-Spoofing
  • Der Mann in der Mitte
  • CSRF / XSS et al
  • SQL-Injektion
  • Krypto-Angriffe (z. B. Ausnutzung schwacher Krypto-Algorithmen wie DES)
  • Programm- / Framework-Fehler (z. B. die neueste Sicherheitslücke von github )

Sie können ganz einfach für all dies googeln. Dies gibt Ihnen eine gute Grundlage. Wenn Sie Schwachstellen in Web- Apps sehen möchten, gibt es ein Projekt namens Google Gruyere , das Ihnen zeigt, wie Sie eine funktionierende Web-App ausnutzen können.


4

Wenn Sie ein Unternehmen oder eine eigene Software aufbauen, sollten Sie einfach wie ein Hacker denken. Wir wissen, dass Hacker auch nicht in allen Dingen Experten sind, aber wenn sie eine Schwachstelle finden, beginnen sie, sich damit zu beschäftigen, indem sie Informationen über alle sammeln die Dinge und schließlich Angriff auf unsere Software. Um solche Angriffe zu verhindern, sollten wir einige bekannte Regeln befolgen wie:

  • Versuchen Sie immer, Ihre Codes zu knacken (verwenden Sie Cheatsheets und googeln Sie die Dinge für weitere Informationen).
  • auf Sicherheitslücken in Ihrem Programmierfeld aktualisiert werden.
  • und wie oben erwähnt, vertraue niemals irgendeiner Art von Benutzer oder automatisierten Eingaben.
  • Verwenden Sie OpenSource-Anwendungen (die meisten Sicherheitslücken sind bekannt und behoben).

Weitere Sicherheitsressourcen finden Sie unter den folgenden Links:

Für weitere Informationen google über die Sicherheitsabläufe Ihres Anwendungsanbieters.


3
  1. Warum ist wichtig.
  2. Es geht um Kompromisse.
  3. Kryptographie ist weitgehend eine Ablenkung von der Sicherheit.

3

Für allgemeine Informationen zur Sicherheit empfehle ich dringend, Bruce Schneier zu lesen . Er hat eine Website, seinen Krypto-Gramm-Newsletter , mehrere Bücher und hat viele Interviews geführt .

Ich würde mich auch mit Social Engineering (und Kevin Mitnick ) vertraut machen .

Für ein gutes (und ziemlich unterhaltsames) Buch darüber, wie sich Sicherheit in der realen Welt auswirkt, würde ich das ausgezeichnete (wenn auch etwas veraltete) "The Cuckoo's Egg" von Cliff Stoll empfehlen .


3

Schauen Sie sich auch die OWASP Top 10-Liste an, um eine Kategorisierung aller Hauptangriffsvektoren / -schwachstellen zu erhalten.

Es ist faszinierend, über diese Dinge zu lesen. Wenn Sie lernen, wie ein Angreifer zu denken, lernen Sie, woran Sie denken müssen, wenn Sie Ihren eigenen Code schreiben.


2

Salt und Hash die Passwörter Ihrer Benutzer. Speichern Sie sie niemals im Klartext in Ihrer Datenbank.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.