A troca pode ser desativada no nível do aplicativo?

10

Atualmente estou usando o thunderbird com o gnupg para ler e-mails criptografados. Se eu entendi o comportamento de troca corretamente, as páginas de memória contendo os e-mails descriptografados podem ser trocados e deixar rastros no disco rígido que, em teoria, podem ser recuperados posteriormente forense.

Embora seja certamente possível usar um arquivo de troca criptografado ou desabilitar a troca globalmente durante o uso de arquivos confidenciais, ele afeta o desempenho, pode ser esquecido e requer privilégios de root.

É possível marcar certos arquivos ou programas para não serem trocados? Mesmo sem acesso root? Poderia alguém escrever um aplicativo que possa ser distribuído para usuários tecnicamente ingênuos e cujo conteúdo de memória nunca seja trocado para o disco?

    
por user54114 13.02.2015 / 15:02

4 respostas

9

Nos comentários, sugeri que você criasse um cgroup, definisse memory.swappiness para zero (para minimizar a troca) e executasse seu aplicativo dentro dele. Se você fez isso, provavelmente o seu aplicativo não iria trocar a menos que você estivesse rodando tão incrivelmente baixo na memória física que a troca de páginas por programas naquele cgroup era a única maneira de disponibilizar memória física suficiente.

Para fazer isso no RHEL 6.5:

  • Verifique se o pacote libcgroup está instalado. Isso lhe dá acesso a ferramentas de espaço do usuário como cgcreate e cgexec .

  • Inicie e ative o serviço cgconfig para que as alterações na configuração do cgroup sejam persistentes entre as reinicializações. No RHEL, esse serviço também deve montar os sistemas de arquivos necessários sob a árvore /cgroup .

  • Crie o cgroup com cgcreate -g memory:thunderbird

  • Defina a permutação para zero neste grupo com cgset -r memory.swappiness=0 thunderbird

  • Use cgsnapshot -s > /etc/cgconfig.conf para salvar uma configuração persistente atualizada para o serviço cgconfig (todas as alterações até agora foram alterações de tempo de execução. Você provavelmente desejará salvar o arquivo de configuração padrão em algum lugar e fornecer uma vez -over antes de fazer a configuração persistente.

  • Agora você pode usar cgexec para iniciar os aplicativos desejados no thunderbird cgroup:

    [root @ xxx601 ~] # cgexec -g memória: thunderbird ls

    anaconda-ks.cfg a.out foreman.log index.html install.log install.log.syslog node.pp dormir sleep.c ssl-build teste de pilha

    [root @ xxx601 ~] #

Eu não tenho thunderbird na verdade, caso contrário eu teria feito isso. Não sei por que a formatação dos itens acima está confusa.

  • Uma alternativa para cgexec seria iniciar o thunderbird e adicionar o PID ao arquivo tasks do aplicativo. Por exemplo:

    [root @ xxx601 ~] # cat / cgroup / memória / thunderbird / tarefas

    [root @ xxx601 ~] # pidof httpd

    < p > 25926 10227 10226 10225 10163 10162 10161 10160 10159 10157 10156 10155 10152 10109

    [root @ xxx601 ~] # echo 25926 > / cgroup / memory / thunderbird / tasks

    [root @ xxx601 ~] # cat / cgroup / memória / thunderbird / tarefas

    25926

Mais uma vez, vale a pena mencionar que isso não impede tecnicamente a troca, mas a modificação do aplicativo em si, provavelmente é sua melhor aposta. Acabei de encontrar memory.memsw.limit_in_bytes , o que parece ser um controle mais direto sobre forçar que não haja troca, mas eu não brinquei o suficiente para realmente me sentir confortável dizendo que corrige seu problema completamente. Dito isso, pode ser algo para investigar depois disso.

A verdadeira resposta seria ter o aplicativo mlock de informações confidenciais para contornar esse tipo de preocupação. Estou disposto a apostar uma aplicação como o Thunderbird, mas não sei o suficiente sobre os internos para comentar sobre isso.

    
por 13.02.2015 / 19:53
5

Os aplicativos podem bloquear a memória para que não possam ser trocados.

mlock, munlock, mlockall, munlockall - lock and unlock memory

Eu não sei de uma maneira de influenciar isso de fora, no entanto. O aplicativo teria que ser escrito para usar isso sozinho. Com os e-mails, provavelmente é particularmente difícil, pois geralmente também envolve programas externos para visualizar anexos e coisas do tipo.

Além disso, mesmo com o memlock, há uma chance de ele acabar na sua partição swap - quando você usa suspend to disk, que grava toda a memória no disco, independentemente de quaisquer preferências não-swap.

É mais fácil simplesmente passar a criptografia completa do disco.

    
por 13.02.2015 / 15:10
5

Sim, um aplicativo pode impedir que parte de sua memória seja excluída, com o sistema mlock ligar. No entanto, isso não é realmente útil no seu caso.

Dados confidenciais não estão apenas na memória do aplicativo. Ele acaba em arquivos temporários em vários lugares ( /tmp , /var/spool , etc.). O próprio Thunderbird está exibindo o e-mail descriptografado, então você também precisa bloqueá-lo na RAM.

Se você quiser garantir que seu disco não contenha rastros de arquivos confidenciais, você precisa criptografar seu swap, bem como todos os possíveis locais de arquivos temporários (em particular, /tmp se não for tmpfs, e a maioria de /var , além do seu diretório home, é claro).

O impacto do swap criptografado no desempenho é pequeno a zero. A criptografia é muito mais rápida que a E / S de disco.

    
por 14.02.2015 / 01:21
0

Estou apenas a pensar se seria melhor começar por alterar a prioridade do processo de candidatura, por ex. com um script de inicialização iniciando-o com uma alta prioridade usando nice e renice e com a prioridade de I / O alterar isso com ionice e, em seguida, ver o que acontece.

Você pode "melhorar" o aplicativo para o nível de prioridade mais alto. -20 Dessa forma, você ainda deixa o sistema operacional para fazer o que faz melhor, tomando a decisão sobre quando trocar processos de aplicativos.

Mas, se você quiser mais controle e granularidade, é recomendável que você comece a analisar cgroups e a definir memory.swappiness

    
por 14.02.2015 / 12:23