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
← Top_10_fuer_Entwickler/A6_Sicherheitsrelevante Fehlkonfiguration | Top_10_fuer_Entwickler/A8_Mangelhafter URL-Zugriffsschutz → |
Seite in Bearbeitung (BAUSTELLE!!)
A7 Kryptografisch unsichere Speicherung
______ | Ausnutzbarkeit SCHWIERIG |
Verbreitung SELTEN |
Auffindbarkeit SCHWIERIG |
Auswirkung SCHWERWIEGEND |
Application / Business Specific |
Jeder Benutzer des Systems ist zu betrachten.
Haben diese ein Interesse, auf geschützte Daten unberechtigt zuzugreifen? Wie steht es um Administratoren? |
Angreifer brechen üblicherweise nicht die eigentliche Kryptografie. Statt dessen finden Sie Schlüssel, Klartexte oder greifen über Kanäle mit automatischer Entschlüsselung auf Daten zu. | Fehlende Verschlüsselung vertraulicher Daten ist die häufigste Schwachstelle, gefolgt von unsicherer Schlüsselerzeugung, der Speicherung statischer Schlüssel und die Nutzung schwacher Algorithmen. Schwache Hashwerte ohne Salt kommen zum Passwortschutz oft vor. Ein eingeschränkter Zugriff lässt externe Angreifer solche Probleme i.d.R. nicht leicht entdecken. Den nötigen Zugriff müssen sie vorher auf andere Weise erlangen. | 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 speichert verschlüsselt Kreditkartendaten in einer Datenbank, um Sie vor Angreifern zu schützen. Die Datenbank ist so eingerichtet, dass die Daten beim Auslesen automatisch entschlüsselt werden. Durch SQL-Injection können in diesem Fall alle Kreditkartendaten im Klartext ausgelesen werden. Das System hätte so konfiguriert sein sollen, dass nur nachgelagerte Anwendungen und nicht die Webanwendung selbst entschlüsseln dürfen. |
Wie kann ich 'Kryptografisch unsichere Speicherung' verhindern?
Eine Übersicht über alle Tücken unsicherer Kryptografie liegt weit außerhalb des Rahmens der Top 10. Für alle vertrau-lichen Daten sollten Sie zumindest:
|
Verteidigungs-Option 1 gegen 'Kryptografisch unsichere Speicherung':
Beispiel für das sichere Hashen von Passwörtern. Um die Sicherheit zu erhöhen sollte jedes Passwort mit einem Zufallswert (Salt) berechnet und möglichst viele Iterationen beim Hashing genutzt werden. String password = "Password"; byte[] salt = new byte[8]; // salt mit zufälligen Bytes befüllen (new SecureRandom()).nextBytes(salt); MessageDigest digest = MessageDigest.getInstance("SHA-256"); digest.reset(); digest.update(salt); byte[] input = digest.digest(password.getBytes("UTF-8")); for (int i = 0; i < 100000; i++) { digest.reset(); input = digest.digest(input); } Und dies ist ein einfaches Beispiel für die Veschlüsselung von Texten, hier mit dem AES-128 Algorithmus. Die Wahl der Verschlüsselungsparameter wie beispielsweise Algorithmus, Ciphermodus oder Schlüssellänge ist groß und kommt dabei immer auf die jeweiligen Daten und die Anwendung an. byte[] ivBytes = new byte[16]; (new SecureRandom()).nextBytes(ivBytes); SecretKeySpec key = new SecretKeySpec("My128bitMastrKey".getBytes(), "AES"); IvParameterSpec paramSpec = new IvParameterSpec(ivBytes); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec); byte[] encrypted = cipher.doFinal(plainText.getBytes()); |
Verteidigungs-Option 2 gegen 'Kryptografisch unsichere Speicherung':
Geheime Schlüssel sollten natürlich nicht wie im nebenstehenden Beispiel im Quellcode stehen. Um 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 MasterKey gesichert, die Datei selbst sollte getrennt von den verschlüsselten Daten abgelegt werden: char[] password = getMasterKey(); byte[] salt = new byte[20]; (new SecureRandom()).nextBytes(salt); // neuen Schlüssel erzeugen SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); PBEKeySpec pbeKeySpec = new PBEKeySpec(password, salt, 1000, 128); SecretKey mySecretKey = factory.generateSecret(pbeKeySpec); // 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();
|
Verteidigungs-Option 3 gegen 'Kryptografisch unsichere Speicherung':
Grundsätzlich gibt es bei der Verschlüsselung immer viele Wahlmöglichkeiten. Die Benutzung der ESAPI erleichtert die Handhabung ungemein, da neben einer großen Bandbreite an Verschlüsselungs-, Hash-, und Signaturalgorithmen auch Methoden für die Schlüsselerzeugung- und verwaltung unterstüzt werden. Die Verschlüsselung eines Textes beispielsweise reduziert sich dann zu: CipherText ciphertext = ESAPI.encryptor().encrypt( new PlainText(myplaintext) ); |
Referenzen
OWASP Einen umfangreicheren Überblick über die Anforderungen und die hierbei zu vermeidenden Probleme gibt es unter ASVS requirements on Cryptography (V7). Des Weiteren:
Andere |
Verteidigungs-Option 1 gegen 'Kryptografisch unsichere Speicherung':
tbd Text |
Verteidigungs-Option 2 gegen 'Kryptografisch unsichere Speicherung':
tbd Text |
Verteidigungs-Option gegen 'Kryptografisch unsichere Speicherung':
tbd Text | |
Auswirkung(en) auf den Benutzer
(ganze Breite) Text |
Referenzen
|
← Top_10_fuer_Entwickler/A6_Sicherheitsrelevante Fehlkonfiguration | Top_10_fuer_Entwickler/A8_Mangelhafter URL-Zugriffsschutz → |