Stack Overflow em Português Asked on December 30, 2021
Quando se cria uma variável, é alocado um valor na memória para ela, que pode ser acessada por qualquer sistema por fora a partir do endereço daquela memória.
Criando um arquivo para armazenar o conteúdo duma variável iria também criar um local do arquivo, que também poderia ser acessado pela memória.
Eu precisava criar uma variável cujo conteúdo não seja acessível pela memória, nem por qualquer aplicativo que tenta injetar o valor nela. Nesta variável será armazenado o resultado após uma descriptografia que não poderia ser acessada por nada, e após o uso deste conteúdo, seria “destruído” todo o conteúdo usado, não deixando rastros na memória.
É possível criar uma variável que “Esconde o seu conteúdo”, ou que ela faça que apenas quem criou a variável possa ler ela?
Sua preocupação é dump e injeção de memória, o que eu te digo, as plataformas comuns de mercado são todas depuráveis.
O que pode fazer:
Sua aplicação tem um par de chaves (RSA).
A aplicação codifica utilizando a chave pública e armazena na memória os dados criptografados.
Quando é necessário utilizar os dados, os decodifica utilizando sua chave privada e faz todo o trabalho com os dados plenos o mais rápido possível.
Note que há uma janela de tempo em que os dados plenos estão em memória, por mais que use teoria do caos e etc.. para realizar esse processo, os dados plenos passarão pela memória.
Note também que o mecanismo de criptografia assimétrica se baseia no fato de seu aplicativo ser o único portador da chave privada, de qualquer maneira a chave privada terá que ser armazenada no aplicativo.
Na prática em aplicações críticas de segurança utiliza-se um hardware criptográfico (ASIC).
Agora se precisa de um ponteiro para passar numa função de P/Invoke é fácil:
// isso não funciona, o objeto a ser pinado não pode conter tipos "não primitivos"
// object o = new object();
byte[] bytes = new byte[256];
var handle = GCHandle.Alloc(bytes,GCHandleType.Pinned);
IntPtr ptr = handle.AddrOfPinnedObject();
handle.Free();
GCHandle.Alloc irá pinar o objeto na memória. O GC não irá coletá-lo e permanecerá com endereço fixo.
handle.AddrOfPinnedObject(); obtém o endereço em sí.
handle.Free(); // libera a memória alocada (despina e libera o GC).
Answered by user178974 on December 30, 2021
O sistema operacional tipicamente se encarrega de restringir o acesso a memoria para cada aplicação. O Windows, até onde saiba, exige permissões de administrador para que tenha acesso a memoria de outras aplicações, assim como edita-las.
Alguns processadores possuem recursos especiais para essas finalidades. No lado da Intel existe o SGX, que permite executar um código isolado do sistema, mas já foi descoberto falhas nele, baseados no Spectre. Por sua vez, a AMD não possui recursos com mesma propriedade, até onde tenho conhecimento, mas oferece um sistema de encriptação de memoria, AMD SME, que serve para mitigar um Cold Boot, um ataque side-channel que obtem todas as informações da memoria tendo acesso físico ao dispositivo. Entretanto, não protege contra alterações de memoria e afins.
Uma outra opção, mais cara, seria usar um HSM. Um HSM é um dispositivo que irá executar a operação criptográfica, o mais barato é o YubiHSM, mas ele não é programável e você poderá apenas usar os algoritmos existentes (ex. RSA, Ed25519, AES...). Isso pode também não resolver o problema, se assumir que o computador está comprometido ele pode acessar o resultado recebido pelo HSM.... A única diferença é que não terá acesso as chaves.
Answered by Inkeliz on December 30, 2021
O garbage collector não gerencia variáveis, então a pergunta nessa forma não faz sentido. Ele gerencia objetos alocados no heap gerenciado por ele. Quando você cria uma variável no seu código ela só existe nele, não tem nada a ver com execução. Não confunda os conceitos. Variáveis não são gerenciadas, não existem durante a execução.
O primeiro parágrafo tem ainda a premissa errada que pode ser acessada por qualquer sistema. Isso, de forma geral, não é verdade, e mesmo nos casos que acontece você não pode fazer nada para evitar, é um sistema comprometido.
Mesmo após a edição o segundo parágrafo não diz a que veio.
O terceiro pede algo que ou é normal acontecer sem fazer nada, ou não tem o que fazer, porque é um sistema comprometido. Qualquer conteúdo disponível dentro do computador pode ser acessado se o sistema estiver comprometido. Em condições normais só a aplicação pode acessar.
Por sistema comprometido entenda que qualquer máquina que tenha um usuário acessando tem pelo menos o comprometimento em relação a ele, ou seja o usuário faz o que ele quiser na máquina dele, se tiver o conhecimento ou puder delegar para outra pessoa, não há nada que possa impedir fazer isso.
Se não quer dar acesso não descriptografe, inclusive porque o algoritmo que faz isso já será uma vulnerabilidade que permitirá até mesmo descriptografar algo que sequer está no seu computador. Procure uma solução que não necessite descriptografar, ou que não seja feito em ambientes que você não controla 100%, o que é difícil. Se não tiver como fazer isso, aceite a insegurança. De qualquer forma não tem nada que possa fazer em programação para tentar melhor isso.
Note que a conceituação toda está errada, então qualquer caminho baseada nela estará errado por definição. E apesar de eu ter respondido, porque acho que não sai disso, a pergunta continua confusa.
Answered by Maniero on December 30, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP