Verteidigungsprogrammierung

Verteidigungsprogrammierung ist eine Form des Verteidigungsdesigns, das beabsichtigt ist, um die ständige Funktion eines Stückes der Software trotz des unerwarteten Gebrauchs der gesagten Software zu sichern. Die Idee kann als das Reduzieren oder Beseitigen der Aussicht des Das Murphy's Gesetzes angesehen werden, das Wirkung hat. Verteidigungsprogrammiertechniken werden besonders verwendet, als ein Stück der Software schelmisch oder unachtsam zur katastrophalen Wirkung missbraucht werden konnte.

Verteidigungsprogrammierung ist eine Annäherung, um Software und Quellcode zu verbessern, in Bezug auf:

  • Allgemeine Qualität - das Vermindern der Anzahl von Softwareprogrammfehlern und Problemen.
Wenn er
  • den Quellcode verständlich macht - sollte der Quellcode lesbar und verständlich sein, so wird es in einer Coderechnungskontrolle genehmigt.
  • Das Lassen die Software sich auf eine voraussagbare Weise trotz unerwarteter Eingänge oder Benutzerhandlungen benehmen.

Sichere Programmierung

Verteidigungsprogrammierung wird manchmal sichere Programmierung durch Computerwissenschaftler genannt, die feststellen, dass diese Annäherung Programmfehler minimiert. Softwareprogrammfehler können durch einen Kräcker für eine Codeeinspritzung, Angriff der Leugnung des Dienstes oder anderen Angriff potenziell verwendet werden.

Ein Unterschied zwischen Verteidigungsprogrammierung und normalen Methoden ist, dass wenige Annahmen vom Programmierer gemacht werden, der versucht, alle möglichen Fehlerstaaten zu behandeln. Kurz gesagt, der Programmierer nimmt nie einen besonderen Funktionsanruf an, oder Bibliothek, wird wie angekündigt, arbeiten, und behandelt ihn so im Code. Ein Beispiel folgt:

Rotforelle str [1000+1];//ein mehr für den ungültigen Charakter

//...

strcpy (str, Eingang);//hat Kopie eingegeben

//...

} </Quelle>

Die Funktion wird abstürzen, wenn der Eingang mehr als 1000 Charaktere ist. Viele Hauptströmungsprogrammierer können nicht finden, dass das ein Problem ist, angenommen, dass kein Benutzer in solch einen langen Eingang eingehen wird. Ein Programmierer, der Verteidigungsprogrammierung übt, würde den Programmfehler nicht erlauben, weil, wenn die Anwendung einen bekannten Programmfehler enthält, Das Murphy's Gesetz diktiert, dass der Programmfehler im Gebrauch vorkommen wird. Dieser besondere Programmfehler demonstriert eine Verwundbarkeit, die Pufferüberschwemmungsgroßtaten ermöglicht. Hier ist eine Lösung dieses Beispiels:

Rotforelle str [1000];

memset (str, 0, sizeof (str));//initialisieren die Schnur NUL Charaktere

//...

strncpy (str, Eingang, sizeof (str) - 1);//Kopie-Eingang, immer Zimmer für einen NUL Charakter verlassend

//...} </Quelle>

Techniken

Hier sind einige Verteidigungsprogrammiertechniken:

Intelligenter Quellcodewiedergebrauch

Wenn vorhandener Code geprüft und bekannt wird zu arbeiten, kann das Wiederverwenden davon die Chance von Programmfehlern reduzieren, die vorstellen werden.

Jedoch ist das Wiederverwenden des Codes nicht immer eine gute Praxis besonders, wenn Geschäftslogik beteiligt wird. Wiedergebrauch kann in diesem Fall ernste Geschäftsprozess-Programmfehler verursachen.

Vermächtnis-Probleme

Vor dem Wiederverwenden alten Quellcodes, Bibliotheken, APIs, Konfigurationen und so weiter, muss es betrachtet werden, ob die alte Arbeit für den Wiedergebrauch gültig ist, oder wenn es wahrscheinlich für Vermächtnis-Probleme anfällig sein wird.

Vermächtnis-Probleme sind innewohnende Probleme, wenn, wie man erwartet, alte Designs mit heutigen Voraussetzungen besonders arbeiten, als die alten Designs nicht entwickelt oder mit jenen Voraussetzungen im Sinn geprüft wurden.

