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


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

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

2 4

2 ответа:

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

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

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

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

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