我的一位同事说您在提取 tarball 时需要小心,因为它们可能会进行您不知道的更改。我一直认为 tarball 只是压缩文件的层次结构,因此如果将其解压到 /tmp/example/ ,它不可能将文件偷偷放入 /etc/ 或类似的内容中。
答案1
不同的 tar 实用程序在这方面的行为有所不同,因此最好小心。对于您未创建的 tar 文件,请务必在解压之前列出目录。
从 tarfile 中提取指定的文件并将其写入 tarfile 中指定的相对于当前目录的目录。使用要提取的文件和目录的相对路径名。
tar 归档文件中包含的绝对路径名是使用绝对路径名解包的,即不去掉前导斜杠 (/)。
对于具有完整(绝对)路径名的 tar 文件,例如:
/tmp/real-file
/etc/sneaky-file-here
...如果您提取这样的文件,您最终会得到这两个文件。
默认情况下,GNU tar 在输入或输出上删除前导
/
,并抱怨文件名包含组件..
。有一个选项可以关闭此行为:
--absolute-names
-P
不要从文件名中删除前导斜杠,并允许文件名包含
..
文件名组件。
...如果您使用 GNU tar 提取全路径 tar 文件没有使用该-P
选项,它会告诉您:
/
tar:从成员名称中删除前导
并将文件提取到当前目录的子目录中。
对此什么也没说,并且其行为与 Solaris tar 相同——它将创建并提取具有完整/绝对路径名的 tar 文件。
HP-UX 焦油: (欢迎更好的在线参考)
警告
无法将绝对路径名恢复到相对位置。
-P
不要
/
从路径名中删除前导斜杠 ( )。默认是去掉前导斜杠。
在 macOS、FreeBSD 和 NetBSD 上也实现了一些选项,具有相同的语义,-P
此外,tar
tar
自由BSD如果..
没有.-P
-/
提取存档时不要删除文件名中的前导斜杠。包含绝对路径名的 Tar 档案通常不是一个好主意。对于其他 tar 实现,如果不破坏现有文件,它们可能永远不会被提取。因此,在提取模式下,默认情况下会从文件名中删除前导斜杠。
答案2
发生的有趣的事情之一焦油炸弹是他们将当前目录的权限更改为 tarball 中包含的权限。
例如,如果 tarball 包含“.”目录,并且您以 root 身份将其解压到 /tmp 中,它会使除 root 之外的任何人都无法写入 /tmp,从而破坏您的系统。