Difference between revisions of "Germany/Projekte/Top 10 fuer Entwickler-2013/A6-Verlust der Vertraulichkeit sensibler Daten"

From OWASP
Jump to: navigation, search
m
(new SSLCipherSuite 'EDH+aRSA+AESGCM:EDH+aRSA+AES:DHE-RSA-AES256-SHA:-DHE-RSA-AES128-SHA:EECDH+AESGCM:EECDH+AES:RSA+AESGCM:RSA+AES+SHA:DES-CBC3-SHA' to support DH-Keys with 2048 bits)
 
(56 intermediate revisions by 5 users not shown)
Line 1: Line 1:
{{Top_10_2010_Developer_Edition_De:TopTemplate|useprev=PrevLink_Germany_Projekte|usenext=NextLink_Germany_Projekte|next=Top_10_fuer_Entwickler/A8_Mangelhafter_URL-Zugriffsschutz|prev=Top_10_fuer_Entwickler/A6 Sicherheitsrelevante Fehlkonfiguration}}
+
{{Top_10_2013_DeveloperEdition:TopTemplate
== Seite in Bearbeitung (BAUSTELLE!!) ==
+
    |useprev=2013PrevLinkDeveloperEdition
 +
    |usenext=2013NextLinkDeveloperEdition
 +
    |prev=A5-{{Top_10_2010:ByTheNumbers
 +
              |5
 +
              |year=2013
 +
              |language=de}}
 +
    |next=A7-{{Top_10_2010:ByTheNumbers
 +
              |7
 +
              |year=2013
 +
              |language=de}}
 +
    |year=2013
 +
    |language=de
 +
}}
  
== A7 Kryptografisch unsichere Speicherung ==  
+
{{Top_10_2010:SubsectionColoredTemplate
 +
      |A6 {{Top_10_2010:ByTheNumbers
 +
              |6
 +
              |year=2013
 +
              |language=de}} <small>({{Top_10_2010:ByTheNumbers|7|year=2010|language=de}} / {{Top_10_2010:ByTheNumbers|9|year=2010|language=de}})</small>
 +
      ||year=2013
 +
}}
  
{{Top_10_2010_Developer_Edition_De:SummaryTableHeaderBeginTemplate}}
+
{{Top_10_2010:SummaryTableHeaderBeginTemplate|year=2010|language=de}}
{{Top_10_2010:SummaryTableValue-3-Template|Ausnutzbarkeit|SCHWIERIG}}
+
  {{Top_10:SummaryTableTemplate|exploitability=3|prevalence=3|detectability=2|impact=1|language=de|year=2013}}
{{Top_10_2010:SummaryTableValue-3-Template|Verbreitung|SELTEN}}
+
{{Top_10_2010:SummaryTableValue-3-Template|Auffindbarkeit|SCHWIERIG}}
+
{{Top_10_2010:SummaryTableValue-1-Template|Auswirkung|SCHWERWIEGEND}}
+
 
{{Top_10_2010:SummaryTableHeaderEndTemplate}}
 
{{Top_10_2010:SummaryTableHeaderEndTemplate}}
 
     <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>Jeder Benutzer des Systems ist zu betrachten.
 
     <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>Jeder Benutzer des Systems ist zu betrachten.
Line 14: Line 29:
 
Wie steht es um Administratoren?</td>
 
Wie steht es um Administratoren?</td>
 
     <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>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.</td>
 
     <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>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.</td>
     <td colspan=2  {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>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 ein-geschränkter Zugriff lässt externe Angreifer solche Probleme i.d.R. nicht leicht ent-decken. Den nötigen Zugriff müssen sie vorher auf andere Weise erlangen.</td>
+
     <td colspan=2  {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>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.</td>
 
     <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>Fehler kompromittieren regelmäßig vertrauliche Daten. Es handelt sich hierbei oft um sensitive Daten wie personenbezogene Daten, Benutzernamen und Passwörter oder Kreditkarteninformationen.</td>
 
     <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>Fehler kompromittieren regelmäßig vertrauliche Daten. Es handelt sich hierbei oft um sensitive Daten wie personenbezogene Daten, Benutzernamen und Passwörter oder Kreditkarteninformationen.</td>
 
     <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>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?</td>
 
     <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>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?</td>
 
 
{{Top_10_2010:SummaryTableEndTemplate}}
 
{{Top_10_2010:SummaryTableEndTemplate}}
  
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=1|risk=7}}   
+
{{Top_10:SubsectionTableBeginTemplate|type=main}} {{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=example|position=firstLeft|risk=7|year=2010|language=de}}   
 
'''<u>Szenario 1</u>''': 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.<br/>  
 
'''<u>Szenario 1</u>''': 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.<br/>  
 
'''<u>Szenario 2</u>''': Ein Datensicherungsband speichert verschlüsselte Gesundheitsdaten, aber der Schlüssel ist ebenfalls dort gespeichert. Das Band geht auf dem Transportweg verloren.<br/>
 
'''<u>Szenario 2</u>''': Ein Datensicherungsband speichert verschlüsselte Gesundheitsdaten, aber der Schlüssel ist ebenfalls dort gespeichert. Das Band geht auf dem Transportweg verloren.<br/>
 
'''<u>Szenario 3</u>''': Die Passwortdatenbank benutzt Hashwerte ohne Salt zur Speicherung der Passwörter. Eine Schwachstelle in der Downloadfunktion ermöglicht einem Angreifer den Zugriff auf die Datei. Zu allen Hashes kann in vier Wochen ein passender Klartext gefunden werden. Bei starken Hashwerten mit Salt hätte dieser Angriff über 3000 Jahre gedauert.
 
'''<u>Szenario 3</u>''': Die Passwortdatenbank benutzt Hashwerte ohne Salt zur Speicherung der Passwörter. Eine Schwachstelle in der Downloadfunktion ermöglicht einem Angreifer den Zugriff auf die Datei. Zu allen Hashes kann in vier Wochen ein passender Klartext gefunden werden. Bei starken Hashwerten mit Salt hätte dieser Angriff über 3000 Jahre gedauert.
  
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=2|risk=7}}  
+
{{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=howPrevent|position=right|risk=7|year=2010|language=de}}  
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:
+
Eine Übersicht über alle Tücken unsicherer Kryptografie liegt weit außerhalb des Rahmens der Top 10. Für alle vertraulichen Daten sollten Sie zumindest:
 
# Die Bedrohungen betrachten, vor denen Sie die Daten schützen wollen (z. B. Innen- und Außentäter) und sicherstellen, dass diese Daten angemessen durch Verschlüsselung geschützt werden.
 
# Die Bedrohungen betrachten, vor denen Sie die Daten schützen wollen (z. B. Innen- und Außentäter) und sicherstellen, dass diese Daten angemessen durch Verschlüsselung geschützt werden.
 
# Sicherstellen, dass ausgelagerte Datensicherungen verschlüsselt sind und die Schlüssel getrennt verwaltet und gesichert werden.
 
# Sicherstellen, dass ausgelagerte Datensicherungen verschlüsselt sind und die Schlüssel getrennt verwaltet und gesichert werden.
Line 32: Line 46:
 
# Sicherstellen, dass Passwörter mit einem starken Algorithmus und einem angemessenen Salt gehasht werden.
 
# Sicherstellen, dass Passwörter mit einem starken Algorithmus und einem angemessenen Salt gehasht werden.
 
# Sicherstellen, dass alle Schlüssel und Passwörter vor unberechtigtem Zugriff geschützt sind.
 
