Tags Posts tagged with "cve-2015-0235"

cve-2015-0235

przez -
17 1022
Bezpieczeństwo i szyfrowanie

Pracownicy firmy Qualys poinformowali o poważnym błędzie bezpieczeństwa – CVE-2015-0235 w popularnej linuksowej bibliotece glibc. Podatność otrzymała kryptonim o nazwie GHOST, a za jej pomocą atakujący może przejąć całkowitą kontrolę nad serwerem. Atak można przeprowadzić zdalnie lub lokalnie, a podatne na ową lukę mogą być, ale nie muszą aplikacje: Apache, CUPS, Dovecot, GnuPG, isc-dhcp, Lighttpd, MariaDB, MySQL, nfs-utils, nginx, nodejs, OpenLDAP, OpenSSH, Postfix, proftpd, pure-ftpd, rsyslog, Samba, sendmail, sysklogd, syslog-ng, tcp_wrappers, vsftpd i xinetd.

Luka GHOST to typowy atak z przepełnieniem bufora (buffer overflow), który został znaleziony w funkcji __nss_hostname_digits_dots() biblioteki glibc. Służy ona do zamiany nazw DNS na adresy IP (i na odwrót). Warto zaznaczyć, że podatne są wszystkie aplikacje, korzystające z protokołu DNS poprzez funkcje z rodziny gethostbyname*().

Autorzy udostępniają też niewielki kod w języku C, sprawdzający czy jesteśmy podatni czy nie:

#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);
}

Sprawdzenia można dokonać przy pomocy poniższych poleceń:

cd /usr/src
wget https://gist.githubusercontent.com/koelling/ef9b2b9d0be6d6dbab63/raw/de1730049198c64eaf8f8ab015a3c8b23b63fd34/gistfile1.c --no-check-certificate
gcc gistfile1.c -o CVE-2015-0235
./CVE-2015-0235

Łatki zostały udostępnione przez: Red Hat (Bug 1183461), Canonical (USN-2485-1), Debiana (CVE-2015-0235).

Po aktualizacji należy zrestartować wszystkie usługi, które wykorzystują glibc, a najlepiej jest zrobić restart serwera:

lsof | grep libc | awk '{print $1}' | sort | uniq

Warto spojrzeć sobie na historię błędu GHOST, ponieważ pierwsze zgłoszenie zostało zarejestrowane już 12 stycznia 2013 roku i nadano mu numer Bug 15014. Poprzednia luka została naprawiona 21 maja 2013 roku, jednakże nie nadano jest statusu błędu krytycznego, przez co wiele systemów nie zrobiło aktualizacji do najnowszej wersji.

Ciekawy wydaje się również 4 komentarz, który brzmi następująco:

Florian *has* reviewed over 3000 past glibc bugs for security impact
(there are a fair number more, mostly older bugs, not yet given a security
flag), but as this case illustrates it may not be apparent from the bug
description that a buffer overrun was involved at all (the subject of this
bug rather suggests a conformance issue with a wrong errno value).

Now, if someone else wants to do their own review of over 3000 bugs with
“security-” flag, and to query cases where they disagree with that
assessment, that would be welcome, but probably also very tedious and not
likely to find many cases of misclassified bugs.

Wynika z niego, że w glibc zostało przejrzanych ponad 3000 błędów wstecz, ale żaden póki co nie otrzymał statusu krytycznego. Deweloperzy zalecają także samodzielne przeszukanie i zgłoszenie ewentualnych uwag.

Polecane

Jesień Linuksowa

1 761
Polska Grupa Użytkowników Linuksa ma zaszczyt zaprosić na konferencję Jesień Linuksowa 2017, która odbędzie się w dniach 22 – 24 września 2017 roku. Jako...