$ 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] Аварийный останов
Попробуйте поставить tftp-debuginfo и повторить попытку (а еще лучше запустить через valgrind).
Created attachment 5025 [details] вывод valgrind в аттаче вывод valgrind -v tftp 10.7.1.1 -c get pxelinux.0 &> tftp.log
А tftp-debuginfo был установлен?
Created attachment 5027 [details] вывод valgrind вот с установленным tftp-debuginfo
Ага, вот теперь уже понятно. Вот сама функция 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. Исправить можно, но скорее всего работать на этом файле все равно не будет, но хоть переполнения буфера не будет.
Точнее так - ошибка тут безусловно есть, и переполнение буфера в принципе возможно. А ругается компилятор на то, что делается попытка strcpy в поле tu_stuff структуры tftphdr, а это поле определено как char tu_stuff[1]; (см. /usr/include/arpa/tftp.h) При попытке скопировать более 1 байта в tu_stuff, объявленную как char[1], и возникает сообщение.
Created attachment 5029 [details] Вот такой патч вроде бы решает проблему Приложил патч, который в принципе должен решить проблему.
tftp с приложенным патчем можно взять в задании #50813 http://git.altlinux.org/tasks/50813/ Проверьте пожалуйста, исчезла ли проблема.
Все работает. Спасибо огромное. Как будете собирать в Сизиф - скопируйте, пожалуйста, еще и в t6