1 Марта, 2011

Забавная уязвимость в 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 адрес :)

Подробное описание уязвимости:
http://www.securitylab.ru/vulnerability/404943.php
или введите имя

CAPTCHA