
Доаутентификационное переполнение кучи в Xlight SFTP server <= 3.9.4.2
Xlight 32- и 64-битные версии <= 3.9.4.2
Неаутентифицированный злоумышленник с доступом к Xlight SFTP может получить выполнение кода или вызвать отказ в обслуживании.
Строки, передаваемые по сети в протоколе SFTP, предваряются четырёхбайтовой длиной. Функция, которую Xlight использует для чтения этих строк из сетевого пакета, имеет целочисленное переполнение при проверке длины и при выделении необходимого объёма памяти. Создав четырёхбайтовую длину для строки, мы можем вызвать большое перемещение памяти (memmove) (~4 ГБ) из буфера, контролируемого злоумышленником, за пределы границ кучи.
Уязвимая функция используется для приёма строк на протяжении всего рукопожатия SSH, в том числе до аутентификации при получении поддерживаемых алгоритмов, наборов шифров, а также имени пользователя и пароля от клиента. Мы можем нацелиться на любую из этих строк с специально сформированной длиной, чтобы запустить эксплойт.
Это легко вызвать, но простота эксплуатации зависит от разрядности двоичного файла Xlight.
На 32-битной системе копирование выйдет за пределы кучи, затирая всё в процессе, прежде чем вызовет крах. Вероятно, можно повредить соседнюю структуру в куче и воспользоваться многопоточной природой этого сервера для доступа к повреждённым данным, до того как неконтролируемое копирование приведёт к аварийному завершению процесса.
На 64-битной системе мы не можем получить запись за границы (OOB write), потому что аргумент размера для вызова выделения памяти — size_t (т.е. 64-битный при компиляции для 64-бит), поэтому мы не можем переполнить это значение при сложении двух 32-битных целых чисел, и вместо этого мы просто выделяем большой буфер ~4 ГБ. Эта ошибка приводит к чтению за границы (OOB read), что аварийно завершает процесс.