C# (.Net 3.5) の子プロセスに SecureString (キャッシュされたパスフレーズ) を渡せるようにしたいのですが、最も安全な方法がわかりません。たとえば、SecureStringを通常の文字列に変換してコマンドライン引数として渡すと、その値はディスクページングを起こしやすくなる可能性があると思います. SecureString の使用について。
代わりに SecureString の IntPtr を渡すことはできますか? リスクを増やさずに名前付きパイプを使用できますか?
一般に、よりエキゾチックな攻撃について心配する前に、脅威モデルを定義する必要があります。この場合: 誰かがコンピュータをシャットダウンし、ハードドライブのフォレンジック分析を行うのではないかと心配していますか? アプリケーション メモリもスワップ アウトできるため、1 つのプロセスがメモリ内にアプリケーション メモリを持っているという単純な事実によって、そのプロセスがスワップ ファイルで終了する可能性があります。冬眠はどうですか?ハイバネーション中に、メモリの内容全体がハードディスクに書き込まれます (SecureString と、おそらく暗号化キーも含まれます!)。攻撃者が実行中のシステムにアクセスし、アプリケーションのメモリを検索できる場合はどうなるでしょうか?
一般に、クライアント側のセキュリティは非常に複雑で、専用のハードウェア (TPM チップなど) を使用しない限り、正しく行うことはほとんど不可能です。2つの解決策は次のとおりです。
子プロセスも SecureString の操作方法を理解していない限り、それを直接渡す方法はないと思います。たとえば、Process.Start() メソッドには SecureString を受け取る 2 つのオーバーロードがあるため、実際の文字列値が傍受されるリスクは最小限に抑えられます (途中で実際の値を取得/非整列化する必要があるため、可能です)。
これを行う方法の多くは、子プロセスが何であるか、およびそれがどのように開始されているかに依存すると思います。