Arquivo temporário acessível de processo único

3

Eu quero criar um arquivo que seja acessível somente ao processo que o criou (e potencialmente seus filhos), e que desapareça quando o processo terminar, o ideal é nunca persistir o arquivo no disco. Como exemplo, quero criar /mylocation/myfile.txt , onde esse arquivo só pode ser lido a partir do processo atual, mas nenhum outro processo, mesmo do mesmo usuário. Fico feliz em usar um local mágico diferente de /mylocation , por exemplo em algum lugar abaixo de /prod/PID , mas ele precisa funcionar para qualquer nome de arquivo.

O pano de fundo é que estou usando uma biblioteca existente que lê uma senha de $FOO/mypassword . Vários processos estão sendo executados sob a mesma conta de usuário, mas possuem senhas secretas diferentes. Desejo comunicar a senha à biblioteca com segurança dos outros processos. Eu aprecio as soluções ideais que seriam as diferentes contas de usuário ou que a biblioteca não lesse a senha de um arquivo, mas eu não tenho controle sobre nenhum desses aspectos.

    
por Neil Mitchell 02.05.2013 / 22:02

2 respostas

4

Bem, isso depende do que você entende por "arquivo" e de como exatamente a biblioteca o acessa. Aqui estão algumas abordagens (ambas kluges) que vêm à mente:

  1. Use um arquivo temporário, no significado normal de mkstemp . mkstemp retorna um número de descritor de arquivo para um arquivo desvinculado. Você pode então criar $FOO/mypasswd como um link simbólico para /proc/self/fd/returned_number . Há uma pequena janela onde o arquivo existe (entre abrir e desassociar), e outra coisa em execução como o mesmo usuário poderia abri-lo, e segure o descritor de arquivo para depois ler a senha. Você pode ter certeza de que não será gravado no disco se o seu diretório temporário estiver em um tmpfs.
  2. Se não precisar de seek do arquivo de senhas, use pipe / pipe2 para criar seus descritores de arquivos e, em seguida, proceda como acima com o symlink. Você precisará forçar um processo filho para manipular a senha para o pipe.
  3. Você provavelmente pode abusar do FUSE para fazer isso.
  4. Você pode usar LD_PRELOAD (ou outros truques de vinculador dinâmico) para "corrigir" a biblioteca interceptando open / read / close e fornecer a senha a ela em algum lugar.

Nenhum desses é realmente seguro de outros processos. Outros processos em execução como o mesmo usuário poderiam, por exemplo, ptrace do seu processo e ler a senha diretamente da memória.

    
por 02.05.2013 / 22:55
1
#!/bin/bash
exec 3<>file
rm file
exec program

Para ser preciso: existe uma condição de corrida. E o programa tem que usar o descritor de arquivos. Se você tiver que passar um caminho de arquivo, use /proc/self/fd/3 . Mas, teoricamente, o arquivo (embora excluído) também é acessível por esse caminho de proc para outros processos.

    
por 02.05.2013 / 22:55