Richtlinien für das Verfassen von sicherem Code

Im Folgenden werden Richtlinien für das Verfassen von sicherem Code vorgestellt.

Erforderlich

  • Verwenden Sie Codeanalysetools.

    Visual Studio Premium enthält Codeanalysetools, mit denen Sicherheitsprobleme im Code sehr viel leichter aufzufinden sind. Das Aufspüren von Problemen ist mit diesen Tools sehr viel effizienter und mit weniger Aufwand verbunden. Weitere Informationen finden Sie in einem der folgenden Themen:

  • Führen Sie eine Sicherheitsüberprüfung durch.

    Das Ziel einer Sicherheitsüberprüfung besteht darin, die Sicherheit bereits veröffentlichter Produkte durch Updates zu verbessern oder sicherzustellen, dass neue Produkte erst dann veröffentlicht werden, wenn sie so sicher wie möglich sind.

    Überprüfen Sie Code nicht willkürlich. Bereiten Sie sich auf die Sicherheitsüberprüfung vor, und entwickeln Sie zunächst sorgfältig ein Bedrohungsmodell. Andernfalls besteht die Gefahr erheblicher Zeitverluste für Ihr Team. Weisen Sie dem Code, der der strengsten Sicherheitsüberprüfung unterzogen werden soll, die höchste Priorität zu, und legen Sie fest, welche Sicherheitsprobleme berücksichtigt werden sollen.

    Legen Sie genau fest, worauf bei der Sicherheitsüberprüfung zu achten ist. Wenn Sie nach bestimmten Problemen Ausschau halten, finden Sie diese normalerweise auch. Überprüfen Sie dies noch intensiver, wenn das Team in einem Bereich zahlreiche Sicherheitsfehler findet. Dies gibt wahrscheinlich ein Architekturproblem an, das behoben werden muss. Werden keine Sicherheitsprobleme gefunden, bedeutet dies normalerweise, dass die Sicherheitsüberprüfung nicht ordnungsgemäß durchgeführt wurde.

    Führen Sie die Sicherheitsüberprüfung im Rahmen der Stabilisierung für jeden Meilenstein oder einer vom Management vorgegebenen Initiative zur Verstärkung der Sicherheit in der Produktlinie durch.

  • Verwenden Sie eine Prüfliste für die Sicherheitsüberprüfung des Codes.

    Unabhängig von Ihrer Aufgabe im Softwareentwicklungsteam sollten Sie eine Prüfliste zur Hand haben, nach der Sie vorgehen können, um sicherzustellen, dass Entwurf und Code gewissen Mindestanforderungen genügen.

  • Überprüfen Sie alle Benutzereingaben.

    Wenn Sie in Ihrer Anwendung direkt oder indirekt Benutzereingaben zulassen, müssen diese vor der Verwendung überprüft werden. Es gibt immer wieder böswillige Benutzer, die versuchen, durch ungültige Eingaben Fehler in der Anwendung herbeizuführen. Die oberste Regel für Benutzereingaben lautet: Jede Eingabe ist ungültig, solange nicht das Gegenteil bewiesen ist.

    Gehen Sie bei der Verwendung regulärer Ausdrücke zur Überprüfung von Benutzereingaben mit größter Vorsicht vor. Bei komplexen Ausdrücken wie E-Mail-Adressen kann es leicht passieren, dass Sie glauben, eine vollständige Validierung durchzuführen, wenn dies tatsächlich nicht der Fall ist. Lassen Sie alle regulären Ausdrücke von Ihren Kollegen überprüfen.

  • Unterziehen Sie alle Parameter exportierter und öffentlicher Anwendungsprogrammierschnittstellen (Application Programming Interface, API) einer strengen Validierung.

    Stellen Sie sicher, dass alle Parameter exportierter und öffentlicher APIs gültig sind. Hierzu zählen auch Eingaben, die zwar konsistent zu sein scheinen, aber außerhalb des gültigen Wertebereichs liegen, z. B. Größen umfangreicher Puffer. Verwenden Sie zum Überprüfen der Parameter exportierter APIs keine Assertionen, da diese im Releasebuild entfernt werden.

  • Verwenden Sie die Windows-Kryptografie-APIs.

    Programmieren Sie keine eigene Kryptografiesoftware, sondern verwenden Sie stattdessen die Kryptografie-API von Microsoft. Wenn Sie die Kryptografie-API von Microsoft verwenden, können Sie sich vollständig auf die Erstellung von Anwendungen konzentrieren. Bedenken Sie, dass die Verschlüsselung ein paar Probleme sehr effektiv löst und häufig auf eine Weise eingesetzt wird, für die sie ursprünglich nicht entwickelt wurde. Weitere Informationen finden Sie in der MSDN Library unter Cryptography Reference.

