質問

C# (.Net 3.5) で SecureString (キャッシュされたパスフレーズ) を子プロセスに渡せるようにしたいのですが、最も安全な方法がわかりません。たとえば、SecureString を通常の文字列に変換してコマンドライン引数として渡す場合、 考える この値はディスク ページングの傾向にある可能性があります。これにより、プレーンテキストがファイル システムに触れるようになり、SecureString を使用する意味が台無しになります。

代わりに SecureString の IntPtr を渡すことはできますか?リスクを増やさずに名前付きパイプを使用できますか?

役に立ちましたか?

解決

一般に、より特殊な攻撃について心配する前に、脅威モデルを定義する必要があります。この場合:誰かがコンピュータをシャットダウンして、ハードドライブのフォレンジック分析を行うのではないかと心配していますか?アプリケーション メモリも交換できるため、単純な事実として、 1つ プロセスはそれをメモリ内に保持しているため、スワップ ファイルで終了する可能性があります。冬眠についてはどうですか?ハイバネーション中に、メモリの内容全体がハードディスクに書き込まれます (SecureString とおそらく暗号化キーも含まれます)。攻撃者がシステムにアクセスできたらどうなるか 実行中 アプリケーションのメモリを検索できるでしょうか?

一般に、クライアント側のセキュリティは非常に扱いが難しく、専用のハードウェア (TPM チップなど) がない限り、適切にセキュリティを確立することはほぼ不可能です。解決策としては次の 2 つが考えられます。

  • 2 つの文字列間の等しいかどうかをテストする必要があるだけの場合 (例:この文字列は以前のものと同じですか)、その (ソルト化された) ハッシュ値のみを保存します。
  • 二度目に情報が必要になったときにユーザーに情報を再入力させる (あまり便利ではありませんが、セキュリティと利便性は相反するものです)

他のヒント

子プロセスも SecureString の操作方法を理解していない限り、それを直接渡す方法はないと思います。たとえば、Process.Start() メソッドには SecureString を受け取る 2 つのオーバーロードがあるため、実際の文字列値が盗聴されるリスクは最小限に抑えられます (途中のどこかで実際の値を取得/アンマーシャリングする必要があるため、その可能性は依然としてあります)。

これを行う方法の多くは、子プロセスが何であるか、およびそれがどのように開始されるかによって決まると思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top