Ghost — новый критический удар по безопасности и репутации Linux

Не прошло и полгода, как в Linux опять нашли критическую уязвимость, сопоставимую по опасности с Hearbleed и Shellshock. Кодовое имя нового отверстия на израненном теле Линукса — Ghost.

Ошибка содержится в одной из ключевых системных библиотек — glibc. Как оказалось, в функции __nss_hostname_digits_dots() из этой библиотеки допущена классическая ошибка переполнения буфера, позволяющая злоумышленнику через вызов функции gethostbyname() удаленно выполнить произвольный код с правами того пользователя, от имени которого запущена уязвимая программа.

Ошибка описана, изучена, ей присвоен инвентаризационный номер CVE-2015-0235, выпущена заплатка.

Любопытным может показаться тот факт, что ошибка была сделана в 2000 году, а в 2013 таки исправлена. Но последняя генерация «стабильных дистрибутивов» — Debian 7 и Ubuntu 12.04, RHEL 6 и 7, CentOS 6 и 7 и так далее — используют glibc 2012 года. Таким образом, старые «стабильные» линуксы оказались уязвимыми, а полуэкспериментальные — нет.

Как проверить свой Linux на уязвимость Ghost

Скопируйте текст, скомпилируйте его с помощью gcc и запустите. Если уязвимость присутствует, то будет выдано соответствующее уведомление.

#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("Бля, опасность!");
    exit(EXIT_SUCCESS);
  }
  if (retval == ERANGE) {
    puts("Ваш Линупс неуязвим");
    exit(EXIT_SUCCESS);
  }
  puts("should not happen");
  exit(EXIT_FAILURE);
}

Тест на уязвимость любезно предоставлен компанией Qualys Security.

Ваша оценка: Нет Средняя оценка: 5 (3 votes)
On

Да, в Debian 7 такое было. Пришлось экстренно офлайнить Либератум и ввинчивать пробку.

Для любителей разобраться в деталях тут наглядная схема эксплуатации уязвимости.

Ваша оценка: Нет Средняя оценка: 3.7 (3 votes)
comrade

Xubuntu 12.04 — «Ваш Линупс неуязвим» :-)

Ваша оценка: Нет
On

В Убуке 12.04 должно быть. Видать, Вы обновлялись.

Ваша оценка: Нет
dk

Arch — аналогично

Ваша оценка: Нет
On

Было бы странно, если бы в дистрибутиве с роллинг-релизами был glibc от 2012 года.

Ваша оценка: Нет
Texnoline

Линуксоиды уже устали бояться!:) Ну обновлятся и патчи накатывать мы все превыкли. Так, что одной больше или меньше- реали IT-tech!:)

Ваша оценка: Нет
On

Так это потому, что Вы админите только свой домашний комп. А вот тем, кто отвечает за сервера с коммерческими сайтами, тем такие дырки ой как не нравятся. Во-первых, придется все чинить. Во-вторых, в некоторых случаях за такие факапы и отмудохать могут. В финансовом или даже физическом смысле. И бесполезно объяснять, что сервер лег из-за криворукого автора glibc и сисадмин тут невиновен.

Ваша оценка: Нет Средняя оценка: 5 (3 votes)
Texnoline

1. как раз, это потому что я не админю только свой домашний комп:( Великий On, что случилось с вашей прозорливостью?:)
2. скорее всего потому что я даже в молодости, не был особо нервным админом, особенно, когда намекали люди из руководства, что могут и «отмудохать»!
3. Зачем работать на дядю, который может в легкую переломать тебе руки и ноги, в чем здесь параноидальный профит!?

Ваша оценка: Нет
Яндекс.Метрика