Pergunta

Gostaria de poder passar um SecureString (uma senha em cache) para um processo filho em C# (.Net 3.5), mas não sei qual é a maneira mais segura de fazer isso.Se eu convertesse o SecureString de volta em uma string normal e o passasse como um argumento de linha de comando, por exemplo, então eu pensar o valor pode estar sujeito à paginação do disco - o que faria com que o texto simples tocasse o sistema de arquivos e arruinaria o uso do SecureString.

O IntPtr para SecureString pode ser passado?Posso usar um pipe nomeado sem aumentar o risco?

Foi útil?

Solução

Em geral, você deve definir seu modelo de ameaça antes de se preocupar com ataques mais exóticos.Nesse caso:você está preocupado que alguém desligue o computador e faça uma análise forense do disco rígido?A memória do aplicativo também pode ser trocada, então o simples fato de um o processo o possui na memória, torna potencialmente possível que ele termine no arquivo de troca.E quanto à hibernação?Durante a hibernação, todo o conteúdo da memória é gravado no disco rígido (incluindo o SecureString - e presumivelmente a chave de criptografia!).E se o invasor tiver acesso ao sistema enquanto está funcionando e pode pesquisar na memória dos aplicativos?

Em geral, a segurança do lado do cliente é muito complicada e, a menos que você tenha hardware dedicado (como um chip TPM), é quase impossível acertar.Duas soluções seriam:

  • Se você precisar apenas testar a igualdade entre duas strings (ou seja:esta string é a mesma que eu tinha anteriormente), armazene apenas um valor hash (salgado) dela.
  • Fazer com que o usuário insira novamente as informações quando for necessário uma segunda vez (não é muito conveniente, mas segurança e conveniência se opõem)

Outras dicas

A menos que seu processo filho também entenda como trabalhar com SecureString, não acho que haja uma maneira de transmiti-lo diretamente.Por exemplo, o método Process.Start() tem duas sobrecargas que usam um SecureString, portanto, o risco de o valor real da string ser detectado é minimizado (ainda é possível, pois em algum lugar ao longo do caminho o valor real deve ser recuperado/desempacotado).

Acho que muito de como fazer isso dependerá de qual é o processo filho e como ele está sendo iniciado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top