Bug 25954

Summary: buffer overflow detected
Product: Sisyphus Reporter: enp <enp>
Component: tftpAssignee: Sergey Bolshakov <sbolshakov>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: normal    
Priority: P3 CC: sbolshakov
Version: unstable   
Hardware: all   
OS: Linux   
Attachments:
Description Flags
вывод valgrind
none
вывод valgrind
none
Вот такой патч вроде бы решает проблему none

Description enp 2011-07-27 11:23:16 MSK
$ 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 Damir Shayhutdinov 2011-07-27 12:15:37 MSK
Попробуйте поставить tftp-debuginfo и повторить попытку (а еще лучше запустить через valgrind).
Comment 2 enp 2011-07-27 15:41:27 MSK
Created attachment 5025 [details]
вывод valgrind

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

вот с установленным tftp-debuginfo
Comment 5 Damir Shayhutdinov 2011-07-27 17:17:00 MSK
Ага, вот теперь уже понятно.
Вот сама функция 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 Damir Shayhutdinov 2011-07-27 17:48:32 MSK
Точнее так - ошибка тут безусловно есть, и переполнение буфера в принципе возможно. А ругается компилятор на то, что делается попытка strcpy в поле tu_stuff структуры tftphdr, а это поле определено как 
char tu_stuff[1];

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

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

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