Frage

Ich würde gerne einen SecureString (eine zwischengespeicherte Passphrase) an einen untergeordneten Prozess in C# (.Net 3.5) übergeben können, weiß aber nicht, wie das am sichersten geht.Wenn ich den SecureString zurück in einen regulären String konvertieren und ihn beispielsweise als Befehlszeilenargument übergeben würde, dann würde ich denken Der Wert ist möglicherweise anfällig für Festplatten-Paging, was dazu führen würde, dass der Klartext das Dateisystem berührt und den Sinn der Verwendung von SecureString zunichte macht.

Kann stattdessen der IntPtr für den SecureString übergeben werden?Könnte ich eine Named Pipe verwenden, ohne das Risiko zu erhöhen?

War es hilfreich?

Lösung

Im Allgemeinen sollten Sie Ihr Bedrohungsmodell definieren, bevor Sie sich über exotischere Angriffe Gedanken machen.In diesem Fall:Befürchten Sie, dass jemand den Computer herunterfährt und eine forensische Analyse der Festplatte durchführt?Der Anwendungsspeicher kann auch ausgetauscht werden, so dass die einfache Tatsache besteht eins Wenn der Prozess es im Speicher hat, ist es möglicherweise möglich, dass es in der Auslagerungsdatei endet.Wie wäre es mit dem Winterschlaf?Im Ruhezustand wird der gesamte Inhalt des Speichers auf die Festplatte geschrieben (einschließlich des SecureStrings – und vermutlich des Verschlüsselungsschlüssels!).Was passiert, wenn der Angreifer Zugriff auf das System hat? während es läuft und kann den Speicher von Anwendungen durchsuchen?

Im Allgemeinen ist die clientseitige Sicherheit sehr schwierig und ohne dedizierte Hardware (z. B. einen TPM-Chip) ist es fast unmöglich, dies richtig zu machen.Zwei Lösungen wären:

  • Wenn Sie nur die Gleichheit zwischen zwei Zeichenfolgen testen müssen (z. B.:Ist dieser String derselbe wie der, den ich zuvor hatte), speichere nur einen (gesalzenen) Hashwert davon.
  • Lassen Sie den Benutzer die Informationen erneut eingeben, wenn sie ein zweites Mal benötigt werden (nicht sehr praktisch, aber Sicherheit und Bequemlichkeit stehen im Widerspruch zueinander)

Andere Tipps

Ich glaube nicht, dass es eine Möglichkeit gibt, es direkt zu übergeben, es sei denn, Ihr untergeordneter Prozess versteht auch, wie man mit SecureString arbeitet.Beispielsweise verfügt die Process.Start()-Methode über zwei Überladungen, die einen SecureString annehmen, sodass das Risiko, dass der tatsächliche String-Wert ausgespuckt wird, minimiert wird (dies ist immer noch möglich, da irgendwo auf dem Weg der tatsächliche Wert abgerufen/entmarshallt werden muss).

Ich denke, dass die Vorgehensweise weitgehend davon abhängt, um welchen untergeordneten Prozess es sich handelt und wie er gestartet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top