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-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 componente foo/../../bar/qux
será extraído como bar/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 -> ../..
e foo/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.