Viele Softwareprodukte haben Probleme mit dem alten Vermächtnis-Quellcode zum Beispiel erfahren:

  • Vermächtnis-Code darf unter einer Verteidigungsprogrammierinitiative nicht entworfen worden sein, und könnte deshalb von viel niedrigerer Qualität sein als kürzlich bestimmter Quellcode.
  • Vermächtnis-Code kann geschrieben und unter Bedingungen geprüft worden sein, die nicht mehr gelten. Die alten Qualitätssicherungstests können keine Gültigkeit mehr haben.
  • Beispiel 1: Vermächtnis-Code kann für den ASCII-Eingang entworfen worden sein, aber jetzt ist der Eingang UTF-8.
  • Beispiel 2: Vermächtnis-Code kann kompiliert und auf 32-Bit-Architekturen geprüft worden sein, aber wenn kompiliert, auf 64-Bit-Architekturen können neue arithmetische Probleme (z.B ungültige Signedness-Tests, ungültige Typ-Würfe, usw.) vorkommen.
  • Beispiel 3: Vermächtnis-Code kann für Off-Linemaschinen ins Visier genommen worden sein, aber wird verwundbar, sobald Netzkonnektivität hinzugefügt wird.
  • Vermächtnis-Code wird mit neuen Problemen im Sinn nicht geschrieben. Zum Beispiel wird 1990 geschriebener Quellcode wahrscheinlich für viele Codespritzenverwundbarkeit anfällig sein, weil die meisten solche Probleme damals nicht weit verstanden wurden.

Bemerkenswerte Beispiele des Vermächtnis-Problems:

  • BINDEN SIE 9, präsentiert von Paul Vixie und David Conrad, weil "BINDv9 ein ganzer ist, schreiben um" "War Sicherheit eine Schlüsselrücksicht im Design" *, Sicherheit, Robustheit, Skalierbarkeit und neue Protokolle nennend, weil Schlüssel betrifft, um alten Vermächtnis-Code umzuschreiben.
  • Windows von Microsoft hat unter Windows Metafile Verwundbarkeit und andere mit dem WMF-Format verbundene Großtaten ertragen. Sicherheitsansprechzentrum von Microsoft beschreibt die WMF-Eigenschaften als "1990, WMF Unterstützung wurde hinzugefügt... Das war eine verschiedene Zeit mit der Sicherheitslandschaft... wurden alle" * völlig vertraut, unter den Sicherheitsinitiativen an Microsoft nicht entwickelt.
  • Orakel bekämpft Vermächtnis-Probleme wie alter Quellcode, der geschrieben ist, ohne Sorgen der SQL Einspritzung und Vorzug-Eskalation zu richten, auf viele Sicherheitsverwundbarkeit hinauslaufend, der Zeit in Anspruch genommen, um zu befestigen, und auch unvollständige üble Lagen erzeugt hat. Das hat schwere Kritik von Sicherheitsexperten wie David Litchfield, Alexander Kornbrust, Cesar Cerrudo (1,2,3) verursacht. Eine zusätzliche Kritik besteht darin, dass Verzug-Installationen (größtenteils ein Vermächtnis von alten Versionen) nach ihren eigenen Sicherheitsempfehlungen wie Orakel-Datenbanksicherheitscheckliste nicht ausgerichtet werden, die hart ist sich zu bessern, weil viele Anwendungen verlangen, dass die weniger sicheren Vermächtnis-Einstellungen richtig fungieren.

Sicherer Eingang und das Produktionsberühren

Canonicalization

Kräcker werden wahrscheinlich neue Arten von Darstellungen von falschen Daten erfinden.

Zum Beispiel, wenn Sie überprüft haben, ob eine gebetene Datei nicht "/etc/passwd" ist, könnte ein Kräcker eine andere Variante dieses Dateinamens wie "/etc/./passwd" passieren.

Um Programmfehler wegen des nichtkanonischen Eingangs zu vermeiden, verwenden Sie canonicalization APIs.

Niedrige Toleranz gegen "potenzielle" Programmfehler

Nehmen Sie an, dass Codekonstruktionen, die scheinen, anfälliges Problem zu sein (ähnlich der bekannten Verwundbarkeit, usw.) Programmfehler und potenzielle Sicherheitsfehler sind. Die Grundregel des Daumens ist: "Ich bin aller Typen von Sicherheitsgroßtaten nicht bewusst. Ich muss gegen diejenigen schützen ich weiß wirklich davon, und dann muss ich proaktiv sein!".

