ПЗ

Уязвимость GHOST в Linux обнаружили спустя 14 лет

0

Мир свободного софта поразила ещё одна критическая уязвимость, которой присвоено собственное имя: GHOST («призрак»). Дыра существует в Linux-системах, использующих библиотеку Glibc (GNU C Library), начиная с версии glibc-2.2 от 2000 года.

С помощью GHOST злоумышленник способен с удивительной лёгкостью (например, отправив письмо по электронной почте) получить полный контроль над компьютером жертвы, не владея заранее никакой информацией об учётных данных. Потенциально уязвимыми к GHOST называют почтовые серверы, MySQL-серверы, Secure Shell серверы, приложения обработки веб-форм и др.

Удалённое выполнение произвольного кода в системе происходит после переполнения буфера в функции __nss_hostname_digits_dots(), которую, в свою очередь, используют функции gethostbyname() и gethostbyname2() библиотеки Glibc.

Версия glibc-2.2 выпущена 10 ноября 2000 года. Баг исправлен патчем между релизами glibc-2.17 и glibc-2.18. К сожалению, его не классифицировали как патч безопасности, так что почти все популярные дистрибутивы с долговременной поддержкой остались на старой «стабильной» версии glibc. Среди них Debian 7 (Wheezy), Red Hat Enterprise Linux 6 & 7, CentOS 6 & 7, Ubuntu 12.04 и другие.

Подробно об уязвимости, которой присвоен технический идентификатор CVE-2015-0235, рассказали исследователи из компании Qualys.

В течение последнего времени Qualys тесно сотрудничала с вендорами, чтобы выпустить патчи для всех поражённых дистрибутивов Linux. С сегодняшнего дня патчи доступны для установки.

Проверка машины на наличие уязвимости GHOST осуществляется с помощью этой утилиты, которую выпустили исследователи из Qualys.

CVE-2015-0235 (GHOST) test code

  1. #include <netdb.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <errno.h>
  6. #define CANARY «in_the_coal_mine«
  7. struct {
  8. char buffer[1024];
  9. char canary[sizeof(CANARY)];
  10. } temp = { «buffer«, CANARY };
  11. int main(void) {
  12. struct hostent resbuf;
  13. struct hostent *result;
  14. int herrno;
  15. int retval;
  16. /*** strlen (name) = size_needed — sizeof (*host_addr) — sizeof (*h_addr_ptrs) — 1; ***/
  17. size_t len = sizeof(temp.buffer) — 16*sizeof(unsigned char) — 2*sizeof(char *) — 1;
  18. char name[sizeof(temp.buffer)];
  19. memset(name, 0, len);
  20. name[len] = \0;
  21. retval = gethostbyname_r(name, &resbuf, temp.buffer, sizeof(temp.buffer), &result, &herrno);
  22. if (strcmp(temp.canary, CANARY) != 0) {
  23. puts(«vulnerable«);
  24. exit(EXIT_SUCCESS);
  25. }
  26. if (retval == ERANGE) {
  27. puts(«not vulnerable«);
  28. exit(EXIT_SUCCESS);
  29. }
  30. puts(«should not happen«);
  31. exit(EXIT_FAILURE);
  32. }
  33. /* from http://www.openwall.com/lists/oss-security/2015/01/27/9 */

Взято с Xakep.ru

Comments

Leave a reply