Ihre in C oder C++ geschriebene Anwendung funktioniert wie vorgesehen, also sind Sie fertig, richtig? Aber haben Sie daran gedacht, falsche Werte einzugeben? 16Gbs an Daten? Eine Null? Ein Hochkomma? Negative Zahlen, oder speziell -2^32? Denn das ist es, was die Bösewichte tun werden - und die Liste ist noch lange nicht vollständig.

Der Umgang mit Sicherheit erfordert ein gesundes Maß an Paranoia, und genau das bietet dieser Kurs: ein starkes emotionales Engagement durch viele praktische Übungen und Geschichten aus dem wirklichen Leben, um die Code-Hygiene erheblich zu verbessern. Fehler, Konsequenzen und beste Praktiken sind unser Blut, Schweiß und Tränen.

All dies wird in den Kontext von C und C++ gestellt und um Kernfragen der Programmierung erweitert, wobei die Sicherheitsfallen von in diesen Sprachen geschriebenem Code erörtert werden.

Damit Sie auf die Kräfte der dunklen Seite vorbereitet sind.

Damit nichts Unerwartetes passiert.

Nichts.

PRAKTISCHE INFO

Nehmen Sie an unserem kostenlosen Webinar um mehr zu erfahren.

  • Die Schulung 'Sicheres Kodieren in C und C++' kann auch als innerbetriebliche Schulung organisiert werden.
  • Wenn eine Schulung vor Ort nicht möglich ist, können wir eine interaktive Online-Schulung (virtuell) oder eine Hybrid-Schulung anbieten. Das Standardprogramm mit 3 Tagen Inhalt kann auch in 5 halben Tagen (von Montag bis Freitag) durchgeführt werden.
  • Sind Sie neugierig, wie Sie den Return on Investment (ROI) von Schulungen zur sicheren Codierung quantifizieren können? Sehen Sie sich diesen Artikel.

Objektiv

  • Erläutern Sie Ansätze für den Umgang mit Sicherheitsproblemen im Code;
  • Identifizieren Sie Sicherheitsschwachstellen und deren Folgen;
  • Erfahren Sie, wie Sie diese Fehler am besten vermeiden können.

Zielgruppe

Dieser Kurs richtet sich an C- und C++-Entwickler.

Standort
Startdatum
Infos zur nächsten Ausgabe
Dauer 5 aufeinanderfolgende halbe Tage
Frequenz Einmal pro Jahr
Beteiligt
Ergebnis
9.6
Preis pro Teilnehmer € 2,250 ohne MwSt.
Broschüre herunterladen

Programm

Tag 1

Grundlagen der Sicherheit

Was ist Sicherheit?

Bedrohung und Risiko

Arten von Bedrohungen für Computersysteme

Folgen von unsicherer Software

Zwänge und der Markt

Bugs, Schwachstellen und Exploits

Kategorisierung von Fehlern

  • Sieben verderbliche Königreiche
  • Gemeinsame Schwachstellenaufzählung (CWE)
  • CWE/SANS Top 25 der gefährlichsten Software-Fehler
  • SEI Cert Richtlinien für sichere Kodierung
  • Schwachstellen in der Umgebung und den Abhängigkeiten

Pufferüberlauf

x86-Assembler und Aufrufkonventionen

  • X86 Assembler Grundlagen
  • Register und Adressierung
  • Anweisungen
  • Aufrufkonventionen auf x86
  • Calling Convention - worum es geht
  • Der Stapelrahmen
  • Prolog und Epilog
  • Gestapelte Funktionsaufrufe
  • Rekursion