# Sicherstellen, dass alle Schlüssel und Passwörter vor unberechtigtem Zugriff geschützt sind.
</td> </tr>
+
{{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=example|position=left|risk=6|year=2013}}
</table>
+
====temporär: Auszug aus [[Top_10_2013-A6-Sensitive_Data_Exposure| Top 10-2013 RC1: A6-Sensitive_Data_Exposure]]====
 +
<u>Scenario #1:</u> An application encrypts credit card numbers in a database using automatic database encryption. However, this means it also decrypts this data automatically when retrieved, allowing an SQL injection flaw to retrieve credit card numbers in clear text. The system should have encrypted the credit card numbers using a public key, and only allowed back-end applications to decrypt them with the private key.
 +
 
 +
<u>Scenario #2:</u> A site simply doesn't use SSL for all authenticated pages. Attacker simply monitors network traffic (like an open wireless network), and steals the user’s session cookie. Attacker then replays this cookie and hijacks the user’s session, accessing all their private data.
 +
 
 +
<u>Scenario #3:</u> The password database uses unsalted hashes to store everyone’s passwords. A file upload flaw allows an attacker to retrieve the password file. All the unsalted hashes can be exposed with a rainbow table of precalculated hashes.
 +
{{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=howPrevent|position=right|risk=6|year=2013}}
 +
====temporär: Auszug aus [[Top_10_2013-A6-Sensitive_Data_Exposure| Top 10-2013 RC1: A6-Sensitive_Data_Exposure]]====
 +
The full perils of unsafe cryptography, SSL usage, and data protection are well beyond the scope of the Top 10. That said, for all sensitive data, do all of the following, at a minimum:
 +
# Considering the threats you plan to protect this data from (e.g., insider attack, external user), make sure you encrypt all sensitive data at rest and in transit in a manner that defends against these threats.
 +
# Don’t store sensitive data unnecessarily. Discard it as soon as possible. Data you don’t have can’t be stolen.
 +
# Ensure strong standard algorithms and strong keys are used, and proper key management is in place.
 +
Ensure passwords are stored with an algorithm specifically designed for password protection, such as [http://en.wikipedia.org/wiki/Bcrypt  bcrypt], [http://en.wikipedia.org/wiki/PBKDF2  PBKDF2], or [http://en.wikipedia.org/wiki/Scrypt  scrypt].
 +
# Disable autocomplete on forms collecting sensitive data and disable caching for pages displaying sensitive data.
 +
{{Top_10:SubsectionTableEndTemplate}}
  
 
= '''JAVA''' =   
 
= '''JAVA''' =   
<!-- z.Z ohne Template --->
+
{{Top_10:SubsectionTableBeginTemplate|type=headertab}} {{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=firstLeft|title=1|risk=6|year=2013|language=de}}
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=11|risk=7}} <!-- war number=3 -->
+
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.
==== Tbd ====
+
{{Top_10_2010:ExampleBeginTemplate|year=2013}}
 +
String plainText = "HelloWorld";<br/>
 +
<br/>
 +
// password setzen <br/>
 +
String password = "my128bitPassword";<br/>
 +
<br/>
 +
// CBC Cipher immer mit einem zufällig erzeugten <br/>
 +
// Initialization Vector (IV) initialisieren (Länge 16 Byte)<br/>
 +
byte[] ivBytes = new byte[16];<br/>
 +
(new SecureRandom()).nextBytes(ivBytes);<br/>
 +
<br/>
 +
// den Schlüssel erzeugen<br/>
 +
SecretKeySpec key = new SecretKeySpec(password.getBytes(), "AES");<br/>
 +
<br/>
 +
// Container für die Verschlüsselungs Parameter<br/>
 +
IvParameterSpec paramSpec = new IvParameterSpec(ivBytes); <br/>
 +
<br/>
 +
// Chiffrierer erzeugen und initialisieren<br/>
 +
// Algorithmus: AES<br/>
 +
// Modus: CBC<br/>
 +
// Padding: PKCS5Padding<br/>
 +
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");<br/>
 +
cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec); <br/>
 +
<br/>
 +
// Verschlüsselung durchführen<br/>
 +
byte[] encrypted = cipher.doFinal(plainText.getBytes());
 +
{{Top_10_2010:ExampleEndTemplate}}
 +
<br/>
 +
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:
 +
{{Top_10_2010:ExampleBeginTemplate|year=2013}}
 +
CipherText ciphertext =
 +
::  ESAPI.encryptor().encrypt( new PlainText(myplaintext) );
 +
{{Top_10_2010:ExampleEndTemplate}}
  
{{Top_10_2010:ExampleBeginTemplate}}
+
{{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=right|title=2|risk=6|year=2013|language=de}}
 +
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.
 +
{{Top_10_2010:ExampleBeginTemplate|year=2013}}
 +
String password = "mypassword";
 +
<br/>
 +
// salt anlegen und mit zufälligen Bytes befüllen<br/>
 +
byte[] salt = new byte[8];<br/>
 +
(new SecureRandom()).nextBytes(salt);
 +
<br/>
 +
// Hash-Generator anlegen (verwendeter Algorithmus ist SHA-256)<br/>
 +
// und mit salt initialisieren (=> höhere Sicherheit gegen Angriffe)<br/>
 +
MessageDigest digest = MessageDigest.getInstance("SHA-256");<br/>
 +
digest.reset();<br/>
 +
digest.update(salt);
 +
<br/>
 +
byte[] input = digest.digest(password.getBytes("UTF-8"));<br/>
 +
<br/>
 +
// Hash in mehreren Iterationen (n = 100.000) berechnen<br/>
 +
// mehr Iterationen verlangsamen Angriffe (signifikant?)<br/>
 +
for (int i = 0; i < 100000; i++) {
 +
:  digest.reset();
 +
:  input = digest.digest(input);
 +
}<br/>
 +
// am Ende der Iterationen enthält input den berechneten Hash
 +
{{Top_10_2010:ExampleEndTemplate}}
 +
<br/>
 +
;PBKDF2
 +
Sicherer ist allerdings die Nutzung einer PBKDF2 (Password-Based Key Derivation Function 2) wie im folgenden Beispiel:
 +
{{Top_10_2010:ExampleBeginTemplate|year=2013}}
 +
public byte[] generatePBKDF2Hash(String password)
 +
:  throws NoSuchAlgorithmException, InvalidKeySpecException {  <br/>
 +
:: byte[] salt = new byte[20];
 +
:: // salt mit zufälligen Bytes befüllen
 +
:: (new SecureRandom()).nextBytes(salt);
 +
::<br/>
 +
:: 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);
 +
}
 +
<br/>
 +
byte[] hash = generatePBKDF2Hash(password).getEncoded();<br/>
 +
{{Top_10_2010:ExampleEndTemplate}}
 +
<br/>
 +
;bcrypt
 +
Eine weiterer empfohlener Algorithmus ist bcrypt, hier bespielsweise unter Verwendung der jBCrypt-Bibliothek (siehe Referenzen).
 +
{{Top_10_2010:ExampleBeginTemplate|year=2013}}
 +
String hashed = BCrypt.hashpw(password, BCrypt.gensalt(12));
 +
{{Top_10_2010:ExampleEndTemplate}}
 +
Zu bcrypt gibt es mittlerweile eine noch sicherere Variante scrypt, der Link zu einer Beispielimplementierung findet sich bei den Referenzen.
  
