Suprimir arquivos de recuperação ao editar arquivos confidenciais no vi, nvi e vim

Suprimir arquivos de recuperação ao editar arquivos confidenciais no vi, nvi e vim

Estou escrevendo um aplicativo que mantém um banco de dados criptografado contendo informações extremamente confidenciais, incluindo chaves e senhas criptográficas. O aplicativo é paranóico quanto ao uso de memlock, bloqueio de ptrace, prevenção de coredumps, etc., mas possui um comando para permitir que o proprietário do banco de dados edite o conteúdo do banco de dados. Este comando grava todo o banco de dados em um arquivo temporário em formato ASCII legível e permite que o usuário o edite. Especificamente, ele cria um novo arquivo em um diretório recém-criado /tmp/XXXXXXXX/(onde /tmp é idealmente um sistema de arquivos de memória) e, em seguida, executa o editor preferido do usuário no arquivo. Quando o editor sai, o aplicativo analisa o conteúdo do arquivo e destrói o arquivo e tudo o mais /tmp/XXXXXXXX/antes de finalmente excluir o diretório.

Infelizmente, essa estratégia não funciona muito bem com nenhuma das variantes do vi, porque o editor acaba gravando cópias do arquivo em /var/tmp/vi.recover, onde elas provavelmente persistirão no disco mesmo depois que o vi as excluir. (Os dados contêm chaves privadas de alto valor, para as quais seria fácil pesquisar uma partição bruta inteira.) Estou procurando uma maneira genérica de suprimir esses arquivos de recuperação ou, pelo menos, movê-los para /tmp/XXXXXXXX/.

Minha solução ideal funcionaria para a maioria das variantes do vi, mas também estou feliz em analisar a EDITORvariável de ambiente e fazer algo diferente para cada editor. Portanto, se você tem uma solução que funciona para o vim, mas não para os outros, é pelo menos um bom começo. (Eu já usei o caso especial do vim para reabrir o editor no número exato da coluna de um erro de análise, enquanto outras variantes do vi só podem ser abertas na linha apropriada.)

Por se tratar de um aplicativo para ser distribuído para outras pessoas, a única coisa que não posso fazer é resolver o problema editando os arquivos .exrc ou .vimrc das pessoas. Em uma pitada absoluta, suponho que poderia alterar a variável de ambiente HOME antes de executar o editor e criar um .vimrc temporário que mescla o real do usuário com alguns comandos de supressão de recuperação. No entanto, eu preferiria uma solução de linha de comando ou de comentários.

O mais próximo que posso chegar de um exemplo mínimo de trabalho é compartilhar o que faço para o emacs, que é anexar o seguinte comentário no final do arquivo:

# Local Variables:
# make-backup-files: nil
# auto-save-default: nil
# End:

Embora a mais fácil seja uma opção de linha de comando, se algum comentário equivalente puder funcionar para o vim ou qualquer uma das outras variantes do vi, isso também seria ótimo.

atualizar:

Depois de algumas experiências com strace, parece o seguinte comandopoderfaça o que eu quiser para o vim:

vim -n -c 'set viminfo=' /tmp/XXX/secret.ini

Porém não funciona com --cmd, que foi a opção sugerida, mas apenas com -c. Além disso, eu realmente não entendo o que -nacontece, mas notei que a página de manual dizia que isso interromperia a recuperação. Então, eu ainda adoraria ouvir uma resposta de alguém com conhecimento sobre o vim, se é que isso funciona. E é claro que soluções para as outras variantes do vi seriam bem-vindas.

atualização 2:

A variável de ambiente EXINITpoderfunciona para vi e nvi, se eu definir como EXINIT=set dir=/tmp/XXX|set recdir=. O nvi avisa sobre a falta de recuperação na inicialização, o que é encorajador, enquanto o vi coloca arquivos no sistema de arquivos, mas pelo menos eles estão em /tmp, que geralmente é um sistema de arquivos de memória.

Responder1

Pois vimvocê pode mover o local do arquivo de recuperação com odirectoryopção.

set directory=/tmp/XXXXXXXX

Isso pode ser adicionado à linha de comando para uma única instância como esta

