Plattform: Linux, Windows.
Labs: Praktische Übungen.
Ihre in Java geschriebene Anwendung funktioniert wie vorgesehen, also sind Sie fertig, richtig? Aber haben Sie daran gedacht, falsche Werte einzugeben? 16Gbs 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 Java gestellt und um Kernfragen der Programmierung erweitert, wobei die Sicherheitsfallen der Java-Sprache und des Java-Frameworks erörtert werden.
Damit Sie auf die Kräfte der dunklen Seite vorbereitet sind.
Damit nichts Unerwartetes passiert.
Nichts.
PRAKTISCHE INFO
- 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 Java-Entwickler, die an Desktop-Anwendungen arbeiten.
Preparedness: Allgemeine Java-Entwicklung.
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
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
- CRLF-Injektion
- Baumstamm fälschen
- Labor - Baumstammfälschung
- Protokollfälschung - beste Praktiken
- Code-Einspritzung
- Befehl Injektion
- Übung - Befehlsinjektion
- Bewährte Praktiken der Befehlsinjektion
- Runtime.exec() verwenden
- ProcessBuilder verwenden
- Fallstudie - Shellshock
- Labor - Shellshock
- Skript-Injektion
- Injektion der Ausdruckssprache
- 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
- Signierte / unsignierte Verwirrung
- Vorzeichenlose / vorzeichenbehaftete Verwechslung in Java
- Ganzzahlige Trunkierung
- Bewährte Praktiken
- Upcasting
- Vorbedingungstest
- Nachbedingungstest
- Große Ganzzahl-Bibliotheken verwenden
- Integer-Verarbeitung in Java
- Übung - Umgang mit Integer
- Andere numerische Probleme
- Division durch Null
- Arbeiten mit Gleitkommazahlen
Datenstrukturen
- Datenstruktur Sentinels
- Container
- Container-Fehler
- Assoziative Container
- Iteratoren
Dateien und Streams
- Pfadüberquerung
- Beispiele für Pfadüberquerungen
- Bewährte Verfahren zur Pfadüberquerung
- Übung - Pfadüberquerung
- Virtuelle Ressourcen
Unsichere Reflexion
- Reflexion ohne Validierung
- Labor - Unsichere Reflexion
Unsicherer nativer Code
- Abhängigkeit von nativem Code
- Labor - Unsicheres JNI
Einige andere Probleme bei der Eingabevalidierung
Verwendung anfälliger Komponenten
Bewertung der Umwelt
Härtung
Importieren von Funktionen aus nicht vertrauenswürdigen Quellen
Management von Schwachstellen
- Patch-Verwaltung
- Schwachstellen-Datenbanken und Scanning-Tools
- Bewertung der Schwachstellen - CVSS
- Übung - Auffinden von Schwachstellen der verwendeten Komponenten
- Der Build-Prozess und CI/CD
- Abhängigkeitsüberprüfung in Maven
- Übung - Aufspüren verwundbarer Komponenten während des Builds
Tag 2
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
- Speichern von sensiblen Daten im Speicher
- Übung - Verwendung von Klassen für die Geheimhaltung
Autorisierung
- Grundlagen der Zugangskontrolle
- Fehlende oder unzulässige Autorisierung
- Zugriffskontrolle in Datenbanken
- Übung - Zugriffskontrolle für Datenbanken
- Privilegien und Berechtigungen
- Manipulation der Erlaubnis
- Falsche Verwendung von privilegierten APIs
- 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
Sicherheit der Java-Plattform
- Die Java-Programmiersprache und -Laufzeitumgebung
- Typensicherheit und Sicherheit
- Sicherheitsfunktionen der JRE
- Der ClassLoader und der BytecodeVerifier
- Zugriffskontrolle auf Anwendungsebene in Java
- Berechtigungen und der Sicherheitsmanager
- Bewährte Praktiken für Privilegien
- Übung - Arbeiten mit Berechtigungen in Java
- Rollenbasierte Zugriffskontrolle
- Java-Authentifizierungs- und Autorisierungsdienste (JAAS)
- Schutz von Java-Code und -Anwendungen
- Code Unterzeichnung
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 Java
- Thread Pools
- Bedingungen für das Rennen
- Wettlaufbedingung in Objektdatenmitgliedern
- Singleton Mitgliedsfelder
- Lab - Singleton Mitgliedsfelder
- Datei-Race-Bedingung
- Zeitpunkt der Überprüfung bis zur Nutzungsdauer (TOCTTOU)
- Labor - TOCTTOU
- Unsichere temporäre Datei
- Datenbank-Race-Bedingungen
- Übung - Datenbank-Race-Bedingungen
- Vermeiden von Race Conditions in Java
- Gegenseitiger Ausschluss und Sperren
- Deadlocks
- Labor - Sperren
- Synchronisierung und Thread-Sicherheit
- Synchronisierung und Thread-Sicherheit in Java
Fehler
- Grundsätze der Fehler- und Ausnahmebehandlung
- Fehlerbehandlung
- Rückgabe eines irreführenden Statuscodes
- Erreichbare Behauptung
- 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
- Unsachgemäße Vervollständigung des letzten Blocks
- Verschluckter FadenTod
- Geprüfte Ausnahmen, die aus finally entkommen
- Auslösen von nicht deklarierten geprüften Ausnahmen
- Auslösen von RuntimeException, Exception oder Throwable
- Übung - Chaos bei der Behandlung von Ausnahmen
Code-Qualität
- Daten
- Arrays und toString()
- Initialisierung und Bereinigung
- Konstruktoren und Destruktoren
- Zyklen zur Initialisierung der Klasse
- Labor - Initialisierungszyklen
- Unveröffentlichte Ressource
- Fallstricke der objektorientierten Programmierung
- Modifikatoren für Barrierefreiheit
- Overriding und Zugänglichkeitsmodifikatoren
- Vererbung und Overriding
- Implementierung von equals()
- Wandlungsfähigkeit
- Lab - Veränderliches Objekt
- Klonen
- Klonen sensibler Klassen - Objekt-Hijacking
- Objekt-Hijacking - bewährte Praktiken
- Serialisierung
Denial of Service
- Denial of Service
- Erschöpfung der Ressourcen
- Bargeldüberfluss
- Überschwemmung
- Nachhaltige Kundenbindung
- Denial-of-Service-Probleme in Java
- Endlosschleife
- Labor - Ressourcen erschöpfend
- Amplifikation
- Netzwerk-Verstärkung
- Amplifikation in Datenbanken
- Andere Beispiele für Verstärkung
- Probleme mit der Komplexität des Algorithmus
- Denial of Service mit regulären Ausdrücken (ReDoS)
- Labor - ReDos
- Kollision der Hashtabelle
- Wie funktionieren Hashtabellen?
- Hash-Kollision im Falle von Hashtabellen
- Hashtable-Kollision in Java
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
Weitere Labore und Herausforderungen zu tun
Methoden
Zertifizierung
Nach der Teilnahme an dieser Schulung erhalten die Teilnehmer ein Zertifikat des High Tech Institute.

