Como faço para extrair com segurança um arquivo tar não confiável?

29

Eu gostaria de poder extrair um arquivo tar, de modo que todos os arquivos extraídos sejam colocados em um determinado diretório de prefixo. Qualquer tentativa dos arquivos tar de gravar em diretórios externos deve fazer com que a extração falhe.

Como você pode imaginar, isso é para que eu possa extrair com segurança um arquivo tar não confiável.

Como posso fazer isso com o GNU tar ?

Eu inventei:

tar --exclude='/*' --exclude='*/../*' --exclude='../*' -xvf untrusted_file.tar

mas não tenho certeza se isso é paranóico o suficiente.

    
por Demi 17.04.2016 / 00:20

3 respostas

38

Você não precisa da paranóia. O GNU tar - e de fato qualquer programa tar bem escrito, produzido nos últimos 30 anos ou mais - irá se recusar a extrair arquivos no tarball que começam com uma barra ou que contêm .. elementos, por padrão.

Você tem que se esforçar para forçar os programas tar modernos a extraírem tarballs potencialmente maliciosos: tanto o GNU quanto o BSD tar precisam da opção -P para fazê-los desativar essa proteção. Consulte a seção Nomes absolutos de arquivos no manual do GNU alcatrão.

O sinalizador -P não é especificado por POSIX, ¹ assim, outros programas tar podem ter formas diferentes de lidar com isso. Por exemplo, o star program da Schily Tools usa -/ e -.. para desativar essas proteções.

A única coisa que você pode considerar em adicionar um comando tar ingênuo é um sinal -C para forçá-lo a extrair as coisas em um diretório temporário seguro, para que você não precise cd primeiro.

Afora :

  1. Tecnicamente, tar não é mais especificado por POSIX. Eles tentaram dizer ao mundo da computação Unix que deveríamos estar usando pax agora em vez de tar e cpio , mas o mundo da computação ignorou-os em grande parte.

    É relevante notar aqui que a especificação POSIX para pax não diz como deve lidar com barras iniciais ou elementos .. incorporados. Há um sinalizador --insecure não padrão para BSD pax para suprimir as proteções contra os elementos do caminho .. embutidos, mas aparentemente não há proteção padrão contra as barras principais; a página BSD pax man indiretamente recomenda escrever regras de substituição de -s para lidar com o risco de caminho absoluto.

    Esse é o tipo de coisa que acontece quando um padrão de fato permanece em uso ativo enquanto o padrão de jure é largamente ignorado.

por 17.04.2016 / 00:48
18

Com o tar do GNU, é simplesmente

tar -xvf untrusted_file.tar

em um diretório vazio. O GNU tar automaticamente remove os nomes de membros / principais ao extrair, a menos que explicitamente não seja informado com o --absolute-names option . O GNU tar também detecta quando o uso de ../ faria com que um arquivo fosse extraído fora do diretório de nível superior e colocasse esses arquivos no diretório de nível superior, por exemplo. um componente foo/../../bar/qux será extraído como bar/qux no diretório de nível superior, em vez de bar/qux no pai do diretório de nível superior. O GNU tar também cuida de links simbólicos apontando para fora do diretório de nível superior, por exemplo, foo -> ../.. e foo/bar não farão com que bar seja extraído fora do diretório de nível superior.

Note que isto só se aplica a (versões suficientemente recentes do) tar GNU (bem como algumas outras implementações, por exemplo, * BSD tar e BusyBox tar). Algumas outras implementações não têm essa proteção.

Por causa dos links simbólicos, as proteções que você usa não seriam suficientes: o arquivo pode conter um link simbólico apontando para um diretório fora da árvore e extrair arquivos nesse diretório. Não há como resolver esse problema apenas com base nos nomes dos membros, você precisa examinar o alvo dos links simbólicos.

Observe que, se você estiver extraindo para um diretório que já contém links simbólicos, a garantia pode não ser mais válida.

    
por 17.04.2016 / 00:51
6

Para cobrir alguns pontos, as outras respostas não:

  1. Primeiro, veja o que está no arquivo antes de extraí-lo:

    tar -tvf untrusted_tar_file.tar
    

    Se houver algo que você não confie ou queira extrair, não extraia o tarball.

  2. Em segundo lugar, extraia o tarball como um usuário não raiz que apenas grava acesso ao diretório em que você está extraindo o tarball. Por exemplo, extraia o tarball de dentro do diretório inicial do usuário não raiz.
por 17.04.2016 / 03:32

Tags