karavan Цитата: можно в кратце описать опасность?
уязвимость в функциях резолвинга ip адресов по имени.
идет переполнение буфера и возможность выполнения кода с правами того, под кем запущено приложение.
при этом, если используются различные публичные сервисы (тот же ssh, почтовики, веб сервера), то данную уязвимость можно использовать удаленно.
те, кто открыл уязвимость, показали практический пример получив доступ к шеллу простым письмом почтовому серверу (понятно, что права шелла будут те же, что и права почтовика, но это не облегчает ситуацию).
код эксплойта они пока не публикуют, ждут пока хотя бы 50% серверов избавятся от уязвимости, а затем будет в открытом доступе.
ну и проверить можно либо по версии glibc (2.17 включительно, вроде бы) или скомпилировав и запустив следующий код
Код: #include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#define CANARY "in_the_coal_mine"
struct {
char buffer[1024];
char canary[sizeof(CANARY)];
} temp = { "buffer", CANARY };
int main(void) {
struct hostent resbuf;
struct hostent *result;
int herrno;
int retval;
/*** strlen (name) = size_needed - sizeof (*host_addr) - sizeof (*h_addr_ptrs) - 1; ***/
size_t len = sizeof(temp.buffer) - 16*sizeof(unsigned char) - 2*sizeof(char *) - 1;
char name[sizeof(temp.buffer)];
memset(name, '0', len);
name[len] = '\0';
retval = gethostbyname_r(name, &resbuf, temp.buffer, sizeof(temp.buffer), &result, &herrno);
if (strcmp(temp.canary, CANARY) != 0) {
puts("vulnerable");
exit(EXIT_SUCCESS);
}
if (retval == ERANGE) {
puts("not vulnerable");
exit(EXIT_SUCCESS);
}
puts("should not happen");
exit(EXIT_FAILURE);
}