.Net 3.5, самый безопасный способ передачи строки между процессами

StackOverflow https://stackoverflow.com/questions/46693

  •  09-06-2019
  •  | 
  •  

Вопрос

Я хотел бы иметь возможность передать SecureString (кэшированную парольную фразу) дочернему процессу на С# (.Net 3.5), но я не знаю, какой самый безопасный способ сделать это.Если бы мне пришлось преобразовать SecureString обратно в обычную строку и передать ее, например, в качестве аргумента командной строки, то я бы думать значение может быть склонно к подкачке диска, что приведет к тому, что открытый текст коснется файловой системы и лишит смысла использование SecureString.

Можно ли вместо этого передать IntPtr для SecureString?Могу ли я использовать именованный канал без увеличения риска?

Это было полезно?

Решение

В общем, вам следует определить свою модель угроз, прежде чем беспокоиться о более экзотических атаках.В этом случае:Вы обеспокоены тем, что кто-то выключит компьютер и проведет судебно-медицинскую экспертизу жесткого диска?Память приложения также можно заменить, поэтому простой факт, что один процесс имеет его в памяти, что потенциально делает возможным его завершение в файле подкачки.А как насчет спящего режима?Во время спящего режима все содержимое памяти записывается на жесткий диск (включая SecureString и, предположительно, ключ шифрования!).Что делать, если злоумышленник получил доступ к системе пока он работает а может поиск по памяти приложений?

В целом безопасность на стороне клиента очень сложна, и если у вас нет специального оборудования (например, чипа TPM), ее практически невозможно реализовать правильно.Два решения:

  • Если вам нужно только проверить равенство между двумя строками (т.е.:эта строка такая же, как та, что была у меня ранее), сохраните только ее (соленое) хеш-значение.
  • Заставить пользователя повторно ввести информацию, когда она понадобится второй раз (не очень удобно, но безопасность и удобство противопоставлены друг другу)

Другие советы

Если ваш дочерний процесс не понимает, как работать с SecureString, я не думаю, что есть способ передать его напрямую.Например, метод Process.Start() имеет две перегрузки, которые принимают SecureString, поэтому риск перехвата фактического строкового значения сводится к минимуму (это все еще возможно, поскольку где-то по пути фактическое значение должно быть получено/демаршализовано).

Я думаю, что во многом то, как это сделать, будет зависеть от того, что представляет собой дочерний процесс и как он запускается.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top