Um subdiretório do / tmp é um local adequado para soquetes do Unix?

2

Estou procurando um local seguro para colocar soquetes de domínio Unix que serão usados para controlar um REPL.

No Linux, eu usaria /run/user/$UID , que atende a todos os requisitos, exceto para portabilidade. Eu preciso do programa que os manipula para ser portátil.

Uma opção é usar um diretório em ~ , mas com um problema diferente: o diretório inicial do usuário pode estar em um diretório muito profundo para poder ligar um soquete de domínio Unix, devido ao limite no comprimento do caminho.

Colocar o soquete em um diretório em /tmp é portátil, mas estou preocupado com as condições de corrida ao remover o diretório. Também estou preocupado se o /tmp pode ser usado para que o bit permanente seja definido em todas as plataformas (ou seja, para os usuários não poderem excluir ou renomear arquivos temporários de outros usuários). Eu estou supondo que /tmp é pegajoso, no entanto, como muitos, muitos aplicativos (cada script que usa mkstemp ) é inseguro.

Meu plano atual é que o servidor crie um diretório temporário em /tmp e que os clientes verifiquem a propriedade do diretório que o contém antes de usar o soquete. Isso é adequado para segurança?

    
por Demi 28.09.2016 / 23:12

1 resposta

2

O local de jure para arquivos temporários é dado na variável de ambiente TMPDIR .

This variable shall represent a pathname of a directory made available for programs that need a place to create temporary files.

De fato, muitos sistemas não definem TMPDIR . O local padrão de fato para arquivos temporários é /tmp . Portanto, verifique TMPDIR e, se não estiver definido, use /tmp . Em um script de shell, você pode usar ${TMPDIR:-/tmp} ou, se achar mais conveniente,

if [ -z "$TMPDIR" ]; then TMPDIR=/tmp; fi

ou para lidar com set -u

: "${TMPDIR:=/tmp}"

Você pode assumir que esse local é gravável, mas pode ser legível por todos e ser mundialmente editável, portanto:

  • Ao criar um arquivo normal, sempre certifique-se de não estar sobrescrevendo um arquivo existente, que pode não pertencer a você. Não use um redirecionamento de shell para isso. Não é seguro testar a propriedade separadamente porque um adversário pode mover links simbólicos enquanto seu programa está sendo executado para enganar as verificações. Além disso, você não pode confiar em um nome específico que não exista; Para evitar que um programa concorrente crie uma negação de serviço criando um arquivo com o mesmo nome antes de você, use um nome aleatório. Você pode usar o utilitário mktemp (generalizado, presente no GNU, BusyBox, BSD, mas não POSIX) ou a função de biblioteca mkstemp C. Sob o capô, open ou creat deve ser chamado com o sinalizador O_EXCL .
  • Você pode criar um diretório com mkdir . Isso é seguro contra o roubo de truques de propriedade, porque isso não reutilizará um arquivo existente, mas está sujeito à mesma negação de serviço que os arquivos comuns, portanto, você deve usar um nome aleatório. mktemp -d é uma ótima maneira de fazer isso.
  • Você pode criar um soquete (não há um utilitário de shell padrão para isso). Como o caso do diretório, ele é seguro contra truques de propriedade, mas não contra negação de serviço.
    O Linux honra permissões em sockets nomeados, mas existem variantes Unix que não o fazem. É por isso que os soquetes em /tmp geralmente são criados em subdiretórios.

Programas que criam um subdiretório de /tmp (ou $TMPDIR se definido) e criam um soquete nomeado incluem servidores X11, ssh-agent, gpg-agent, KDE, emacs,… (são apenas os que existem na máquina onde estou postando isso). Como você pode ver, você estará em boa companhia.

    
por 29.09.2016 / 02:36