none
Sicherheit von SecureString RRS feed

  • Frage

  • Hallo,

    der SecureString-Klasse wird gemeinhin nachgesagt, sie sei sicher und würde die Benutzerdaten gut schützen. Und Im groben und ganzen ist die Klasse auch gut implementiert. Dennoch gibt es einige Kritikpunkte, die ich hier einfach mal benennen wollte.

    Fühlt euch frei eure eigene Meinung dazu hier zu schreiben. Ich würde mich freuen zu hören, wie ihr es seht.

    1) Das einmal erstelle Objekt kann nicht direct gelöscht werden. Die genaue Aussage dazu lautet:

    there is a risk the information could be revealed after it is used because your application cannot delete the data from computer memory. [Quelle: MSDN]

    2) Ferner wird der Text auch nicht die ganze Zeit Im Speicher verschlüsselt gehalten. Während der Änderung des Strings wird dieser komplett entschlüsselt um dann die Änderung auszuführen und anschließend wieder zu verschlüsseln.

    Siehe dazu auch den Quellecode der Klasse.

    Es dürfte damit für einen Debugger eigentlich kein Problem sein, sich an dieser Stelle einzuhacken und damit den ungeschützen Datensatz einfach mitzulesen.

    Währe es denn nicht Möglich nur den neuen Wert (neuer string, neues Zeichen) zu verschlüsseln und damit die Angriffsfläche zu verkleiner.

    Allgemein würde ich auch behaupten, dass es eigentlich keine wirklich gute Schutzfunktion in c#/.NET geben kann, weil sich der Eingriff in den Speicher und Codelfuss gut Machen lässt, die Sprach sehr offen ist und man kaum wirklichen Zugriff auf den Speicher hat (wie in c++ problemlos möglich).

    Was haltet ihr davon?

    Thomas


    © 2015 Thomas Roskop
    Germany //  Deutschland

    Montag, 6. Juli 2015 18:11

Alle Antworten

  • Hallo Thomas,

    ich stehe der SecureString-Klasse auch eher skeptisch gegenüber. Das Problem was ich als erstes darin sah war, dass zwar die Daten verschlüsselt sind, aber der Algorithmus zum Entschlüsseln bekannt ist. Wie du auch selbst schreibst ist die Sicherheit hinfällig sobald man das Problem ausführlicher Debuggt.

    SecureString schützt die Daten nur soweit es überhaupt möglich ist. Das heißt das ein einfaches scannen des Arbeitsspeichers nichts bringt - aber wir die Daten haben will bekommt sie trotzdem. Es ist mehr eine Stolperfalle wie ein Tresor.

    Die Frage ist auch immer wofür man die Klasse eigentlich einsetzt. Vom Benutzer eingegebene Daten darin zu speichern macht nur Sinn wenn mehrere Menschen am selben PC wärend der gleichen Session arbeiten. Wobei dort auch schon wieder das Rechtesystem von Windows greift. Das meiste andere ist sowieso auf andere PCs/Server ausgelagert (Datenbanken, File Storage, ...). Es scheitert demnach schon an der Motivation oder den Möglichkeiten den Arbeitsspeicher zu analysieren.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Montag, 6. Juli 2015 18:53