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 EDITOR
variá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 -n
acontece, 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 vim
você pode mover o local do arquivo de recuperação com odirectory
opçã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 vim
como 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,
- execute o editor como um usuário sem privilégios, como
sudoedit
faz. - forneça ao seu próprio editor recursos que você não deseja que sejam corrigidos ou compilados
- interceptar chamadas para
libc
funções problemáticas comLD_PRELOAD
. - pule o usuário
.vimrc
completamente.
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 sudoedit
usa: 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 sudoedit
funciona.
Além disso, recomendo estudar como funciona a sudoedit
funcionalidade 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, nvi
nã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 nvi
executá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_PRELOAD
para direcionar ld.so
(no Linux) o carregamento de um calço para interceptar chamadas para libc
funções como fwrite
, fork
, &c.
4) pule as opções de configuração do usuário vim
e execute sua própria configuração mínima.
Esta é a linha de comando mais à prova de balas vim
que 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 (gvim
mas ei, você nunca pode ser muito cuidadoso)-Z
- comece como seargv[0]
fosservim
.set nocompatible
-- não sejavi
compatível.set backspace=indent,eol,start
- torne o backspace mais intuitivoset noexrc
- provavelmente redundante, não leia nenhumrc
arquivo.set secure
-- nãoautocmd
, nãoshell
, nãowrite
, exibir --map
comandos.set nobackup
- sem opções de backupset 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" \
--