Новая критическая уязвимость Linux в glibc
02 Feb 2015 | Автор: dd |В середине прошлой недели безопасники из компании Qualys опубликовали в своем блоге новость, что способны написать эксплоит базирующийся на древней уязвимости одной из основополагающих сишных библиотек Linux – GNU C Library (glibc) и направленный на вывод из строя почтового сервера Exim (при использовании в конфиге параметров проверок “helo_verify_hosts”, “helo_try_verify_hosts” или ACL “verify = helo”).
Уязвимость была обнаружена еще в начале 2Yk, в версии glibs 2.2, и тихой сапой пофиксена 2 года назад, без фанфар о прикрытии критичной уязвимости, т.ч многие старые ветки Linux до сих используют версии glibc < 2.18 (хотя заплатка была межу 2.17 и 2.18) в которых данная уязвимость, получившая название Ghost (CVE-2015-0235) не пропатчена. Уязвимости подвержены 32 и 64 битные системы на базе Debian 7 и Ubuntu 12.04, Red Hat Enterprise Linux 6/7, CentOS 6/7.
Эксплоит приводит к переполнению буффера через функции gethostbyname() и gethostbyname2() и позволяет злоумышленнику выполнить удаленный код с правами пользователя от которого запущен атакуемый процесс.
Несколько позже была опубликована информация о том, что некоторое количество софта не является уязвимым: 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, xinetd.
Теоретически данная уязвимость затрагивает весь линуксовый софт, использующий запросы доменных имен. Поэтому уязвимость может быть направлена не только против серверных сервисов, но и против клиентских приложений.
Вендоры операционок срочно выпускают заплатки к скомпрометированным операционкам, а пока можно затестить собственную ось с помощью небольшого скрипта:
# cat GHOST.c
#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);
}
доступного на GitHub
собираем чекер
# gcc GHOST.c -o GHOST
и чекаем систему
1. # cat /etc/redhat-release
CentOS Linux release 7.0.1406 (Core)
# ./GHOST
not vulnerable
2. # cat /etc/redhat-release
CentOS release 6.6 (Final)
# ./GHOST
vulnerable
# yum -y upgrade glibc
# ./GHOST
not vulnerable
После установки патча систему необходимо перегрузить, т.к после установки заплатки, сервисы продолжают использовать старую версию библиотеки. Если критично перегружать сервер, то можно руками перезапустить сервисы использующие устаревшую версию glibc, которые выводятся следующей командой:
# lsof | grep libc | awk ‘{print $1}’ | sort | uniq