Alocando memória segura

0

Quando eu estava na universidade, fui ensinado que eu poderia solicitar que a memória fosse bloqueada ao alocá-lo. Isso impediria que ele fosse trocado para o disco. Isso não é verdade, já que trocará quando uma suspensão para o disco for feita. (O bit de bloqueio é uma solicitação, destina-se ao desempenho, não à segurança e só deve ser usado se você souber o que está fazendo.)

Então, eu queria saber se há uma maneira de alocar memória segura. Eu tive duas ideias, mas não consigo ver se elas estão implementadas:

  • bloqueio seguro: impedirá a hibernação, portanto poderá causar problemas ao restante do sistema, a menos que haja uma maneira de sinalizar o processo, para que ele libere a memória. Mas então, e se não.

  • solicitar memória volátil / transitória: Estou usando volátil para significar ainda mais volátil que a RAM, já que o sistema pode simplesmente desmapear a memória, sem trocar ou avisar. Isso pode causar uma falha de memória, que o aplicativo deve manipular.

    Alocações grandes seriam usadas para caches de decriptografia e poderiam ser não mapeadas, mas também podem ser recriadas. Para as frases secretas, estas seriam armazenadas em pequenas alocações, na esperança de que não sejam desmapeadas (exceto para hibernação). Se uma frase secreta não estiver mapeada, a interação do usuário será necessária.

Existe algo parecido com isso, incluindo outras alternativas?

Estou usando o Debian 9 Gnu / Linux, mas também estaria interessado em outros sistemas operacionais.

    
por ctrl-alt-delor 16.08.2017 / 11:24

2 respostas

2

Com a única exceção da hibernação, o mlock () garante manter a memória na RAM no Linux. Isso pode ser comprovado simplesmente chamando malloc () para alocar um pedaço de memória do mesmo tamanho que sua memória livre, chamando mlock (), e então forçando cada página a ser criticada (não faça isso em uma produção). sistema, ele irá disparar o assassino OOM, e que não pode escolher o seu programa de teste para colher). Assim, além da hibernação, você pode confiar no mlock ().

A hibernação fica complicada, mas existem maneiras de lidar com isso parcialmente. Supondo que seu modelo de ameaça confie no usuário root (e você meio que precise), será possível conectar-se ao systemd para bloquear a hibernação enquanto tiver dados confidenciais na memória. Tenha em mente que isso não é perfeito, mas é provavelmente o mais próximo que você pode conseguir. Alternativamente, acho que você pode registrar um gancho para notificar seu programa se a hibernação for iniciada e limpar sua memória sensível, mas não tenho 100% de certeza sobre isso.

Apesar disso, você pode estar pensando demais sobre isso.

Se você está apenas escrevendo software genérico e tem zero controle de plataforma (pense em algo como GPG ou OpenSSL), você deve apenas assumir que seus usuários saibam o risco, mlock () as áreas apropriadas de memória (ou melhor ainda, opção para fazê-lo para que as pessoas com transiente criptografado (zram pensar) ou criptografado possam optar por não receber o uso de recursos) e conclua o processo. Tenha em mente também que, embora o suporte de hibernação nativa do kernel seja um problema de segurança (e muito bem documentado), as implementações de espaço do usuário (como o µswsusp) geralmente têm suporte a criptografia integrada.

Se, no entanto, você estiver lidando com algo em que você controla o SO, o software será executado, você pode simplesmente criar seu próprio kernel com o suporte de hibernação desabilitado.

    
por 16.08.2017 / 14:12
0

Evitar que a memória seja trocada não é muito útil (exceto no kernel). A ameaça com a qual você está preocupado é um invasor lendo dados trocados do disco, ignorando o sistema operacional. Isso significa que o atacante tem acesso físico ao disco. Na prática, isso significa que o invasor tem acesso físico à máquina para poder ler as mesmas informações da RAM. É possível extrair dados de um chip de RAM que foi desligado por alguns segundos - não de forma muito confiável, mas o suficiente para não deixar um computador em segredo se recentemente ele tem segredo dados na RAM.

Como programador, não procure um truque estranho para evitar a hibernação. Os usuários vão odiá-lo porque isso prejudicará sua funcionalidade sem ajudar na segurança deles.

Como usuário, criptografe seu espaço de troca.

    
por 17.08.2017 / 00:25