Pufferüberlauf auf dem Stack

  • Pufferüberlauf - Grundlagen
  • Puffer überlesen und überschreiben
  • Stapel zertrümmern
  • Ausbeutung - Entführung des Kontrollflusses
  • Übung - Pufferüberlauf 101, Wiederverwendung von Code
  • Exploitation - Einschleusen eines Shellscripts
  • Übung - Code-Injektion, BoF-Ausnutzung mit einem Shellcode
  • Pufferüberlauf auf dem Heap
  • Pufferüberlauf auf dem Heap - ein Beispiel für die Ausnutzung
  • Labor - Heap-Überlauf
  • Bewährte Praktiken bei Heap-Überläufen
  • Fallstudie - Heartbleed
  • Labor - Heartbleed
  • Zeiger-Täuschungsmanöver
  • Zeiger-Manipulation
  • Schreib-was-wo
  • Modifizierung von Sprungtabellen
  • Entführung von GOT und RELRO Schutz
  • Überschreiben von Funktionszeigern
  • Übung - Überschreiben einer virtuellen Funktionstabelle
  • Einige typische Fehler, die zu BoF führen
  • Off-by-One
  • Nichts zuweisen
  • Fehler bei der Berechnung der Stringlänge
  • Übung - Analysieren Sie die UTF-8-Kodierung
  • Verwirrung bei der String-Beendigung
  • Labor - Verwirrung bei der String-Terminierung
  • Andere typische BoF-Schwächen

Bewährte Praktiken zum Schutz des BoF

  • Sichere und unsichere Funktion
  • base_string und std::string
  • Einige weniger bekannte gefährliche Funktionen
  • Übung - Pufferüberlauf beheben
  • Compiler-Optionen und Instrumentierung
  • FORTIFY_SOURCE verwenden
  • Labor - Auswirkungen von FORTIFY
  • Instrumentierung zur Kompilierzeit
  • Schutz vor Stapelzerschlagung
  • BoF mit dem Kanarienvogel aufspüren
  • Klonen von Argumenten
  • Schutz vor Stapelzerstörung auf verschiedenen Plattformen
  • Der geänderte Prolog und Epilog
  • Labor - Auswirkungen des Stapelzerstörungsschutzes
  • Laufzeitschutz
  • Laufzeit-Instrumentierung
  • Adressraum-Layout-Randomisierung (ASLR)
  • ASLR auf verschiedenen Plattformen
  • Labor - Auswirkungen von ASLR
  • Umgehung von ASLR - NOP Schlittenfahren
  • Sprühen auf Halde
  • Nicht ausführbare Speicherbereiche
  • Das NX-Bit
  • Schreiben-xoder-Ausführen (W^X)
  • NX auf verschiedenen Plattformen
  • Labor - Auswirkungen von NX
  • NX-Umgehung - Angriffe durch Code-Wiederverwendung
  • Arc Injection - Zurück-zu-libc
  • Labor - Ausnutzen von return-to-libc
  • Kaskadierte Rückgabe an die LIBC
  • Rückgabeorientierte Programmierung (ROP)
  • Labor - ROP-Vorführung
  • Wie auch immer orientierte Programmierung
  • Schutz vor ROP

Tag 2

Häufige Schwachstellen in der Software

Eingabeüberprüfung

  • Grundsätze der Eingabevalidierung
  • Schwarze Listen und weiße Listen
  • Validierung mit Regex
  • Was zu validieren ist - die Angriffsfläche
  • Wann Sie validieren sollten - Validierung vs. Transformationen
  • Wo soll validiert werden - Verteidigung in der Tiefe
  • Injektion
  • Prinzipien der Injektion
  • Injektionsangriffe
  • Code-Einspritzung
  • Befehl Injektion
  • Übung - Befehlsinjektion
  • Bewährte Praktiken der Befehlsinjektion
  • Fallstudie - Shellshock
  • Labor - Shellshock
  • Prozesskontrolle - Bibliotheksinjektion
  • DLL-Hijacking
  • Labor - DLL-Hijacking
  • Bewährte Praktiken der Injektion
  • Eingabeüberprüfung
  • Bereinigung der Ausgabe
  • Kodierung und Escaping der Ausgabe
  • Herausforderungen bei der Kodierung
  • Umgang mit Integer
  • Darstellung von vorzeichenbehafteten Zahlen
  • Integer-Visualisierung
  • Ganzzahlige Probleme
  • Integer-Überlauf
  • Labor - Integer-Überlauf
  • Fallstudie - Android Stagefright
  • Signierte / unsignierte Verwirrung
  • Labor - Signierte / unsignierte Verwechslung
  • Ganzzahlige Trunkierung
  • Fallstudie - Wannacry
  • Bewährte Praktiken
  • Upcasting
  • Vorbedingungstest
  • Nachbedingungstest
  • Große Ganzzahl-Bibliotheken verwenden
  • Übung - Bewährte Praktiken im Umgang mit Integer
  • Das AIR-Ganzzahlmodell
  • Andere numerische Probleme
  • Division durch Null
  • Arbeiten mit Gleitkommazahlen
  • Probleme mit Formatierungszeichenfolgen
  • Das Problem mit printf()
  • Formatspezifikationen von printf()
  • Ausnutzung der Schwäche des printf-Formatstrings
  • Übung - Ausnutzung von Formatstrings
  • Einige andere Probleme bei der Eingabevalidierung
  • Falsche Adressüberprüfung in IOCTL

Sicherheitsmerkmale

  • Authentifizierung
  • Grundlagen der Authentifizierung
  • Schwächen bei der Authentifizierung
  • Fallstudie - Umgehung der Zwei-Faktor-Authentifizierung von PayPal
  • Bewährte Praktiken für Benutzeroberflächen
  • Passwortverwaltung
  • Verwaltung eingehender Passwörter
  • Speichern von Kontopasswörtern
  • Klartext-Passwörter bei Facebook
  • Labor - Warum reicht das Hashing von Passwörtern nicht aus?
  • Wörterbuchangriffe und Brute-Forcing
  • Einsalzen
  • Adaptive Hash-Funktionen für die Speicherung von Passwörtern
  • Passwort unterwegs
  • Passwort-Politik
  • Schwache und starke Passwörter
  • Passphrasen verwenden
  • Übung - Anwenden einer Kennwortrichtlinie
  • Die Ashley Madison Datenschutzverletzung
  • Der Wörterbuch-Angriff
  • Der ultimative Angriff
  • Verwertung der Ergebnisse und der daraus gezogenen Lehren
  • Verwaltung ausgehender Passwörter
  • Hart kodierte Passwörter
  • Labor - Festcodiertes Passwort
  • Passwort in der Konfigurationsdatei
  • Schutz sensibler Informationen im Speicher
  • Herausforderungen beim Schutz der Erinnerung
  • Inspektion des Haufens
  • Compiler entfernt den Code zum Löschen des Speichers
  • Sensible Informationen im nicht gesperrten Speicher

  • Autorisierung
  • Grundlagen der Zugangskontrolle
  • Fehlende oder unzulässige Autorisierung
  • Zugriffskontrolle auf das Dateisystem
  • Unzulässige Zugriffskontrolle auf das Dateisystem
  • Eigentümerschaft
  • Chroot-Gefängnis
  • Verwendung von umask()
  • Linux-Dateisystem
  • LDAP
  • Zugriffskontrolle in Datenbanken
  • Übung - Zugriffskontrolle für Datenbanken
  • Privilegien und Berechtigungen
  • Manipulation der Erlaubnis
  • Falsche Verwendung von privilegierten APIs
  • Ausgesetzte IOCTL mit unzureichender Zugriffskontrolle
  • Bewährte Praktiken für Genehmigungen
  • Das Prinzip des geringsten Privilegs
  • Grundsatz der Trennung der Privilegien
  • Erlaubnis erteilen
  • Privilegien fallen lassen
  • Umgang mit unzureichenden Privilegien
  • Informationsexposition
  • Exposition durch extrahierte Daten und Aggregation
  • Durchsickern von Systeminformationen
  • Auslaufende Systeminformationen
  • Verlassen Sie sich auf Zugänglichkeitsmodifikatoren
  • Labor - Unangemessener Schutz durch Zugänglichkeitsmodifikator
  • Bewährte Praktiken der Informationsexposition
  • UI Sicherheit
  • Grundsätze der UI-Sicherheit
  • Sensible Informationen auf der Benutzeroberfläche
  • Fehlinterpretation von UI-Funktionen oder Aktionen
  • Unzureichendes UI-Feedback
  • Verlassen Sie sich auf ein verstecktes oder deaktiviertes UI-Element
  • Lab - Ausgeblendetes oder deaktiviertes UI-Element
  • Unzureichende Anti-Automatisierung

Tag 3