{{Top_10_2010:ExampleEndTemplate}}  
+
{{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=left|title=3|risk=6|year=2013|language=de}}
 +
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:
 +
 +
{{Top_10_2010:ExampleBeginTemplate|year=2013}}
 +
// Erzeugung eines symmetrischen Schlüssels mittels der vorher beschriebenen PBKDF2<br/>
 +
String password = "mypassword";<br/>
 +
byte[] mySecretKey = generatePBKDF2Hash(password);<br/>
 +
<br/>
 +
// neuen KeyStore für symmetrische Schlüssel erzeugen <br/>
 +
KeyStore ks = KeyStore.getInstance("JCEKS");<br/>
 +
ks.load(null, null);<br/>
 +
<br/>
 +
// Schlüssel speichern<br/>
 +
KeyStore.ProtectionParameter passwordProtection =<br/>
 +
:  new KeyStore.PasswordProtection(password);
 +
KeyStore.SecretKeyEntry entry = new KeyStore.SecretKeyEntry(mySecretKey);<br/>
 +
ks.setEntry("beispielkey", entry, passwordProtection);<br/>
 +
<br/>
 +
// KeyStore in Datei speichern <br/>
 +
FileOutputStream fos = new FileOutputStream("SecretKeyStoreDatei");<br/>
 +
ks.store(fos,password);<br/>
 +
fos.close();
 +
{{Top_10_2010:ExampleEndTemplate}}
  
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=4|risk=7}}
+
{{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=right|title=1|risk=6|year=2013|language=de}}
==== Tbd ====
+
;Absicherung der Transportschicht (beim Deployment)
{{Top_10_2010:ExampleBeginTemplate}}
+
  
 +
Um die Verschlüsselung auf der Transportebene sollte sich der Entwickler nie selbst kümmern, sondern dies immer dem Webserver überlassen.
 +
Im J2EE-Deployment-Descriptor der Anwendung (= web.xml) ist die folgende Konfiguration vorzunehmen, um sicherzustellen, dass nur ausschließlich über https kommuniziert wird:
 +
 +
{{Top_10_2010:ExampleBeginTemplate|year=2013}}
 +
<security-constraint>
 +
:  <web-resource-collection>
 +
::    <web-resource-name>Protected Context</web-resource-name>
 +
