This site is the archived OWASP Foundation Wiki and is no longer accepting Account Requests.
To view the new OWASP Foundation website, please visit https://owasp.org

Germany/Projekte/Top 10 fuer Entwickler-2013/A6-Verlust der Vertraulichkeit sensibler Daten

From OWASP
Jump to: navigation, search
← A5-Sicherheitsrelevante Fehlkonfiguration
Top 10 fuer Entwickler-2013: Inhaltsverzeichnis

Die Top-10-Risiken

A7-Fehlerhafte Autorisierung auf Anwendungsebene →
A6 Verlust der Vertraulichkeit sensibler Daten (Kryptografisch unsichere Speicherung / Unzureichende Absicherung der Transportschicht)


Bedrohungsquellen
Angriffsvektoren
Schwachstellen
Technische Auswirkung
Auswirkung auf das Unternehmen
Anwendungs-
spezifisch
Ausnutzbarkeit
SCHWIERIG
Verbreitung
SELTEN
Auffindbarkeit
DURCHSCHNITTLICH
Auswirkung
SCHWERWIEGEND
Anwendungs-/
Geschäftsspezifisch
Jeder mit Zugriff auf Ihre vertraulichen Daten (Backups inkl.) ist zu betrachten. Das betrifft die Speicherung, die Übertragung und auch die Daten im Browser der Kunden. Externe und interne Bedrohungen sind relevant. Angreifer brechen i.d.R. nicht die Verschlüsselung selbst. Stattdessen stehlen sie Schlüssel, führen Seiten- oder MITM-Angriffe aus oder stehlen Klartext vom Server, während der Übertragung oder aus dem Browser des Kunden heraus. Fehlende Verschlüsselung vertraulicher Daten ist die häufigste Schwachstelle. Die Nutzung von Kryptographie erfolgt oft mit schwacher Schlüsselerzeugung und -verwaltung und der Nutzung schwacher Algorithmen, insbesondere für das Password Hashing. Browser Schwachstellen sind verbreitet und leicht zu finden, aber nur schwer auszunutzen. Ein eingeschränkter Zugriff lässt ext. Angreifer Probleme auf dem Server i.d.R. nur schwer finden und ausnutzen. Fehler kompromittieren regelmäßig vertrauliche Daten. Es handelt sich hierbei oft um sensitive Daten wie personenbezogene Daten, Benutzernamen und Passwörter oder Kreditkarteninformationen. Betrachten Sie den Wert verlorener Daten und die Auswirkungen auf die Reputation des betroffenen Unternehmens. Hat es ggf. auch juristische Konsequenzen, wenn die Daten bekannt werden?
Mögliche Angriffsszenarien

Szenario 1: Eine Anwendung verschlüsselt Kreditkartendaten automatisch bei der Speicherung in einer Datenbank. Das bedeutet aber auch durch SQL-Injection erlangte Kreditkartendaten in diesem Fall automatisch entschlüsselt werden. Die Anwendung hätte die Daten mit eine Public Key verschlüsseln sollen und nur nachgelagerte Anwendungen und nicht die Webanwendung selbst hätten die Daten mit dem Private Key entschlüsseln dürfen.
Szenario 2: Eine Webseite schützt die authentisierten Seiten nicht mit SSL. Der Angreifer stiehlt das Sitzungscookie des Nutzers durch einfaches Mitlesen der Kommunikation (z.B. in einem offenen WLAN). Durch Wiedereinspielen dieses Cookies übernimmt der Angreifer die Sitzung des Nutzers und erlangt Zugriff auf die privaten Daten des Nutzers.
Szenario 3: Die Passwortdatenbank benutzt Hashwerte ohne Salt zur Speicherung der Passwörter. Eine Schwachstelle in der Downloadfunktion erlaubt dem Angreifer den Zugriff auf die Datei. Zu allen Hashes kann über eine Rainbowtabelle mit vorausberechneten Hashes der Klartext gefunden werden.

Wie kann ich 'Verlust der Vertraulichkeit sensibler Daten' verhindern?

Eine Übersicht über alle Tücken unsicherer Kryptografie, SSL-Verwendung und Datensicherheit liegt weit außerhalb der Top 10. Für alle vertraulichen Daten sollten Sie zumindest:

  1. Klärung der Bedrohungen, vor denen die Daten zu schützen sind (z. B. Innen- und Außentäter) und sicherstellen, dass vertrauliche Daten bei der Übertragung/Speicherung geeignet durch Verschlüsselung geschützt werden.
  2. Kein unnötiges Speichern vertraulicher Daten. Löschung nicht mehr benötigter Daten. Daten, die es nicht gibt, können auch nicht gestohlen werden.
  3. Sicherstellen, dass starke Algorithmen und Schlüssel (z.B. gemäß FIPS-140, BSI TR-02102-2) verwendet werden.
  4. Sicherstellen, dass Passwörter mit einem speziell für Passwortschutz entwickelten Algorithmus gespeichert werden (bcrypt, PBKDF2 oder scrypt).
  5. Deaktivieren der Autovervollständigung und des Cachings in Formularen mit vertraulichen Informationen.

JAVA-Teil 1: Kryptografisch unsichere Speicherung

Verteidigungs-Option 1 gegen 'Verlust der Vertraulichkeit sensibler Daten':

Ein einfaches Beispiel für die Veschlüsselung von Texten, hier mit dem AES-128 Algorithmus. Die Auswahl an Verschlüsselungsparametern wie beispielsweise Algorithmus, Ciphermodus oder Schlüssellänge ist groß und kommt immer auf die jeweiligen Daten und die Anwendung an.

