Bug 25954 - buffer overflow detected
: buffer overflow detected
Status: CLOSED FIXED
: Sisyphus
(All bugs in Sisyphus/tftp)
: unstable
: all Linux
: P3 normal
Assigned To:
:
:
:
:
:
  Show dependency tree
 
Reported: 2011-07-27 11:23 by
Modified: 2011-07-28 15:22 (History)


Attachments
вывод valgrind (4.66 KB, text/plain)
2011-07-27 15:41, enp
no flags Details
вывод valgrind (5.29 KB, text/plain)
2011-07-27 16:24, enp
no flags Details
Вот такой патч вроде бы решает проблему (1.23 KB, patch)
2011-07-27 18:02, Damir Shayhutdinov
no flags Details | Diff


Note

You need to log in before you can comment on or make changes to this bug.


Description From 2011-07-27 11:23:16
$ tftp 10.7.1.1 -c get pxelinux.0
*** buffer overflow detected ***: tftp terminated
======= Backtrace: =========
/lib/libc.so.6(__fortify_fail+0x40)[0x39e220]
/lib/libc.so.6(+0xe224a)[0x39c24a]
/lib/libc.so.6(__strcpy_chk+0x3f)[0x39b59f]
tftp[0x8049032]
tftp[0x80496db]
tftp[0x804a349]
tftp[0x804ac13]
/lib/libc.so.6(__libc_start_main+0xe6)[0x2d0c96]
tftp[0x8048f51]
======= Memory map: ========
00110000-00125000 r-xp 00000000 08:02 261667     /lib/libtinfo.so.5.7
00125000-00127000 r--p 00014000 08:02 261667     /lib/libtinfo.so.5.7
00127000-00128000 rw-p 00016000 08:02 261667     /lib/libtinfo.so.5.7
0013b000-00167000 r-xp 00000000 08:02 261648     /lib/libreadline.so.5.2
00167000-00168000 ---p 0002c000 08:02 261648     /lib/libreadline.so.5.2
00168000-00169000 r--p 0002c000 08:02 261648     /lib/libreadline.so.5.2
00169000-0016c000 rw-p 0002d000 08:02 261648     /lib/libreadline.so.5.2
0016c000-0016d000 rw-p 00000000 00:00 0 
00299000-002b7000 r-xp 00000000 08:02 263392     /lib/ld-2.11.3.so
002b8000-002b9000 r--p 0001e000 08:02 263392     /lib/ld-2.11.3.so
002b9000-002ba000 rw-p 0001f000 08:02 263392     /lib/ld-2.11.3.so
002ba000-00417000 r-xp 00000000 08:02 261530     /lib/libc-2.11.3.so
00417000-00418000 ---p 0015d000 08:02 261530     /lib/libc-2.11.3.so
00418000-0041a000 r--p 0015d000 08:02 261530     /lib/libc-2.11.3.so
0041a000-0041b000 rw-p 0015f000 08:02 261530     /lib/libc-2.11.3.so
0041b000-0041e000 rw-p 00000000 00:00 0 
006a5000-006a6000 r-xp 00000000 00:00 0          [vdso]
00d2b000-00d46000 r-xp 00000000 08:02 261573     /lib/libgcc_s.so.1
00d46000-00d47000 r--p 0001a000 08:02 261573     /lib/libgcc_s.so.1
00d47000-00d48000 rw-p 0001b000 08:02 261573     /lib/libgcc_s.so.1
00ddb000-00de6000 r-xp 00000000 08:02 261617     /lib/libnss_files-2.11.3.so
00de6000-00de7000 r--p 0000a000 08:02 261617     /lib/libnss_files-2.11.3.so
00de7000-00de8000 rw-p 0000b000 08:02 261617     /lib/libnss_files-2.11.3.so
08048000-0804c000 r-xp 00000000 08:02 7886       /usr/bin/tftp
0804c000-0804d000 r--p 00003000 08:02 7886       /usr/bin/tftp
0804d000-0804e000 rw-p 00004000 08:02 7886       /usr/bin/tftp
0804e000-0806e000 rw-p 00000000 00:00 0 
08120000-08141000 rw-p 00000000 00:00 0          [heap]
b772a000-b772b000 rw-p 00000000 00:00 0 
b7739000-b773b000 rw-p 00000000 00:00 0 
bfc3e000-bfc53000 rw-p 00000000 00:00 0          [stack]
Аварийный останов
------- Comment #1 From 2011-07-27 12:15:37 -------
Попробуйте поставить tftp-debuginfo и повторить попытку (а еще лучше запустить
через valgrind).
------- Comment #2 From 2011-07-27 15:41:27 -------
Created an attachment (id=5025) [details]
вывод valgrind

в аттаче вывод valgrind -v tftp 10.7.1.1 -c get pxelinux.0 &> tftp.log
------- Comment #3 From 2011-07-27 16:19:53 -------
А tftp-debuginfo был установлен?
------- Comment #4 From 2011-07-27 16:24:56 -------
Created an attachment (id=5027) [details]
вывод valgrind

вот с установленным tftp-debuginfo
------- Comment #5 From 2011-07-27 17:17:00 -------
Ага, вот теперь уже понятно.
Вот сама функция makerequest (ftp.c):

static int
makerequest(int request, const char *name,
            struct tftphdr *tp, const char *mode)
{
    char *cp;

    tp->th_opcode = htons((u_short) request);
    cp = (char *)&(tp->th_stuff);
    strcpy(cp, name);
    cp += strlen(name);
    *cp++ = '\0';
    strcpy(cp, mode);
    cp += strlen(mode);
    *cp++ = '\0';
    return (cp - (char *)tp);
}

В качестве указателя tp передается указатель на ackbuf (размером 516 байт).
Видимо, из-за слишком длинного имени происходит переполнение (с strcpy это как
два байта переслать). Возможно, это даже тянет на CVE. Исправить можно, но
скорее всего работать на этом файле все равно не будет, но хоть переполнения
буфера не будет.
------- Comment #6 From 2011-07-27 17:48:32 -------
Точнее так - ошибка тут безусловно есть, и переполнение буфера в принципе
возможно. А ругается компилятор на то, что делается попытка strcpy в поле
tu_stuff структуры tftphdr, а это поле определено как 
char tu_stuff[1];

(см. /usr/include/arpa/tftp.h)

При попытке скопировать более 1 байта в tu_stuff, объявленную как char[1], и
возникает сообщение.
------- Comment #7 From 2011-07-27 18:02:24 -------
Created an attachment (id=5029) [details]
Вот такой патч вроде бы решает проблему

Приложил патч, который в принципе должен решить проблему.
------- Comment #8 From 2011-07-27 18:53:10 -------
tftp с приложенным патчем можно взять в задании #50813
http://git.altlinux.org/tasks/50813/
Проверьте пожалуйста, исчезла ли проблема.
------- Comment #9 From 2011-07-28 15:22:31 -------
Все работает. Спасибо огромное. Как будете собирать в Сизиф - скопируйте,
пожалуйста, еще и в t6