::    <url-pattern>/*</url-pattern>
 +
:  </web-resource-collection>
 +
:  <!-- auth-constraint an dieser Stelle für Authentisierung  -->
 +
:  <user-data-constraint>
 +
::      <transport-guarantee>CONFIDENTIAL</transport-guarantee>
 +
:  </user-data-constraint>
 +
</security-constraint>
 +
{{Top_10_2010:ExampleEndTemplate}}
 +
<br/>
 +
Für Session-Cookies ist immer das Attribute SECURE zu setzen:
 +
{{Top_10_2010:ExampleBeginTemplate|year=2013}}
 +
<session-config>
 +
:  <cookie-config>
 +
::      <secure>
 +
:::        true
 +
::      </secure>
 +
:  </cookie-config>
 +
</session-config>
 +
{{Top_10_2010:ExampleEndTemplate}}
 +
<br/>
 +
In der Server-Configuration ist sicherzustellen, dass nur TLS und SSL3 unterstützt werden.
 +
Das Speichern von vertraulichen Inhalten am Client oder auf einem Proxy kann über den Header Cache-Control verhindert werden:
 +
{{Top_10_2010:ExampleBeginTemplate|year=2013}}
 +
Header set Cache-Control "no-cache, no store, must-revalidate"
 
{{Top_10_2010:ExampleEndTemplate}}
 
{{Top_10_2010:ExampleEndTemplate}}
  
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=5|risk=7}}
+
Weitere Hinweise im [https://www.owasp.org/index.php/Transport_Layer_Protection_Cheat_Sheet Transport Layer Protection Cheat Sheet]
==== Tbd ====
+
{{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=left|title=2a|risk=6|year=2013|language=de}}
 +
;Absicherung der Transportschicht (auf dem Webserver - Teil 1)
 +
<b>Sichere Verschlüsselung</b>
 +
* Nutzen Sie aktuelle Empfehlungen zur SSL/TLS-Sicherheit, das Thema ist derzeit sehr(!) dynamisch. Z.B.:
 +
:* [https://www.ssllabs.com/projects/best-practices/index.html SSL LABS: 'SSL/TLS Deployment Best Practices']
 +
:* [https://www.bsi.bund.de/DE/Publikationen/TechnischeRichtlinien/tr02102/index_htm.html BSI TR-02102 Teil 2]
 +
* aktuelle Verschlüsselungsbibliotheken einsetzen, die aktuelle Protokolle und Verfahren unterstützen
 +
* Nur sichere Verschlüsselungsprotokolle unterstützen (TLS1.2, TLS1.1, ggf auch TLS1.0)
 +
* Die Verschlüsselungsverfahren auf dem Server priorisieren
 +
* sichere, ephemerale Verschlüsselungsverfahren (Cipher-Suites), die 'Forward Secrecy' unterstützen (z.B. DHE_RSA, ECDHE_RSA) mit hoher Prio versehen.
 +
* sichere Schlüssellängen für assymetrische und symmetrische Verfahren (gem. BSI TR-02102 Teil 2):
 +
:* Schlüsseleinigung und Authentisierung: DHE, RSA, DSS: 2000 bits bzw. (nach 2015:) 3000 bits für RSA; ECDHE: 224 bzw. (nach 2015:) 250 bits
 +
:* (symmetrische) Verschlüsselung: AES: 128 bits
 +
* RC4 und andere schwache Cipher <u>vermeiden</u>, <u>ohne</u> den Zugriff von (noch) unterstützten Browsern, oder Suchmaschinen-Bots (Webcrawlern) zu verlieren.
 +
* Richtlinie erstellen, welche Browser und Betriebssysteme, unterstützt werden sollen, sowie welche Protokolle und welche Cipher für die verschlüsselte Verbindung jeweils ausgewählt werden sollen (z.B. vorübergehend noch SSLv3, TLS_RSA_WITH_3DES_EDE_CBC_SHA).
 +
* TLS/SSL-Konfiguration des Webservers härten:
 +
:* nur sichere Server-initiierte Renegotiation
 +
:* <u>keine</u> Komprimierung
 +
:* Einstellungen aller virtuellen Server (virtualHosts) prüfen
 +
:* Bei Einsatz von Server Name Indication (SNI), prüfen, welcher Server der Default-Server ist. Alte Browser bzw. Betriebssysteme, ohne SNI-Unterstützung erreichen nur diesen!
 +
:* Prüfen der, von der installierten OpenSSL-Version unterstützten Cipher
 +
* Konfigurations-Beispiel für Apache:
 +
{{Top_10_2010:ExampleBeginTemplate|year=2013}}
 +
SSLProtocol +TLSv1.2 +TLSv1.1 +TLSv1<br>
 +
SSLCompression off <br>
 +
SSLHonorCipherOrder on <br>
 +
<u>#<in Diskussion:></u> <br>
 +
SSLCipherSuite 'EDH+aRSA+AESGCM:EDH+aRSA+AES:DHE-RSA-AES256-SHA:-DHE-RSA-AES128-SHA:EECDH+AESGCM:EECDH+AES:RSA+AESGCM:RSA+AES+SHA:DES-CBC3-SHA'<br>
 +
{{Top_10_2010:ExampleEndTemplate}}
 +
<b>Anmerkungen:</b> Der Cipher-String mit den SSL-Cipher-Suites wurde als (weitgehend) Whitelist formuliert, um die Kompatibilität mit alten Versionen von OpenSSL zu erhöhen.<br/>
 +
Das Verfahren 'DHE-RSA-AES128-SHA' wird unterdrückt, da ältere Internet-Explorer- und Java-Versionen <u>keine</u> Diffie-Hellman-Schlüssellängen > 1024 bit unterstützen<br/>
 +
Überwachen Sie die Performance Ihres Servers, der Verbindungsaufbau mit DHE ist CPU-intensiver als mit ECDHE<br/>
  
{{Top_10_2010:ExampleBeginTemplate}}
+
* Prüfen der Cipher-Einstellungen mittels openssl:
 +
{{Top_10_2010:ExampleBeginTemplate|year=2013}}
 +
<u>#<in Diskussion:></u> <br>
 +
openssl ciphers -V EDH+aRSA+AESGCM:EDH+aRSA+AES:DHE-RSA-AES256-SHA:-DHE-RSA-AES128-SHA:EECDH+AESGCM:EECDH+AES:RSA+AESGCM:RSA+AES+SHA:DES-CBC3-SHA<br>
 +
A-AES128-SHA:EECDH+AESGCM:EECDH+AES:RSA+AESGCM:RSA+AES+SHA:DES-CBC3-SHA
 +
<small>
 +
  0x00,0x9F - DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH      Au=RSA  Enc=AESGCM(256) Mac=AEAD
 +
  0x00,0x9E - DHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=DH      Au=RSA  Enc=AESGCM(128) Mac=AEAD
 +
  0x00,0x6B - DHE-RSA-AES256-SHA256  TLSv1.2 Kx=DH      Au=RSA  Enc=AES(256)  Mac=SHA256
 +
  0x00,0x39 - DHE-RSA-AES256-SHA      SSLv3 Kx=DH      Au=RSA  Enc=AES(256)  Mac=SHA1
 +
  0x00,0x67 - DHE-RSA-AES128-SHA256  TLSv1.2 Kx=DH      Au=RSA  Enc=AES(128)  Mac=SHA256
 +
  0xC0,0x30 - ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH    Au=RSA  Enc=AESGCM(256) Mac=AEAD
 +
  0xC0,0x2C - ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH    Au=ECDSA Enc=AESGCM(256) Mac=AEAD
 +
  0xC0,0x2F - ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH    Au=RSA  Enc=AESGCM(128) Mac=AEAD
 +
  0xC0,0x2B - ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH    Au=ECDSA Enc=AESGCM(128) Mac=AEAD
 +
  0xC0,0x28 - ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH    Au=RSA  Enc=AES(256)  Mac=SHA384
 +
  0xC0,0x24 - ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH    Au=ECDSA Enc=AES(256)  Mac=SHA384
 +
  0xC0,0x14 - ECDHE-RSA-AES256-SHA    SSLv3 Kx=ECDH    Au=RSA  Enc=AES(256)  Mac=SHA1
 +
  0xC0,0x0A - ECDHE-ECDSA-AES256-SHA  SSLv3 Kx=ECDH    Au=ECDSA Enc=AES(256)  Mac=SHA1
 +
  0xC0,0x27 - ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH    Au=RSA  Enc=AES(128)  Mac=SHA256
 +
  0xC0,0x23 - ECDHE-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH    Au=ECDSA Enc=AES(128)  Mac=SHA256
 +
  0xC0,0x13 - ECDHE-RSA-AES128-SHA    SSLv3 Kx=ECDH    Au=RSA  Enc=AES(128)  Mac=SHA1
 +
  0xC0,0x09 - ECDHE-ECDSA-AES128-SHA  SSLv3 Kx=ECDH    Au=ECDSA Enc=AES(128)  Mac=SHA1
 +
  0x00,0x9D - AES256-GCM-SHA384      TLSv1.2 Kx=RSA      Au=RSA  Enc=AESGCM(256) Mac=AEAD
 +
  0x00,0x9C - AES128-GCM-SHA256      TLSv1.2 Kx=RSA      Au=RSA  Enc=AESGCM(128) Mac=AEAD
 +
  0x00,0x35 - AES256-SHA              SSLv3 Kx=RSA      Au=RSA  Enc=AES(256)  Mac=SHA1
 +
  0x00,0x2F - AES128-SHA              SSLv3 Kx=RSA      Au=RSA  Enc=AES(128)  Mac=SHA1
 +
  0x00,0x0A - DES-CBC3-SHA            SSLv3 Kx=RSA      Au=RSA  Enc=3DES(168) Mac=SHA1</small>
 +
{{Top_10_2010:ExampleEndTemplate}}
  
 +
<br/>
 +
<b>sichere Zertifikate</b><br/>
 +
* Nutzen Sie eine vertrauenswürdige Zertifizierungsstelle (CA) für öffentlich erreichbare, verschlüsselte Webserver; Prüfen Sie die Vergabe-Politik der CA.
 +
* zeitgemäße, starke Verfahren mit sicheren Schlüssellängen (vgl. [https://www.bsi.bund.de/DE/Publikationen/TechnischeRichtlinien/tr02102/index_htm.html BSI TR-02102-2 Teil 2]: 2000 bits bzw. (nach 2015:) 3000 bits für RSA), auch für alle Zwischenzertifikate und das Root-Zertifikat der CA.
 +
* Angabe der 'Fully Qualified Names' und bei 'www' auch des Domänennamens im Zertifikat, damit ein Redirekt möglich ist (<nowiki>z.B. von 'https://example.com' zu 'https://www.example.com'</nowiki>).
 +
* Dedizierte Zuertifikate, je Server; <u>keine</u> 'Sammelzertifikate' (Wildcard-Zertifikate, z.B. <span style="color:red;">*.example.com</span>)
 +
* Überwachung der Gültigkeit der Zertifikate
 +
* IP-Adressen in Zertifikaten <u>vermeiden</u>, <u>keine</u> [https://tools.ietf.org/html/rfc1918 RFC 1918]-Adressen (z.B. <span style="color:red;">192.168.1.1</span>)<br/>
 +
* stellen Sie die, zum Verifizieren benötigte Zertifikats-Kette auf dem Webserver zur Verfügung (auch die Zwischenzertifikate)
 +
<br/>
 +
<b>Testen der Einstellungen und des Zertifikats:</b>
 +
* [[Testing_for_SSL-TLS_%28OWASP-CM-001%29 | OWASP Testing Guide: Chapter on SSL/TLS Testing]]
 +
* [[O-Saft|OWASP 'O-Saft' (OWASP SSL audit for testers / OWASP SSL advanced forensic tool)]]
 +
* [https://www.ssllabs.com/ssltest SSL LABS Server Test]
 +
* weitere Tools: [[Testing_for_Weak_SSL/TSL_Ciphers,_Insufficient_Transport_Layer_Protection_%28OWASP-EN-002%29#References| Testing for Weak SSL/TSL Ciphers, Insufficient Transport Layer Protection (OWASP-EN-002) (DRAFT)]] - References - Tools
 +
<br/>
 +
Weitere Details im [[Transport_Layer_Protection_Cheat_Sheet|Transport Layer Protection Cheat Sheet]] und
 +
[[Testing_for_SSL-TLS|OWASP Testing Guide: Chapter on SSL/TLS Testing]].<br/>
 +
Links mit Beispielen für viele Plattformen:
 +
* [https://bettercrypto.org bettercrypto.org:] [https://bettercrypto.org/static/applied-crypto-hardening.pdf 'Applied Crypto Hardening (DRAFT)']
 +
* [https://wiki.mozilla.org/Security/Server_Side_TLS MozillaWiki: Security/Server Side TLS]
 +
{{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=right|title=2b|risk=6|year=2013|language=de}}
 +
;Absicherung der Transportschicht (auf dem Webserver - Teil 2)
 +
<b>Wirksamer Schutz gegen Man In The Middle-Angriffe</b><br/>
 +
Die Sicherheitskonfiguration unter Option 2a hat noch eine Schwachstelle, so das MITM (Man In The Middle attack) nicht zuverlässig verhindert wird. MITM erzeugt einen Zertifikatsfehler am Client, der üblicherweise aber (durch den Anwender) ignoriert wird. Deshalb wurde der HTTP-Header "HTTP Strict Transport Security (HSTS)" eingeführt. Damit werden kompatible Browser (Firefox, Chrome, Opera aber bisher NICHT IE) angewiesen, dass
 +
* der Browser den http-Request ausschließlich über https verschickt (auch falls die Seite mit http aufgerufen wird).
 +
* der Anwender Zertifikatsfehler im Browser nicht mehr ignorieren kann.
 +
<br/>
 +
Konfiguration im Apache:
 +
{{Top_10_2010:ExampleBeginTemplate|year=2013}}
 +
Header set Strict-Transport-Security
 +
: "max-age=16070400; includeSubDomains"
 
{{Top_10_2010:ExampleEndTemplate}}
 
{{Top_10_2010:ExampleEndTemplate}}
 +
<br/>
 +
Da der HSTS-Header nur über https übermittelt wird ist zusätzlich ein Redirect nötig:
 +
{{Top_10_2010:ExampleBeginTemplate|year=2013}}
 +
:  <VirtualHost *:80>
 +
::      ServerAlias *
 +
::      RewriteEngine On
 +
::      <nowiki>RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [redirect=301]</nowiki>
 +
:  </VirtualHost>
 +
{{Top_10_2010:ExampleEndTemplate}}
 +
<br/>
 +
;Quellen:
 +
 +
[[HTTP_Strict_Transport_Security|HTTP Strict Transport Security]]<br>
 +
[http://www.youtube.com/watch?v=zEV3HOuM_Vw&feature=youtube_gdata AppSecTutorial Series - Episode 4]
  
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=8|risk=7}}
+
{{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=references|position=left|risk=6|year=2013|language=de}}
 
{{Top_10_2010:SubSubsectionOWASPReferencesTemplate}}
 
{{Top_10_2010:SubSubsectionOWASPReferencesTemplate}}
  
Line 63: Line 331:
 
* [[Top_10_2007-Insecure_Cryptographic_Storage | OWASP Top 10-2007 on Insecure Cryptographic Storage]]
 
* [[Top_10_2007-Insecure_Cryptographic_Storage | OWASP Top 10-2007 on Insecure Cryptographic Storage]]
 
* [http://owasp-esapi-java.googlecode.com/svn/trunk_doc/latest/org/owasp/esapi/Encryptor.html ESAPI Encryptor API]
 
* [http://owasp-esapi-java.googlecode.com/svn/trunk_doc/latest/org/owasp/esapi/Encryptor.html ESAPI Encryptor API]
 +
* [[Guide_to_Cryptography#Insecure_transmission_of_secrets|OWASP Development Guide: Chapter on Cryptography]]
 +
* [[Codereview-Cryptography | OWASP Code Review Guide: Chapter on Cryptography]]
 +
* [[Cryptographic_Storage_Cheat_Sheet | OWASP Cryptographic Storage Cheat Sheet]]
 +
* [[Password_Storage_Cheat_Sheet | OWASP Password Storage Cheat Sheet]]
 +
* [[Transport_Layer_Protection_Cheat_Sheet|OWASP Transport Layer Protection Cheat Sheet]]
 +
* [[Testing_for_SSL-TLS|OWASP Testing Guide: Chapter on SSL/TLS Testing]]
 +
{{Top_10_2010:SubSubsectionExternalReferencesTemplate|language=de}}
 +
* [http://cwe.mitre.org/data/definitions/310.html CWE Entry 310 on Cryptographic Issues]
 +
* [http://cwe.mitre.org/data/definitions/312.html CWE Entry 312 on Cleartext Storage of Sensitive Information]
 +
* [http://cwe.mitre.org/data/definitions/326.html CWE Entry 326 on Weak Encryption]
 +
* [http://www.mindrot.org/projects/jBCrypt Reine Java Implementierung von BCrypt]
 +
* [https://github.com/wg/scrypt Beispielimplementierung von SCrypt]
 +
* [https://www.ssllabs.com/projects/best-practices/index.html SSL LABS: 'SSL/TLS Deployment Best Practices']
 +
* [https://www.bsi.bund.de/DE/Publikationen/TechnischeRichtlinien/tr02102/index_htm.html BSI TR-02102-2 Teil 2]
 +
* [https://bettercrypto.org bettercrypto.org:] [https://bettercrypto.org/static/applied-crypto-hardening.pdf 'Applied Crypto Hardening (DRAFT)']
 +
* [https://wiki.mozilla.org/Security/Server_Side_TLS MozillaWiki: Security/Server Side TLS]
 +
{{Top_10:SubsectionTableEndTemplate}}{{Top 10 DeveloperEdition:NavigationByHeadertab
 +
    |headertab=JAVA
 +
    |useprev=2013PrevHeaderTabDeveloperEdition
 +
    |usenext=2013NextHeaderTabDeveloperEdition
 +
    |prev=A5-{{Top_10_2010:ByTheNumbers
 +
              |5
 +
              |year=2013
 +
              |language=de}}
 +
    |next=A7-{{Top_10_2010:ByTheNumbers
 +
              |7
 +
              |year=2013
 +
              |language=de}}
 +
    |year=2013
 +
    |language=de
 +
}}
 +
 +
= '''PHP''' =
 +
{{Top_10:SubsectionTableBeginTemplate|type=headertab}} {{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=firstLeft|title=2|risk=6|year=2013|language=de}}
 +
Um vorerstellte Hash-Tabellen zu verhindern, kann jedem Datensatz eine zufällige Zeichenfolge hinzugefügt werden, welche als Salt (Deutsch: Salz) bezeichnet wird. Ein Beispiel für die sichere Erstellung eines Hashwerts ist im Folgendemn gegeben. Dafür muss das GIT-Projekt [https://github.com/ircmaxell/password_compat] eingebunden werden, ab PHP-Version 5.5 ist dies im Kern enthalten.
 +
Das Salt wird bspw. bei einem Linuxsystem in der Funktion password_hash() durch Zugriff auf /dev/urandom erstellt. Der Rückgabewert der Funktion ist eine Zeichenkette und beinhaltet u.a. den Hashwert, das Salt und den genutzten Algorithmus.
 +
Die Kosten, welche die Anzahl der Hash-Iterationen angeben, können über den dritten Parameter festgelegt werden.
 +
{{Top_10_2010:ExampleBeginTemplate|year=2013}}
 +
$options = [
 +
:    'cost' => 12,
 +
];<br/>
 +
$inputHash = password_hash($_GET['password'], CRYPT_SHA256, $options);<br/>
 +
storeHash($user, $inputHash); // Speichere Hash<br/>
 +
$hash = getHash($user); // Hole Hash aus der Datenbank<br/>
 +
// Prüfe eingegebenes Passwort gegen gespeichertes Passwort:<br/>
 +
$isPasswordVerified = password_verify($_GET['password'], $hash);<br/>
 +
if($isPasswordVerified) {
 +
: // Password korrekt
 +
} else {
 +
: throw new PasswordVerificationException("");
 +
}
 +
{{Top_10_2010:ExampleEndTemplate}}
 +
 +
{{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=references|position=right|risk=6|year=2013|language=de}}
 +
{{Top_10_2010:SubSubsectionOWASPReferencesTemplate}}
 +
 +
Einen umfangreicheren Überblick über die Anforderungen und die hierbei zu vermeidenden Probleme gibt es unter [http://www.owasp.org/index.php/ASVS#tab=ASVS ASVS requirements on Cryptography (V7)]. Des Weiteren:
 +
* [[Top_10_2007-Insecure_Cryptographic_Storage | OWASP Top 10-2007 on Insecure Cryptographic Storage]]
 
* [http://www.owasp.org/index.php/Guide_to_Cryptography#Insecure_transmission_of_secrets OWASP Development Guide: Chapter on Cryptography]
 
* [http://www.owasp.org/index.php/Guide_to_Cryptography#Insecure_transmission_of_secrets OWASP Development Guide: Chapter on Cryptography]
 
* [[Codereview-Cryptography | OWASP Code Review Guide: Chapter on Cryptography]]
 
* [[Codereview-Cryptography | OWASP Code Review Guide: Chapter on Cryptography]]
{{Top_10_2010_Developer_Edition_De:SubSubsectionExternalReferencesTemplate}}
+
{{Top_10_2010:SubSubsectionExternalReferencesTemplate|language=de}}
 
* [http://cwe.mitre.org/data/definitions/310.html CWE Entry 310 on Cryptographic Issues]
 
* [http://cwe.mitre.org/data/definitions/310.html CWE Entry 310 on Cryptographic Issues]
 
* [http://cwe.mitre.org/data/definitions/312.html CWE Entry 312 on Cleartext Storage of Sensitive Information]
 
* [http://cwe.mitre.org/data/definitions/312.html CWE Entry 312 on Cleartext Storage of Sensitive Information]
 
* [http://cwe.mitre.org/data/definitions/326.html CWE Entry 326 on Weak Encryption]
 
* [http://cwe.mitre.org/data/definitions/326.html CWE Entry 326 on Weak Encryption]
</td></tr></table>
+
* [http://www.php.net/manual/en/function.password-hash.php Funktionsweise der Funktion password_hash]
 +
{{Top_10:SubsectionTableEndTemplate}}{{Top 10 DeveloperEdition:NavigationByHeadertab
 +
    |headertab=PHP
 +
    |useprev=2013PrevHeaderTabDeveloperEdition
 +
    |usenext=2013NextHeaderTabDeveloperEdition
 +
    |prev=A5-{{Top_10_2010:ByTheNumbers
 +
              |5
 +
              |year=2013
 +
              |language=de}}
 +
    |next=A7-{{Top_10_2010:ByTheNumbers
 +
              |7
 +
              |year=2013
 +
              |language=de}}
 +
    |year=2013
 +
    |language=de
 +
}}
  
 
= '''Test''' =
 
= '''Test''' =
 
<!-- weitere Programmiersprachen oder evtl Anti-Beispiele --->
 
<!-- weitere Programmiersprachen oder evtl Anti-Beispiele --->
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=11|risk=7}}
+
{{Top_10:SubsectionTableBeginTemplate|type=headertab}} {{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=firstLeft|title=1|risk=6|year=2013|language=de}}
{{Top_10_2010:ExampleBeginTemplate}}
+
{{Top_10_2010:ExampleBeginTemplate|year=2013}}
tbd
+
tbd<br/>
 
Text
 
Text
 
{{Top_10_2010:ExampleEndTemplate}}
 
{{Top_10_2010:ExampleEndTemplate}}
  
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=4|risk=7}}
+
{{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=right|title=2|risk=6|year=2013|language=de}}
{{Top_10_2010:ExampleBeginTemplate}}
+
{{Top_10_2010:ExampleBeginTemplate|year=2013}}
tbd
+
tbd<br/>
 
Text
 
Text
 
{{Top_10_2010:ExampleEndTemplate}}
 
{{Top_10_2010:ExampleEndTemplate}}
  
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=6|risk=7}}
+
{{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=whole|title=|risk=6|year=2013|language=de}}
tbd
+
tbd<br/>
 
Text
 
Text
  
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=7|risk=7}}
+
{{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=userImpact|position=left|risk=6|year=2013|language=de}}
(ganze Breite)
+
(ganze Breite)<br/>
 
Text
 
Text
  
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=9|risk=7}}
+
{{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=references|position=right|risk=6|year=2013|language=de}}
</td></tr></table>
+
{{Top_10:SubsectionTableEndTemplate}}{{Top 10 DeveloperEdition:NavigationByHeadertab
 +
    |headertab=Test
 +
    |useprev=2013PrevHeaderTabDeveloperEdition
 +
    |usenext=2013NextHeaderTabDeveloperEdition
 +
    |prev=A5-{{Top_10_2010:ByTheNumbers
 +
              |5
 +
              |year=2013
 +
              |language=de}}
 +
    |next=A7-{{Top_10_2010:ByTheNumbers
 +
              |7
 +
              |year=2013
 +
              |language=de}}
 +
    |year=2013
 +
    |language=de
 +
}}
 
<headertabs />
 
<headertabs />
 
+
{{Top_10_2013_DeveloperEdition:BottomAdvancedTemplate
{{Top_10_2010_Developer_Edition_De:BottomAdvancedTemplate|type=0|usenext=NextLink_Germany_Projekte|next=Top_10_fuer_Entwickler/A8_Mangelhafter_URL-Zugriffsschutz|useprev=PrevLink_Germany_Projekte|prev=Top_10_fuer_Entwickler/A6 Sicherheitsrelevante Fehlkonfiguration}}
+
    |type=0
 
+
    |useprev=2013PrevLinkDeveloperEdition
 
+
    |usenext=2013NextLinkDeveloperEdition
[[Category:OWASP Top 10 fuer Entwickler]]
+
    |prev=A5-{{Top_10_2010:ByTheNumbers
 +
              |5
 +
              |year=2013
 +
              |language=de}}
 +
    |next=A7-{{Top_10_2010:ByTheNumbers
 +
              |7
 +
              |year=2013
 +
              |language=de}}
 +
    |year=2013
 +
    |language=de
 +
}}

Latest revision as of 04:34, 3 April 2014

BAUSTELLE! Hier entsteht das deutsche Wiki der OWASP Top 10 fuer Entwickler-2013

← 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)


Bedrohungsquelle Angriffsvektor Schwachstellen Technische Auswirkung Auswirkung auf das Unternehmen
Application Specific Ausnutzbarkeit
SCHWIERIG
Verbreitung
SELTEN
Auffindbarkeit
DURCHSCHNITTLICH
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.
Szenario 2: Ein Datensicherungsband speichert verschlüsselte Gesundheitsdaten, aber der Schlüssel ist ebenfalls dort gespeichert. Das Band geht auf dem Transportweg verloren.
Szenario 3: Die Passwortdatenbank benutzt Hashwerte ohne Salt zur Speicherung der Passwörter. Eine Schwachstelle in der Downloadfunktion ermöglicht einem Angreifer den Zugriff auf die Datei. Zu allen Hashes kann in vier Wochen ein passender Klartext gefunden werden. Bei starken Hashwerten mit Salt hätte dieser Angriff über 3000 Jahre gedauert.

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 vertraulichen Daten sollten Sie zumindest:

  1. Die Bedrohungen betrachten, vor denen Sie die Daten schützen wollen (z. B. Innen- und Außentäter) und sicherstellen, dass diese Daten angemessen durch Verschlüsselung geschützt werden.
  2. Sicherstellen, dass ausgelagerte Datensicherungen verschlüsselt sind und die Schlüssel getrennt verwaltet und gesichert werden.
  3. Sicherstellen, dass angemessene, starke Algorithmen und Schlüssel verwendet und verwaltet werden.
  4. Sicherstellen, dass Passwörter mit einem starken Algorithmus und einem angemessenen Salt gehasht werden.
  5. Sicherstellen, dass alle Schlüssel und Passwörter vor unberechtigtem Zugriff geschützt sind.
Example Attack Scenarios

temporär: Auszug aus Top 10-2013 RC1: A6-Sensitive_Data_Exposure

Scenario #1: An application encrypts credit card numbers in a database using automatic database encryption. However, this means it also decrypts this data automatically when retrieved, allowing an SQL injection flaw to retrieve credit card numbers in clear text. The system should have encrypted the credit card numbers using a public key, and only allowed back-end applications to decrypt them with the private key.

Scenario #2: A site simply doesn't use SSL for all authenticated pages. Attacker simply monitors network traffic (like an open wireless network), and steals the user’s session cookie. Attacker then replays this cookie and hijacks the user’s session, accessing all their private data.

Scenario #3: The password database uses unsalted hashes to store everyone’s passwords. A file upload flaw allows an attacker to retrieve the password file. All the unsalted hashes can be exposed with a rainbow table of precalculated hashes.

How Do I Prevent 'Sensitive Data Exposure'?

temporär: Auszug aus Top 10-2013 RC1: A6-Sensitive_Data_Exposure

The full perils of unsafe cryptography, SSL usage, and data protection are well beyond the scope of the Top 10. That said, for all sensitive data, do all of the following, at a minimum:

  1. Considering the threats you plan to protect this data from (e.g., insider attack, external user), make sure you encrypt all sensitive data at rest and in transit in a manner that defends against these threats.
  2. Don’t store sensitive data unnecessarily. Discard it as soon as possible. Data you don’t have can’t be stolen.
  3. Ensure strong standard algorithms and strong keys are used, and proper key management is in place.

Ensure passwords are stored with an algorithm specifically designed for password protection, such as bcrypt, PBKDF2, or scrypt.

  1. Disable autocomplete on forms collecting sensitive data and disable caching for pages displaying sensitive data.
[edit]

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();

Verteidigungs-Option 1 gegen 'Verlust der Vertraulichkeit sensibler Daten':
Absicherung der Transportschicht (beim Deployment)

Um die Verschlüsselung auf der Transportebene sollte sich der Entwickler nie selbst kümmern, sondern dies immer dem Webserver überlassen. Im J2EE-Deployment-Descriptor der Anwendung (= web.xml) ist die folgende Konfiguration vorzunehmen, um sicherzustellen, dass nur ausschließlich über https kommuniziert wird:

<security-constraint>

<web-resource-collection>
<web-resource-name>Protected Context</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>

</security-constraint>


Für Session-Cookies ist immer das Attribute SECURE zu setzen:

<session-config>

<cookie-config>
<secure>
true
</secure>
</cookie-config>

</session-config>


In der Server-Configuration ist sicherzustellen, dass nur TLS und SSL3 unterstützt werden. Das Speichern von vertraulichen Inhalten am Client oder auf einem Proxy kann über den Header Cache-Control verhindert werden:

Header set Cache-Control "no-cache, no store, must-revalidate"

Weitere Hinweise im Transport Layer Protection Cheat Sheet

Verteidigungs-Option 2a gegen 'Verlust der Vertraulichkeit sensibler Daten':
Absicherung der Transportschicht (auf dem Webserver - Teil 1)

Sichere Verschlüsselung

  • Nutzen Sie aktuelle Empfehlungen zur SSL/TLS-Sicherheit, das Thema ist derzeit sehr(!) dynamisch. Z.B.:
  • aktuelle Verschlüsselungsbibliotheken einsetzen, die aktuelle Protokolle und Verfahren unterstützen
  • Nur sichere Verschlüsselungsprotokolle unterstützen (TLS1.2, TLS1.1, ggf auch TLS1.0)
  • Die Verschlüsselungsverfahren auf dem Server priorisieren
  • sichere, ephemerale Verschlüsselungsverfahren (Cipher-Suites), die 'Forward Secrecy' unterstützen (z.B. DHE_RSA, ECDHE_RSA) mit hoher Prio versehen.
  • sichere Schlüssellängen für assymetrische und symmetrische Verfahren (gem. BSI TR-02102 Teil 2):
  • Schlüsseleinigung und Authentisierung: DHE, RSA, DSS: 2000 bits bzw. (nach 2015:) 3000 bits für RSA; ECDHE: 224 bzw. (nach 2015:) 250 bits
  • (symmetrische) Verschlüsselung: AES: 128 bits
  • RC4 und andere schwache Cipher vermeiden, ohne den Zugriff von (noch) unterstützten Browsern, oder Suchmaschinen-Bots (Webcrawlern) zu verlieren.
  • Richtlinie erstellen, welche Browser und Betriebssysteme, unterstützt werden sollen, sowie welche Protokolle und welche Cipher für die verschlüsselte Verbindung jeweils ausgewählt werden sollen (z.B. vorübergehend noch SSLv3, TLS_RSA_WITH_3DES_EDE_CBC_SHA).
  • TLS/SSL-Konfiguration des Webservers härten:
  • nur sichere Server-initiierte Renegotiation
  • keine Komprimierung
  • Einstellungen aller virtuellen Server (virtualHosts) prüfen
  • Bei Einsatz von Server Name Indication (SNI), prüfen, welcher Server der Default-Server ist. Alte Browser bzw. Betriebssysteme, ohne SNI-Unterstützung erreichen nur diesen!
  • Prüfen der, von der installierten OpenSSL-Version unterstützten Cipher
  • Konfigurations-Beispiel für Apache:

SSLProtocol +TLSv1.2 +TLSv1.1 +TLSv1
SSLCompression off
SSLHonorCipherOrder on
#<in Diskussion:>
SSLCipherSuite 'EDH+aRSA+AESGCM:EDH+aRSA+AES:DHE-RSA-AES256-SHA:-DHE-RSA-AES128-SHA:EECDH+AESGCM:EECDH+AES:RSA+AESGCM:RSA+AES+SHA:DES-CBC3-SHA'

Anmerkungen: Der Cipher-String mit den SSL-Cipher-Suites wurde als (weitgehend) Whitelist formuliert, um die Kompatibilität mit alten Versionen von OpenSSL zu erhöhen.
Das Verfahren 'DHE-RSA-AES128-SHA' wird unterdrückt, da ältere Internet-Explorer- und Java-Versionen keine Diffie-Hellman-Schlüssellängen > 1024 bit unterstützen
Überwachen Sie die Performance Ihres Servers, der Verbindungsaufbau mit DHE ist CPU-intensiver als mit ECDHE

  • Prüfen der Cipher-Einstellungen mittels openssl:

#<in Diskussion:>
openssl ciphers -V EDH+aRSA+AESGCM:EDH+aRSA+AES:DHE-RSA-AES256-SHA:-DHE-RSA-AES128-SHA:EECDH+AESGCM:EECDH+AES:RSA+AESGCM:RSA+AES+SHA:DES-CBC3-SHA
A-AES128-SHA:EECDH+AESGCM:EECDH+AES:RSA+AESGCM:RSA+AES+SHA:DES-CBC3-SHA

  0x00,0x9F - DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH       Au=RSA  Enc=AESGCM(256) Mac=AEAD
  0x00,0x9E - DHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=DH       Au=RSA  Enc=AESGCM(128) Mac=AEAD
  0x00,0x6B - DHE-RSA-AES256-SHA256   TLSv1.2 Kx=DH       Au=RSA  Enc=AES(256)  Mac=SHA256
  0x00,0x39 - DHE-RSA-AES256-SHA      SSLv3 Kx=DH       Au=RSA  Enc=AES(256)  Mac=SHA1
  0x00,0x67 - DHE-RSA-AES128-SHA256   TLSv1.2 Kx=DH       Au=RSA  Enc=AES(128)  Mac=SHA256
  0xC0,0x30 - ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(256) Mac=AEAD
  0xC0,0x2C - ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(256) Mac=AEAD
  0xC0,0x2F - ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(128) Mac=AEAD
  0xC0,0x2B - ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(128) Mac=AEAD
  0xC0,0x28 - ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA384
  0xC0,0x24 - ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA384
  0xC0,0x14 - ECDHE-RSA-AES256-SHA    SSLv3 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA1
  0xC0,0x0A - ECDHE-ECDSA-AES256-SHA  SSLv3 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA1
  0xC0,0x27 - ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA256
  0xC0,0x23 - ECDHE-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA256
  0xC0,0x13 - ECDHE-RSA-AES128-SHA    SSLv3 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA1
  0xC0,0x09 - ECDHE-ECDSA-AES128-SHA  SSLv3 Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA1
  0x00,0x9D - AES256-GCM-SHA384       TLSv1.2 Kx=RSA      Au=RSA  Enc=AESGCM(256) Mac=AEAD
  0x00,0x9C - AES128-GCM-SHA256       TLSv1.2 Kx=RSA      Au=RSA  Enc=AESGCM(128) Mac=AEAD
  0x00,0x35 - AES256-SHA              SSLv3 Kx=RSA      Au=RSA  Enc=AES(256)  Mac=SHA1
  0x00,0x2F - AES128-SHA              SSLv3 Kx=RSA      Au=RSA  Enc=AES(128)  Mac=SHA1
  0x00,0x0A - DES-CBC3-SHA            SSLv3 Kx=RSA      Au=RSA  Enc=3DES(168) Mac=SHA1


sichere Zertifikate

  • Nutzen Sie eine vertrauenswürdige Zertifizierungsstelle (CA) für öffentlich erreichbare, verschlüsselte Webserver; Prüfen Sie die Vergabe-Politik der CA.
  • zeitgemäße, starke Verfahren mit sicheren Schlüssellängen (vgl. BSI TR-02102-2 Teil 2: 2000 bits bzw. (nach 2015:) 3000 bits für RSA), auch für alle Zwischenzertifikate und das Root-Zertifikat der CA.
  • Angabe der 'Fully Qualified Names' und bei 'www' auch des Domänennamens im Zertifikat, damit ein Redirekt möglich ist (z.B. von 'https://example.com' zu 'https://www.example.com').
  • Dedizierte Zuertifikate, je Server; keine 'Sammelzertifikate' (Wildcard-Zertifikate, z.B. *.example.com)
  • Überwachung der Gültigkeit der Zertifikate
  • IP-Adressen in Zertifikaten vermeiden, keine RFC 1918-Adressen (z.B. 192.168.1.1)
  • stellen Sie die, zum Verifizieren benötigte Zertifikats-Kette auf dem Webserver zur Verfügung (auch die Zwischenzertifikate)


Testen der Einstellungen und des Zertifikats:


Weitere Details im Transport Layer Protection Cheat Sheet und OWASP Testing Guide: Chapter on SSL/TLS Testing.
Links mit Beispielen für viele Plattformen:

Verteidigungs-Option 2b gegen 'Verlust der Vertraulichkeit sensibler Daten':
Absicherung der Transportschicht (auf dem Webserver - Teil 2)

Wirksamer Schutz gegen Man In The Middle-Angriffe
Die Sicherheitskonfiguration unter Option 2a hat noch eine Schwachstelle, so das MITM (Man In The Middle attack) nicht zuverlässig verhindert wird. MITM erzeugt einen Zertifikatsfehler am Client, der üblicherweise aber (durch den Anwender) ignoriert wird. Deshalb wurde der HTTP-Header "HTTP Strict Transport Security (HSTS)" eingeführt. Damit werden kompatible Browser (Firefox, Chrome, Opera aber bisher NICHT IE) angewiesen, dass

  • der Browser den http-Request ausschließlich über https verschickt (auch falls die Seite mit http aufgerufen wird).
  • der Anwender Zertifikatsfehler im Browser nicht mehr ignorieren kann.


Konfiguration im Apache:

Header set Strict-Transport-Security

"max-age=16070400; includeSubDomains"


Da der HSTS-Header nur über https übermittelt wird ist zusätzlich ein Redirect nötig:

<VirtualHost *:80>
ServerAlias *
RewriteEngine On
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [redirect=301]
</VirtualHost>


Quellen

HTTP Strict Transport Security
AppSecTutorial Series - Episode 4

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 2 gegen 'Verlust der Vertraulichkeit sensibler Daten':

Um vorerstellte Hash-Tabellen zu verhindern, kann jedem Datensatz eine zufällige Zeichenfolge hinzugefügt werden, welche als Salt (Deutsch: Salz) bezeichnet wird. Ein Beispiel für die sichere Erstellung eines Hashwerts ist im Folgendemn gegeben. Dafür muss das GIT-Projekt [1] eingebunden werden, ab PHP-Version 5.5 ist dies im Kern enthalten. Das Salt wird bspw. bei einem Linuxsystem in der Funktion password_hash() durch Zugriff auf /dev/urandom erstellt. Der Rückgabewert der Funktion ist eine Zeichenkette und beinhaltet u.a. den Hashwert, das Salt und den genutzten Algorithmus. Die Kosten, welche die Anzahl der Hash-Iterationen angeben, können über den dritten Parameter festgelegt werden.

$options = [

'cost' => 12,

];
$inputHash = password_hash($_GET['password'], CRYPT_SHA256, $options);
storeHash($user, $inputHash); // Speichere Hash
$hash = getHash($user); // Hole Hash aus der Datenbank
// Prüfe eingegebenes Passwort gegen gespeichertes Passwort:
$isPasswordVerified = password_verify($_GET['password'], $hash);
if($isPasswordVerified) {

// Password korrekt

} else {

throw new PasswordVerificationException("");

}

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 'Verlust der Vertraulichkeit sensibler Daten':

tbd
Text

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

tbd
Text

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

tbd
Text

Auswirkung(en) auf den Benutzer

(ganze Breite)
Text

Referenzen

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

Die Top-10-Risiken

A7-Fehlerhafte Autorisierung auf Anwendungsebene →

© 2002-2013 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