String plainText = "HelloWorld";

// password setzen
String password = "my128bitPassword";

// CBC Cipher immer mit einem zufällig erzeugten
// Initialization Vector (IV) initialisieren (Länge 16 Byte)
byte[] ivBytes = new byte[16];
(new SecureRandom()).nextBytes(ivBytes);

// den Schlüssel erzeugen
SecretKeySpec key = new SecretKeySpec(password.getBytes(), "AES");

// Container für die Verschlüsselungs Parameter
IvParameterSpec paramSpec = new IvParameterSpec(ivBytes);

// Chiffrierer erzeugen und initialisieren
// Algorithmus: AES
// Modus: CBC
// Padding: PKCS5Padding
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);

// Verschlüsselung durchführen
byte[] encrypted = cipher.doFinal(plainText.getBytes());


Die Benutzung der ESAPI erleichtert die Handhabung, da neben einer großen Bandbreite an Verschlüsselungs-, Hash-, und Signaturalgorithmen auch Methoden für die Schlüsselerzeugung und -verwaltung unterstüzt werden. Nach Initialisierung der Parameter in der Konfigurationsdatei ESAPI.properties, reduziert sich die eigentliche Verschlüsselung eines Textes beispielsweise zu:

CipherText ciphertext =

ESAPI.encryptor().encrypt( new PlainText(myplaintext) );
Verteidigungs-Option 2 gegen 'Verlust der Vertraulichkeit sensibler Daten':

Beispiele für das Hashen von Passwörtern. Um die Sicherheit zu erhöhen sollte jedes Passwort mit einem Zufallswert (Salt) berechnet und gespeichert werden sowie möglichst viele Iterationen beim Hashing genutzt werden.

String password = "mypassword";
// salt anlegen und mit zufälligen Bytes befüllen
byte[] salt = new byte[8];
(new SecureRandom()).nextBytes(salt);
// Hash-Generator anlegen (verwendeter Algorithmus ist SHA-256)
// und mit salt initialisieren (=> höhere Sicherheit gegen Angriffe)
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.reset();
digest.update(salt);
byte[] input = digest.digest(password.getBytes("UTF-8"));

// Hash in mehreren Iterationen (n = 100.000) berechnen
// mehr Iterationen verlangsamen Angriffe (signifikant?)
for (int i = 0; i < 100000; i++) {

digest.reset();
input = digest.digest(input);

}
// am Ende der Iterationen enthält input den berechneten Hash


PBKDF2

Sicherer ist allerdings die Nutzung einer PBKDF2 (Password-Based Key Derivation Function 2) wie im folgenden Beispiel:

public byte[] generatePBKDF2Hash(String password)

throws NoSuchAlgorithmException, InvalidKeySpecException {
byte[] salt = new byte[20];
// salt mit zufälligen Bytes befüllen
(new SecureRandom()).nextBytes(salt);

int iterations = 10000;
int keyLength = 160;
// neuen Schlüssel erzeugen
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
PBEKeySpec pbeKeySpec = new PBEKeySpec(password, salt, iterations, keyLength);
SecretKey mySecretKey = factory.generateSecret(pbeKeySpec);

}
byte[] hash = generatePBKDF2Hash(password).getEncoded();


bcrypt

Eine weiterer empfohlener Algorithmus ist bcrypt, hier bespielsweise unter Verwendung der jBCrypt-Bibliothek (siehe Referenzen).

String hashed = BCrypt.hashpw(password, BCrypt.gensalt(12));

Zu bcrypt gibt es mittlerweile eine noch sicherere Variante scrypt, der Link zu einer Beispielimplementierung findet sich bei den Referenzen.

Verteidigungs-Option 3 gegen 'Verlust der Vertraulichkeit sensibler Daten':

Um geheime Schlüssel sicher, aber auch gleichzeitig einfach zugänglich und austauschbar aufzubewahren empfiehlt sich eine spezielle Schlüsseldatei, wie beispielweise der Java KeyStore. In dieser Datei werden die Schlüssel mit einem Master-Password gesichert, die Datei selbst sollte getrennt von den verschlüsselten Daten abgelegt werden:

// Erzeugung eines symmetrischen Schlüssels mittels der vorher beschriebenen PBKDF2
String password = "mypassword";
byte[] mySecretKey = generatePBKDF2Hash(password);

// neuen KeyStore für symmetrische Schlüssel erzeugen
KeyStore ks = KeyStore.getInstance("JCEKS");
ks.load(null, null);

// Schlüssel speichern
KeyStore.ProtectionParameter passwordProtection =

new KeyStore.PasswordProtection(password);

KeyStore.SecretKeyEntry entry = new KeyStore.SecretKeyEntry(mySecretKey);
ks.setEntry("beispielkey", entry, passwordProtection);

// KeyStore in Datei speichern
FileOutputStream fos = new FileOutputStream("SecretKeyStoreDatei");
ks.store(fos,password);
fos.close();

Referenzen

OWASP

Älter:

Andere

« JAVA    
← A5-Sicherheitsrelevante Fehlkonfiguration
Top 10 fuer Entwickler-2013: Inhaltsverzeichnis

Die Top-10-Risiken

A7-Fehlerhafte Autorisierung auf Anwendungsebene →

© 2002-2017 OWASP Foundation This document is licensed under the Creative Commons Attribution-ShareAlike 3.0 license. Some rights reserved. CC-by-sa-3 0-88x31.png