Andere Techniken

  • Eines von den meisten häufigen Problemen ist ungehemmter Gebrauch von Strukturen der unveränderlichen Größe und Funktionen für Daten der dynamischen Größe (das Pufferüberschwemmungsproblem). Das ist für Schnur-Daten in C besonders üblich. C Bibliotheksfunktionen wie sollte nie verwendet werden, da die maximale Größe des Eingangspuffers als ein Argument nicht passiert wird. C Bibliotheksfunktionen wie kann sicher verwendet werden, aber verlangen, dass der Programmierer mit der Auswahl an sicheren Format-Schnuren, durch das Sterilisieren davon vor dem Verwenden davon aufpasst.
  • Encrypt/authenticate alle wichtigen Daten über Netze übersandt. Versuchen Sie nicht, Ihr eigenes Verschlüsselungsschema durchzuführen, aber ein bewiesenes stattdessen zu verwenden.
  • Alle Daten, sind bis bewiesen, sonst wichtig.
  • Alle Daten, werden bis bewiesen, sonst verdorben.
  • Der ganze Code, ist bis bewiesen, sonst unsicher.
  • Sie können die Sicherheit keines Codes in userland, oder kanonischer beweisen: "Vertrauen Sie nie dem Kunden".
  • Wenn Daten für die Genauigkeit überprüft werden sollen, prüfen Sie nach, dass sie, nicht richtig sind, dass sie falsch sind.
  • Design durch den Vertrag
  • Das Design durch den Vertrag verwendet Vorbedingungen, Postbedingungen und invariants, um sicherzustellen, dass zur Verfügung gestellte Daten (und der Staat des Programms als Ganzes) sterilisiert werden. Das erlaubt Code, seine Annahmen zu dokumentieren und sie sicher zu machen. Das kann Überprüfungsargumente für eine Funktion oder Methode für die Gültigkeit vor der Durchführung des Körpers der Funktion einschließen. Nachdem der Körper einer Funktion, eine Kontrolle des Gegenstand-Staates (auf Objektorientierten Programmiersprachen) oder andere gehaltene Daten und der Rückwert vor Ausgängen (Code der Brechung/Rückkehr/Werfens/Fehlers) tuend, auch klug ist.
  • Behauptungen
  • Innerhalb von Funktionen können Sie überprüfen wollen, dass Sie in etwas nicht Verweise anbringen, was nicht gültig (d. h., ungültig ist) und diese Reihe, sind Längen gültig, bevor sie in Elementen besonders auf dem ganzen vorläufigen/lokalen instantiations Verweise anbringen. Ein heuristischer Nutzen soll den Bibliotheken nicht vertrauen, die Sie auch nicht geschrieben haben. So jede Zeit nennen Sie sie, überprüfen, was Sie von ihnen zurückbekommen. Es hilft häufig, eine kleine Bibliothek "des Erklärens" und "der Überprüfung" von Funktionen zu schaffen, das zusammen mit einem Holzfäller zu tun, so können Sie Ihren Pfad verfolgen und das Bedürfnis nach umfassenden Beseitigen-Zyklen an erster Stelle reduzieren. Mit dem Advent, Bibliotheken und Aspekt Orientierte Programmierung zu loggen, werden viele der langweiligen Aspekte der Verteidigungsprogrammierung gelindert.
  • Ziehen Sie Ausnahmen es vor, Codes zurückzugeben
  • Im Allgemeinen ist es vorzuziehend, verständliche Ausnahme-Nachrichten zu werfen, die einen Teil Ihrer API geltend machen, ziehen zusammen und führen den Kundenprogrammierer, anstatt Werte zurückzugeben, dass ein Kundenprogrammierer wahrscheinlich darauf unvorbereitet sein und folglich ihre Beschwerden und Zunahme-Robustheit und Sicherheit Ihrer Software minimieren wird.

Siehe auch

Weiterführende Literatur

  • William R. Cheswick und Steven M. Bellovin, Brandmauern und Internetsicherheit: Das Zurückschlagen der Gerissenen internationalen Hacker-Standardbuchnummer 0-201-63357-4 http://www.wilyhacker.com /

Außenverbindungen


Shevonne Durkin / Lee Armstrong
Impressum & Datenschutz