Bloqueio rm -rf para aplicação

3

Eu tenho aplicação que durante o tempo de execução gera saídas intermediárias interessantes para o diretório ./tmp.
No final da execução, esse diretório é excluído .
Como posso preservar seu conteúdo?

Eu não tenho uid 0 no sistema.
Por isso, não consigo interceptar (bloquear desvincular) qualquer operação de E / S.
Atualmente estou parando este aplicativo e o conteúdo cp dele.

A aplicação está estaticamente compilada para bibliotecas compartilhadas + LD_PRELOAD não ajudaria. O aplicativo está usando a pasta **. / ** tmp que não está relacionada a nenhuma variável env.

Obrigado pelas respostas.

    
por user23364 19.10.2009 / 17:03

2 respostas

10

Pode estar usando o valor das variáveis de ambiente TMPDIR ou TEMPDIR. Você poderia tentar definir isso para um diretório diferente e ver se o programa usa isso. Talvez seja uma configuração de configuração.

Se você conseguir excluir o diretório / tmp ou tudo nele, como usuário não-root, suas permissões parecerão erradas.

As permissões que tenho no meu sistema são:

drwxr-xr-x 26 root root 4096 2009-10-14 12:00 /
drwxrwxrwt 27 root root 12288 2009-10-19 16:10 /tmp

O diretório / só permite que o root exclua diretórios de nível superior e o bit sticky em / tmp permite que os proprietários excluam seus próprios arquivos em / tmp. Obviamente, você precisaria de root para corrigir esses problemas.

Supondo que ele use a função unlink para excluir os arquivos, você pode criar uma pequena biblioteca compartilhada que você pré-carrega, o que substitui a função de desconexão do sistema.

Crie unlink.c contendo:

int unlink(const char *pathname) {
   return 0; 
}

int unlinkat(int dirfd, const char *pathname, int flags) {
   return 0;
}

Também sobrescrevemos a função unlinkat, caso ela use isso. Agora você pode executar:

% gcc unlink.c --shared -o unlink.so
% file unlink.so
unlink.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), 
dynamically linked, not stripped
% touch foo
% LD_PRELOAD=./unlink.so rm foo
% ls foo 
foo

Se você achar que seu programa precisa excluir outros arquivos, poderá tornar suas funções de substituição mais inteligentes, por exemplo, verificando o caminho que está sendo solicitado a ser excluído.

    
por 19.10.2009 / 17:25
2

Dois pensamentos vêm à mente:

  1. Você pode tentar adicionar o sinalizador imutável ao diretório. + i

    chattr + i / path / para / files / *

  2. Se o programa for um script, desvincule o comando rm desse usuário. Crie um alias que "não faz nada" para rm:

    alias rm = 'echo'

Acho que o primeiro impediria que os arquivos fossem excluídos, mas não aconteceriam automaticamente. O segundo impediria que o aplicativo excluísse quaisquer arquivos, usando pelo menos o comando RM. Se estiver usando uma chamada ao sistema de arquivos, você terá dificuldades em impedir a exclusão dessa maneira.

    
por 19.10.2009 / 17:14

Tags