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


30

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 causar falha na extração.

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

Como posso fazer isso com o GNU tar?

Eu vim com:

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

mas não tenho certeza de que isso seja paranóico o suficiente.


2
Não é paranóico o suficiente. Eu construí alguns tarballs desagradáveis ​​no passado que ascenderam através de links simbólicos que ele criou. Acabei criando meu próprio tar que era setuid-root para que ele pudesse executar chroot (".") E remover privilégios.
Joshua

8
@ Josué, então sua solução para tornar um utilitário muito amplamente testado mais seguro foi criar sua própria versão e conceder privilégios de root?
parar de prejudicar Monica

4
@OrangeDog: int main (int argc, char ** argv) {chroot (".") || saída (1); setuid (getuid ()); é fácil de auditar.
Joshua

2
Você também pode querer inspecionar o que está dentro do arquivo tar usando a -topção
Thomas

Respostas:


40

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

Você precisa fazer o possível para forçar os tarprogramas modernos a extrair esses tarballs potencialmente maliciosos: o GNU e o BSD tarprecisam da -Popção para desativá-los. Veja a seção Nomes Absolutos de Arquivos no manual do tar GNU.

A -Pbandeira não é especificada pelo POSIX, no entanto, portanto, outros tarprogramas podem ter maneiras diferentes de lidar com isso. Por exemplo, as ferramentas Schily starprograma usos -/e -..desativar essas proteções.

A única coisa que você pode considerar adicionar a um tarcomando ingênuo é um -Csinalizador para forçá-lo a extrair as coisas em um diretório temporário seguro, para que você não precise ir cdprimeiro.


Além :

  1. Tecnicamente, tarnão é mais especificado pelo POSIX. Eles tentaram dizer ao mundo da computação Unix que deveríamos usar paxagora em vez de tare cpio, mas o mundo da computação os ignorou amplamente.

    É importante observar aqui que a especificação POSIX para paxnão diz como deve lidar com barras ou ..elementos incorporados . Há um --insecuresinalizador não-padrão para o BSDpax suprimir proteções contra ..elementos de caminho incorporados , mas aparentemente não há proteção padrão contra barras principais; a paxpágina de manual do BSD recomenda indiretamente a criação de -sregras de substituição para lidar com o risco absoluto do caminho.

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


7
pax - portable archive interchangeAwww, que fofo, o POSIX acha que vai substituir possivelmente o formato de arquivo mais usado: P
cat

1
@cat O formato de arquivo padrão é uma variante tar razoavelmente suportada (o AIUI também deve suportar o formato cpio). Pax é uma tentativa de substituir a interface de comando para lidar com esses arquivos, uma vez que o tratamento de argumentos de comando do tar é ... peculiar.
usar o seguinte código

Nota lateral aleatória: Tenho certeza de que é "de jour", ou seja, a palavra francesa, em oposição a "de jure".
Fund Monica's Lawsuit

7
@QPaysTaxes não é. de jure é latino e contrasta com a situação atual, isto é, o que é de fato. De jour também deve ser du jour para obedecer às regras da gramática francesa.
Primeiro

1
Este é um caso de um falso cognato infeliz. O francês "du jour" ("da época") se parece muito com o latim "de jure" ("lei") aqui contrastado com "de fato" ("de fato"). Alguém poderia argumentar que pax é o "padrão do mês" ou "padrão do dia" para tirar sarro de como novos padrões são propostos com tanta frequência, enquanto o vasto corpo de usuários simplesmente permanece com o que funciona para eles (padrão de fato), sabendo que (metaforicamente) haverá um novo padrão amanhã para eles ignorarem.
Monty mais duro

19

Com o GNU tar, é simplesmente

tar -xvf untrusted_file.tar

em um diretório vazio. GNU tar retira automaticamente um dos principais /nomes de membros ao extrair, a menos que explicitamente não disse o contrário com a --absolute-namesopção . O tar GNU também detecta quando o uso de ../causaria a extração de um arquivo fora do diretório de nível superior e os colocaria no diretório de nível superior; por exemplo, um componente foo/../../bar/quxserá extraído como bar/quxno diretório de nível superior, bar/quxem vez de no pai do diretório de nível superior. . O tar GNU também cuida de links simbólicos apontando para fora do diretório de nível superior, por exemplo, foo -> ../..e foo/barnão fará barcom que seja extraído fora do diretório de nível superior.

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

Por causa dos links simbólicos, as proteções usadas não seriam suficientes: o arquivo morto poderia 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 com base apenas nos nomes dos membros; você precisa examinar o destino dos links simbólicos.

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


6

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

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

    tar -tvf untrusted_tar_file.tar
    

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

  2. Segundo, extraia o tarball como um usuário não raiz que só tem acesso de gravação ao diretório no qual você está extraindo o tarball. Por exemplo, extraia o tarball do diretório inicial do usuário não raiz.

4
1. Isso não é prático para operações em lote. 2. A menos que você estiver executando uma configuração personalizada, alguns locais podem ser gravados por todos os usuários, nomeadamente / tmp /
tubo de

O @pipe one também pode criar um diretório e um novo usuário, e somente esse usuário tem acesso apenas a esse diretório e, em seguida, execute o comando Eu gosto bastante do meu diretório pessoal, obrigado.
gato

2
@pipe Por que, na boa Terra de Deus, você NUNCA passaria dados não confiáveis através de uma operação em lote? Se você não confia nele, NÃO o executa sem supervisão.
Andrew Henle

6
@AndrewHenle Uhm, ok. Como você acha que todos os servidores da Internet funcionam? Você acha que alguém da stackexchange executa esse comentário no banco de dados e no sistema de marcação enquanto monitora manualmente a operação? Porque esta entrada são dados não confiáveis ​​por meio de uma operação em lote.
tubo de

Eu não recomendaria extrair um arquivo não confiável diretamente em um diretório inicial. Você não deseja que ele sobrescreva .bashrc e outros arquivos .config /, certo?
Hugal31
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.