Applikationsschutz per Kryptographie
Artikel erschienen in Swiss IT Magazine 2007/09
Die Kryptografie hat in den vergangenen Jahren keine für den Endbenutzer nützlichen relevanten Fortschritte gemacht – im Bereich der Angriffe hingegen gibt es einige neue Möglichkeiten, Verfahren zu brechen, die einige Jahre zuvor noch als sicher galten. Am bekanntesten sind sicherlich die Angriffe auf das SHA1-Prüfsummenverfahren im Sommer 2006, das inzwischen als unsicher gilt und deshalb in der Entwicklung von Anwendungen nicht mehr verwendet werden sollte.
Trotzdem bietet die Kryptografie einen grossen Fundus an Verfahren, die – wenn sie korrekt und angemessen eingesetzt werden – als ausreichend sicher für beliebige Anwendungen gelten dürfen.
Auch wenn sich Kryptografie im eigentlichen Sinne mit der Verschlüsselung von Daten beschäftigt, gibt es noch zwei weitere Anwendungsfälle: das Hashen von Daten, um deren Authentizität sicherzustellen, sowie das Signieren von Daten, um deren Urheber ermitteln zu können.
Das Prinzip, das diesen drei Varianten zugrunde liegt, ist jedoch fast immer das gleiche: Die Ursprungsdaten, die in der Regel als Klartext bezeichnet werden, werden mit einem (geheimen) Schlüssel verarbeitet, woraus sich der Geheimtext ergibt. Diesen kann man mit einem weiteren (geheimen) Schlüssel wieder in den Klartext zurückverwandeln. Die Sicherheit einer Verschlüsselung steht und fällt dabei durch zwei Faktoren: zum einen mit der Sicherheit des Verfahrens an sich, zum anderen mit der Sicherheit der verwendeten Schlüssel.
Bei den Verschlüsselungsverfahren wiederum wird zwischen zwei Ansätzen unterschieden – den symmetrischen und den asymmetrischen Verfahren. Der Unterschied liegt darin, dass bei den symmetrischen Verfahren der zur Verschlüsselung verwendete Schlüssel auch zur Entschlüsselung genutzt wird, bei den asymmetrischen Verfahren hingegen werden zwei verschiedene Schlüssel verwendet.
Die beste Verschlüsselung nützt nichts, wenn es einem Angreifer gelingt, die Sitzung eines legitimen Benutzers zu übernehmen. Häufig findet man entsprechende Möglichkeiten in einfacheren Webshops, in denen die Identität eines Benutzers beispielsweise nur über dessen Session-ID ermittelt wird.
Ein Angreifer kann in einem solchen Fall versuchen, Session-IDs zu erraten, oder einen legitimen Benutzer dazu bringen, seine Session-ID offenzulegen, indem er beispielsweise die URL der Seite, auf der er sich gegenwärtig befindet, weitergibt – wobei diese die Session-ID enthält. Dies kann bereits in einem harmlosen Kontext geschehen, wenn beispielsweise der legitime Benutzer einen Link auf ein Produkt weitergeben will, er allerdings zugleich angemeldet ist.
Neben aufmerksamen Benutzern ist der einzige Schutz gegen Sitzungsübernahmen ein Mechanismus auf dem Webserver, der sicherstellt, dass eine Session zeitgleich nur von einem Client genutzt werden kann, indem beispielsweise zu jeder Session die zugehörige IP gespeichert und bei jedem Zugriff verglichen wird. Die Regel lautet also:
- Verhindern Sie, dass eine Session zeitgleich von mehreren Clients genutzt werden kann.
Neben einer Sitzungsübernahme, die quasi synchron zur legitimen Benutzung stattfindet, kann ein Angreifer auch versuchen, eine Sitzung erneut ablaufen zu lassen, was als «Sitzungs-Replay» bezeichnet wird. Ein häufig eingesetztes Verfahren hierfür ist, das Session-Cookie eines Benutzers beispielsweise per Cross-Site-Scripting (XSS) oder durch einen Lauschangriff auf das Netzwerk zu ermitteln und dieses dann später selbst weiterzuverwenden. Auch hier hilft nur, Sessions zum einen an die IP zu binden, zum anderen Anfragen eine fortlaufende Nummer zuzuordnen, so dass die gleiche Anfrage nicht mehrfach gestellt werden kann. Die Regel lautet hierfür demnach:
- Verhindern Sie, dass Anfragen einer Session mehrfach und von verschiedenen Clients ausgeführt werden können.
Auch im Zusammenhang mit der Sitzungsverwaltung können Man-in-the-middle-Angriffe durchgeführt werden. Hierbei wird dem Benutzer vom Angreifer vorgespiegelt, er würde mit dem eigentlichen Server kommunizieren. Statt dessen fängt der Angreifer die Daten ab, leitet diese seinerseits an den Server weiter und sendet die erhaltenen Antworten wiederum an den Benutzer. Eine Verschlüsselung der Verbindung ist zwar hilfreich, da aber auch die Verschlüsselung gegen solche Angriffe nicht gefeit ist, ist hierbei der Einsatz von vertrauenswürdigen Zertifikaten ratsam.
- Setzen Sie nur vertrauenswürdige Zertifikate ein, die von entsprechenden Trust-Centern ausgestellt wurden.
Ein weiterer Angriffspunkt, der mit der Verschlüsselung zusammenhängt, ist das Speichern sensitiver Daten. Werden beispielsweise Kennwörter im Klartext gespeichert, reicht es aus, wenn die zugehörige Datenbank kompromittiert wird, um das ganze System zu kompromittieren. Um sich gegen solche Angriffe zu schützen, bietet es sich an, vertrauliche Daten verschlüsselt zu speichern.
Zu beachten ist allerdings, dass verschlüsselte Daten nicht mehr effizient durchsucht werden können, so dass der Zugriff unter Umständen nur äusserst langsam erfolgen kann. Für Kennwörter bietet sich dieses Verfahren allerdings an, indem nur der verschlüsselte Fingerabdruck gespeichert wird. Gibt ein Benutzer sein Kennwort ein, wird auch von diesem der verschlüsselte Fingerabdruck ermittelt und mit dem gespeicherten verglichen. Auf diese Art muss das Klartext-Kennwort nicht übertragen werden.
- Speichern Sie sensitive Daten gegebenenfalls verschlüsselt. Im Falle von Kennwörtern nutzen Sie die Möglichkeit, lediglich einen Fingerabdruck abzulegen.
So verhindern Sie auch, dass Kennwörter durch Abhören des Netzwerks in falsche Hände fallen. Um das Abhören des Netzwerks generell zu verhindern, bietet sich an, sämtlichen Datentransfer zu verschlüsseln.
Schliesslich muss noch verhindert werden, dass Daten manipuliert werden. Dazu bietet es sich an, die schützenswerten Daten mit einer Prüfsumme zu versehen und diese zu signieren. Sendet der Benutzer diese Daten beispielsweise im Rahmen eines Postback einer Webseite an die Webanwendung zurück, kann der Server die Daten zum einen erneut mit einer Prüfsumme versehen und die beiden Prüfsummen anschliessend vergleichen, zum anderen kann er die Authentizität der ursprünglichen Prüfsumme anhand der digitalen Signatur sicherstellen.
- Versehen Sie Daten, die vom Server an den Client und von diesem wieder zurückgesendet werden, mit einer Prüfsumme und signieren Sie diese.
Kennwort-Speicherung per Hash
Um die Sicherheit einer Webanwendung und speziell ihrer Daten sicherzustellen, bieten sich Verschlüsselung, Prüfsummen und digitale Signaturen an. Dabei ist es allerdings wichtig, auf die Auswahl der verwendeten Verfahren zu achten, um sich böse Überraschungen zu ersparen. Insgesamt lassen sich alle Überlegungen zu dieser Thematik in zwei Stichpunkte zusammenfassen:
- Wenden Sie erprobte Verfahren an, deren Sicherheit bewiesen ist, statt eigene zu implementieren.
- Verlassen Sie sich niemals auf eine Sicherheit, die lediglich durch das Verbergen von Implementierungsdetails entsteht («Security by obscurity»).