mkdir -m700 /tmp/xyz
vim --cmd "set directory=/tmp/xyz" /path/to/secure.file

Responder2

Posso pensar em várias opções para oferecer aos usuários um editor razoável com o máximo de paranóia possível. Como este é um aplicativo sensível à segurança, considere tudo aqui com cautela e corrija quaisquer erros.

Eu sugeriria fazer uma dessas coisas como padrão, mas tornar possível, de maneira claramente documentada, que as pessoas usem as suas próprias vimcomo uma opção claramente documentada, para que não tentem copiar dados do arquivo bloqueado vi.

Além disso, algumas dessas sugestões (em particular mexer com LD_PRELOAD) podem ser totalmente inaceitáveis, desativadas (tanto quanto possível) ou limitadas em seu ambiente.

Aqui estão algumas opções potencialmente mutuamente exclusivas, sem nenhuma ordem específica,

  1. execute o editor como um usuário sem privilégios, como sudoeditfaz.
  2. forneça ao seu próprio editor recursos que você não deseja que sejam corrigidos ou compilados
  3. interceptar chamadas para libcfunções problemáticas com LD_PRELOAD.
  4. pule o usuário .vimrccompletamente.

1) execute o editor como um usuário sem privilégios

Se você tiver a capacidade de criar usuários adicionais ou exigir que as pessoas que usam o software criem um usuário dedicado sem privilégios, você poderá usar o mesmo truque que sudoeditusa: criar um arquivo temporário e fazer com que o usuário o edite como um usuário sem privilégios. Não sei como garantir que o arquivo temporário nunca toque no disco.

Parece que você já está fazendo algo semelhante a isto, mas sem o usuário sem privilégios.

Aqui está umresposta do superusuário explicando como sudoeditfunciona.

Além disso, recomendo estudar como funciona a sudoeditfuncionalidade do sudo.aqui está um código relevante.

2) agrupe o seu próprio arquivo vi.

nvié pequeno e licenciado pelo BSD, você poderá corrigi-lo para nunca criar arquivos de troca ou compilá-lo sem suporte a arquivos de troca. Na verdade, não sei porque, na última vez em que tentei compilar, nvinão consegui descobrir como fazer com que sua versão antiga do autotools detectasse o OS X.

Como parte da construção do seu produto principal, você pode pegar o hash do seu nviexecutável e incorporá-lo como uma constante de tempo de construção.

Os usuários do Emacs podem obter uma cópia do mg. Aqui está umlink para um fork de mg. A variante que realmente reside na árvore de código-fonte do OpenBSD é licenciada pelo ISC. Você pode precisar corrigi-lo porque às vezes ele custa (por exemplo, para interagir com cscope).

Os usuários Nano estão sem sorte, eu acho.

3)LD_PRELOAD

use LD_PRELOADpara direcionar ld.so(no Linux) o carregamento de um calço para interceptar chamadas para libcfunções como fwrite, fork, &c.

4) pule as opções de configuração do usuário vime execute sua própria configuração mínima.

Esta é a linha de comando mais à prova de balas vimque consigo imaginar, mas posso ter perdido alguma coisa. Eu só entendi lendo a página de manual do vim e olhando meu arquivo .vimrc.

  • -u NONE- sem inicialização
  • -i NONE-- não.viminfo
  • -U NONE- sem inicialização ( gvimmas ei, você nunca pode ser muito cuidadoso)
  • -Z - comece como se argv[0]fosse rvim.
  • set nocompatible-- não seja vicompatível.
  • set backspace=indent,eol,start- torne o backspace mais intuitivo
  • set noexrc- provavelmente redundante, não leia nenhum rcarquivo.
  • set secure-- não autocmd, não shell, não write, exibir -- mapcomandos.
  • set nobackup- sem opções de backup
  • set laststatus=2-- mostra o arquivo que você está editando

Então, aqui está a linha de comando juntando tudo.

vim -n -u NONE -i NONE -U NONE -Z \
        --cmd "set nocompatible | set backspace=indent,eol,start | set noexrc | set secure | set nomodeline | set nobackup | set laststatus=2" \
         --

informação relacionada