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.

Lieferung Im Unternehmen (vor Ort oder online)
Dauer 3 aufeinanderfolgende Tage
Größe der Gruppe Bis zu 12 Teilnehmer
Anpassung Das Training kann auf Ihre Organisation, Ihren Kontext und Ihre Lernziele zugeschnitten werden.
Sprache Englisch
Investition Auf Anfrage
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

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

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

Zertifizierung

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