Переполнение буфера обнаружено в Wu-ftpd FTP сервере. Удаленный атакующий может выполнить произвольный код на системе с root привилегиями.
Off-by-one переполнение обнаружено в функции fb_realpath().
Переполнение происходит когда длина созданного пути равна MAXPATHLEN+1
символам, в то время как размер буфера равен MAXPATHLEN. Переполненный буфер находится в стеке.
Ошибка связанна с неправильным использованием переменной rootd в вычислении длины составной строки:
/*
* Join the two strings together, ensuring that the right thing
* happens if the last component is empty, or the dirname is root.
*/
if (resolved[0] == '/' && resolved[1] == '\0')
rootd = 1;
else
rootd = 0;
if (*wbuf) {
if (strlen(resolved) + strlen(wbuf) + rootd + 1 > MAXPATHLEN) {
errno = ENAMETOOLONG;
goto err1;
}
if (rootd == 0)
(void) strcat(resolved, "/");
(void) strcat(resolved, wbuf);
}
Так как путь создается из текущего рабочего каталога и имени файла, определенного как параметр к различным FTP командам, атакующий должен создать
достаточно глубокую структуру каталогов. Уязвимы следующие FTP команды:
- STOR
- RETR
- APPE
- DELE
- MKD
- RMD
- STOU
- RNTO
Эта уязвимость может быть неэксплуатируемая, если размер буфера более MAXPATHLEN символов. Это может произойти, если wu-ftpd компилирован с некоторыми версиями LINUX ядра, в которых PATH_MAX (и MAXPATHLEN соответственно) равен 4095 символам. В этом случае, буфер дополняется дополнительным байтом из-за выравнивания переменной в результате оптимизации кода.
Linux 2.2.x and некоторые ранние версии Linux 2.4.х определяют PATH_MAX к 4095 символам. Т.е. уязвимы только системы с ядром 2.0.x и последними версиями 2.4.x. Для успешной
эксплуатации удаленный атакующий должен иметь привилегии на записть на FTP сервере.
Уязвимость проверена на Linux 2.4.19 с wu-ftpd 2.5.0 <= 2.6.2.