Häufige Schwachstellen in der Software

Zeit und Zustand

  • Bewährte Praktiken der Thread-Verwaltung
  • Bewährte Methoden der Thread-Verwaltung in C/C++
  • Bedingungen für das Rennen
  • Wettlaufbedingung in Objektdatenmitgliedern
  • Labor - Zustand der Ethnie
  • Datei-Race-Bedingung
  • Zeitpunkt der Überprüfung bis zur Nutzungsdauer (TOCTTOU)
  • Labor - TOCTTOU
  • Unsichere temporäre Datei
  • Mögliche Race Condition in C/C++
  • Wettlaufbedingung bei der Signalverarbeitung
  • Forking
  • Zugriff auf Bit-Feld
  • Gegenseitiger Ausschluss und Sperren
  • Deadlocks
  • Labor - Sperren
  • Synchronisierung und Thread-Sicherheit
  • Synchronisierung und Thread-Sicherheit in C/C++

Fehler

  • Grundsätze der Fehler- und Ausnahmebehandlung
  • Fehlerbehandlung
  • Rückgabe eines irreführenden Statuscodes
  • Fehlerbehandlung in C
  • Fehlerbehandlung in C++
  • Offenlegung von Informationen durch Fehlerberichte
  • Behandlung von Ausnahmen
  • Im Fangblock. Und was nun?
  • Leerer Catch-Block
  • Bewährte Praktiken für Fangblöcke
  • Übermäßig weite Würfe
  • Abfangen von NULL-Zeiger-Ausnahmen
  • Ausnahmebehandlung in C++
  • Übung - Chaos bei der Behandlung von Ausnahmen

Code-Qualität

  • Daten
  • Typ Unstimmigkeit
  • Labor - Nicht übereinstimmende Typen
  • Rückgabewerte von Funktionen
  • Ungeprüfter Rückgabewert
  • Fallstudie - MacOS X Passwort-Hash-Änderung
  • Ausgelassener Rückgabewert
  • Rückgabe eines unveränderbaren Zeigers
  • Initialisierung und Bereinigung
  • Uninitialisierte Variable
  • Konstruktoren und Destruktoren
  • Zyklen zur Initialisierung der Klasse
  • Deklarations- und Zuordnungsprobleme in C
  • Zuweisung und Freigabe in C++
  • Unveröffentlichte Ressource
  • Array Entsorgung
  • Übung - Mischen von Löschen und Löschen[]
  • Fallstricke der objektorientierten Programmierung
  • Modifikatoren für Barrierefreiheit
  • Vererbung und Overriding
  • Implementierung des Kopieroperators
  • Wandlungsfähigkeit
  • Klonen
  • Klonen sensibler Klassen - Objekt-Hijacking
  • Objekt-Hijacking - bewährte Praktiken
  • Serialisierung

Einpacken

Grundsätze der sicheren Kodierung

  • Grundlagen der robusten Programmierung von Matt Bishop;
  • Sichere Designprinzipien von Saltzer und Schröder;
  • Einige weitere Grundsätze.

Und was nun?

  • Weitere Quellen und Lektüre;
  • .NET und C# Ressourcen;
  • Weitere Labore und Herausforderungen sind zu bewältigen.

Methoden

Eine gemischte Lernreise: Live-Schulungen mit Ausbildern und Laborübungen in einem erstklassigen E-Learning-System. Sie haben noch 3 Monate nach der Schulung Zugang zum E-Learning-System, um die Laborübungen und das Material erneut zu studieren.

Plattform: Linux, Windows.
Labs: Praktische Übungen.

Zertifizierung

Nach der Teilnahme an dieser Schulung erhalten die Teilnehmer ein Zertifikat des High Tech Institute.

Kurs-Bewertungen

"Große Einsichten, wie die Sicherheit verletzt werden kann und wie man sie beheben kann."

Ference Schopbarteld - Thales Group

"Ausgewogenheit zwischen alten und neuen Techniken. Gutes praktisches Training."

Hani S. - Sioux Technologies

"Interessant, herausfordernd und technisch anspruchsvoll. Der beste Teil ist die praktische Arbeit."

Gabriele Ricciardi - Thales Group