Vermeiden

  • Pufferüberläufe.

    Zu einem Überlauf eines statischen Puffers kommt es, wenn ein im Stapel deklarierter Puffer dadurch überschrieben wird, dass Daten kopiert werden, deren Größe die Puffergröße übersteigt. Im Stapel deklarierte Variablen befinden sich neben der Rückgabeadresse für den Aufrufer der Funktion. Pufferüberläufe können auch im Heap auftreten, und diese sind ebenso gefährlich. Hier liegt die Ursache i. d. R. darin, dass ungeprüfte Benutzereingaben an eine Funktion, z. B. strcpy übergeben werden. Dies führt dazu, dass die Rückgabeadresse für die Funktion durch eine vom Angreifer gewählte Adresse überschrieben wird. Pufferüberläufe lassen sich größtenteils durch die Entwicklung robuster Anwendungen verhindern.

  • Assertionen zur Überprüfung externer Eingaben.

    Assertionen werden in Verkaufsversionen nicht kompiliert. Verwenden Sie keine Assertionen, um externe Eingaben zu überprüfen. Alle Parameter für exportierte Funktionen und Methoden, jegliche Benutzereingaben sowie alle Datei- und Socketdaten müssen sorgfältig auf ihre Gültigkeit überprüft und bei Fehlern abgelehnt werden.

  • Hartcodierte Paare aus Benutzer-ID und Kennwort.

    Verwenden Sie keine hartcodierten Kennwörter. Ändern Sie das Installationsprogramm so, dass der Administrator bei der Erstellung integrierter Benutzerkonten zur Eingabe sicherer Kennwörter für alle Konten aufgefordert wird. Auf diese Weise bleibt die Sicherheit der Produktionssysteme des Kunden gewahrt.

  • Verwendung der Verschlüsselung zur Lösung aller Sicherheitsprobleme.

    Die Verschlüsselung löst einige Probleme sehr effektiv und wird häufig auf eine Weise eingesetzt, für die sie ursprünglich nicht entwickelt wurde.

  • Kanonische Dateipfade und URLs.

    Vermeiden Sie Situationen, in denen der Speicherort einer Datei oder eine URL wichtig ist. Verwenden Sie anstelle von Regeln, die auf kanonischen Dateinamen basieren, Dateisystem-ACLs.

Empfohlen

  • Überprüfen Sie die Anwendung auf alle Sicherheitsmängel, die früher bereits aufgetreten sind.

    Informieren Sie sich über Fehler, die Ihnen in Bezug auf die Sicherheit früher unterlaufen sind. Häufig wird Code nach immer demselben Muster geschrieben. Aus diesem Grund kann ein Problem in Code, der von einer Person geschrieben wurde, auch an anderen Stellen in Code auftreten, der von anderen Personen geschrieben wurde.

  • Überprüfen Sie alle Fehlerpfade.

    Der Code in Fehlerpfaden wird häufig nicht gründlich getestet, und daher werden nicht alle Objekte wie Sperren oder belegter Arbeitsspeicher bereinigt. Überprüfen Sie diese Pfade sorgfältig, und erstellen Sie bei Bedarf Tests durch Einfügen von Fehlern, um den Code auszuführen. Weitere Informationen finden Sie in der MSDN Library unter "Design Guidelines for Secure Web Applications" und "Architecture and Design Review for Security", jeweils im Abschnitt zur Eingabevalidierung.

Nicht empfohlen

  • Administratorrechte für die Ausführung der Anwendung.

    Anwendungen sollten mit möglichst eingeschränkten Rechten ausgeführt werden. Wenn ein böswilliger Benutzer eine Sicherheitslücke findet und Code in den Prozess einfügt, wird dieser bösartige Code mit derselben Berechtigung ausgeführt wie der Hostprozess. Wenn der Prozess mit Administratorrechten ausgeführt wird, wird auch der bösartige Code mit Administratorrechten ausgeführt. Weitere Informationen finden Sie in der MSDN Library unter Softwareentwicklung in Visual Studio .NET ohne Administratorberechtigungen.

Weitere Informationen

Erstellen von Bedrohungsmodellen