【问题标题】:Preventing harmful gzip files from being extracted防止提取有害的 gzip 文件
【发布时间】:2011-02-17 05:00:16
【问题描述】:

用户对其文件进行备份的目录位于他们可以访问和上传到的目录中。

如果他们获得正确的命名方案并故意导致错误使系统尝试恢复最近 5 个左右的备份,他们可能会使用绝对路径 gzip 文件(例如 @)将所需的文件放到服务器上987654322@ 或任何可能的情况。

我可以执行哪些检查来防止这种情况在 BASH 中以编程方式发生

下面的命令是root运行的(因为我用的是webmin,所以是root运行的):

tar zxf /home/$USER/site/backups/$BACKUP_FILE -C /home/$USER/site/data/

$BACKUP_FILE 将是它尝试恢复的备份的名称


编辑 1:

这是我到目前为止想出的。我相信这种方式可以改进很多:

CONTENTS=$(tar -ztvf /home/$USER/site/backups/$BACKUP_FILE | cut -c49-200)
for FILE in $CONTENTS; do
    if [[ $FILE =~ \.\. ]] || [[ $FILE =~ ^\/ ]]; then
        echo "Illegal characters in contents"
        exit 1
    fi
done

tar zxf /home/$USER/site/backups/$BACKUP_FILE -C /home/$USER/site/data/
exit 0

我想知道如果不允许它以 / 开头并且不允许 .. 就足够了吗? tar -ztvf 的输出字符 50+ 也是正常的吗?

【问题讨论】:

  • 建议 chroot 如果由 root 完成?
  • 为什么要以 root 身份恢复用户备份?
  • 因为我使用的是 webmin,并且我从 BASH 代码开始将所有内容保存在一个地方,然后将其转换为 PERL。我所做的工作类型需要 root 才能使旧程序正确运行。因此 usermin 不是一个选项
  • 不是答案,但r.tar.gz 相当有趣。解压它,解压其中的存档,解压其中的存档,然后……

标签: security bash backup gzip tar


【解决方案1】:

通常tar 实现会去掉前面的/ 并且不要提取带有.. 的文件,所以您需要做的就是检查您的tar 手册页并且不要 使用-P switch

tar 应该保护您免受符号链接攻击的另一件事:用户创建文件 $HOME/foo/passwd,将其备份,将其删除,然后将 $HOME/foo 符号链接到 /etc,然后恢复备份。签署档案对此无济于事,尽管以用户权限运行会有帮助。

【讨论】:

    【解决方案2】:

    尝试使用 su 以备份所有者身份恢复每个备份:

    su $username -c tar xzvf ...
    

    (在某些情况下,您可能还需要 -l 选项。)

    确保您真正了解以 root 身份运行程序的要求。您正在运行的进程除了对一个目录的读取访问权限和对另一个目录的写入访问权限之外不需要任何其他权限,因此即使 user 帐户权限也是一种过度杀伤力,更不用说 root 了。这是自找麻烦。

    【讨论】:

    • 实际上 $USER 是我代码中的其他内容,但我对其进行了更改以显示我正在使用的软件。
    【解决方案3】:

    我假设备份是由您的脚本生成的,而不是由用户生成的。 (提取任意用户创建的 tar 文件从来都不是一个好主意)。

    如果您的备份必须存储在用户可写的目录中,我建议您对每个备份文件进行数字签名,以便验证其完整性。然后,您可以在使用 tar 文件进行恢复之前验证它是否合法。

    一个使用GPG的例子:

    gpg --armor --detach-sign backup_username_110217.tar.gz
    

    这会创建一个签名文件backup_username_110217.tar.gz.asc,可用于验证文件:

    gpg --verify backup_username_110217.tar.gz.asc backup_username_110217.tar.gz
    

    请注意,要在脚本中运行它,您需要创建没有密码的密钥。否则,您必须将密码作为纯文本存储在脚本中,这是一个可怕的想法。

    【讨论】:

      猜你喜欢
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-08
      • 2012-03-17
      相关资源
      最近更新 更多