Забавная уязвимость в libpam-pgsql или насколько важно иметь правильный IP
Когда выходит оригинальная новость, непременно хочется поделиться ею с кем-то. Сегодня – это уязвимость в libpam-pgsql. Сама по себе уязвимость сложна в эксплуатации и не интересна с этой точки зрения. Но вот природа ошибки довольно забавна. Заключается она в том, что в файле src/backend_pgsql.c вызывается функция pg_execParam(), которая содержит следующий код:
/* Make IP string */
raddr = malloc(16);
sprintf(raddr, "%d.%d.%d.%d",
hentry->h_addr_list[0][0],
hentry->h_addr_list[0][1],
hentry->h_addr_list[0][2],
hentry->h_addr_list[0][3]);
raddr[15] = 0;
Эта функция использует спецификатор форматной строки %d для преобразования IP адреса, который не совсем корректно работает с числами более 127. В результате, если будет осуществлено подключение с IP адреса x.199.x.x, этот адрес будет преобразован в x.-57.x.x.
Таким образом, чтобы вызвать повреждение динамической памяти и аварийно завершить работу приложения или выполнить произвольный код на системе, нужно иметь ПРАВИЛЬНЫЙ IP адрес :)
Обращаем внимание, что все материалы в этом блоге представляют личное мнение их авторов. Редакция SecurityLab.ru не несет ответственности за точность, полноту и достоверность опубликованных данных. Вся информация предоставлена «как есть» и может не соответствовать официальной позиции компании.