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.
-t
opçãoRespostas:
Você não precisa da paranóia. O GNU
tar
- e, de fato, qualquer programa bem escritotar
produzido 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
tar
programas modernos a extrair esses tarballs potencialmente maliciosos: o GNU e o BSDtar
precisam da-P
opção para desativá-los. Veja a seção Nomes Absolutos de Arquivos no manual do tar GNU.A
-P
bandeira não é especificada pelo POSIX, no entanto, portanto, outrostar
programas podem ter maneiras diferentes de lidar com isso. Por exemplo, as ferramentas Schilystar
programa usos-/
e-..
desativar essas proteções.A única coisa que você pode considerar adicionar a um
tar
comando ingênuo é um-C
sinalizador para forçá-lo a extrair as coisas em um diretório temporário seguro, para que você não precise ircd
primeiro.Além :
Tecnicamente,
tar
não é mais especificado pelo POSIX. Eles tentaram dizer ao mundo da computação Unix que deveríamos usarpax
agora em vez detar
ecpio
, mas o mundo da computação os ignorou amplamente.É importante observar aqui que a especificação POSIX para
pax
não diz como deve lidar com barras ou..
elementos incorporados . Há um--insecure
sinalizador 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; apax
página de manual do BSD recomenda indiretamente a criação de-s
regras 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.
fonte
pax - portable archive interchange
Awww, que fofo, o POSIX acha que vai substituir possivelmente o formato de arquivo mais usado: PCom o GNU tar, é simplesmente
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-names
opçã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 componentefoo/../../bar/qux
será extraído comobar/qux
no diretório de nível superior,bar/qux
em 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 -> ../..
efoo/bar
não farábar
com 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.
fonte
Para cobrir alguns pontos, as outras respostas não têm:
Primeiro, veja o que está no arquivo antes de extraí-lo:
Se houver algo em que você não confie ou queira extrair, não extraia o tarball.
fonte