Kritiek beveiligingslek GHOST in Linux gepubliceerd

Onderzoekers van beveiligingsbedrijf Qualys hebben vandaag een ernstig beveiligingsprobleem in de Linux GNU C Library (glibc) gepubliceerd via de OSS Security mailing list. De kwetsbaarheid is ontdekt tijdens een code audit en heeft de naam ‘GHOST’ gekregen. Dit beveiligingslek heeft CVE-2015-0235 toegewezen gekregen.

De GHOST kwetsbaarheid maakt het mogelijk op afstand de controle over Linux systemen over te nemen en hierop willekeurige code uit te voeren.

Vrijwel alle Linux versies zijn kwetsbaar
Het GHOST beveiligingslek is aanwezig in ieder Linux-systeem dat gebruik maakt van glibc-2.2. Kwetsbare Linux-systemen zijn onder andere Debian 7 (Wheezy), RHEL 5, 6, en 7, CentOS 6 en 7 en Ubuntu 12.04.

Versie 2.2 van glibc bestaat al vrij lang, deze versie van het component is uitgebracht op 10 november 2000. De kwetsbaarheid was overigens eerder al eens opgelost in een bug fix die was uitgebracht op 21 mei 2013 tussen de releases van glibc- 2.17 en glibc-2.18. Omdat deze fix echter niet als beveiligingsprobleem werd geclassificeerd, is deze niet opgenomen in de meeste Linux distributies die op dit moment in gebruik zijn.

Werking van GHOST
De kritieke kwetsbaarheid is aanwezig in de functie gethostbyname van glibc. Deze functie wordt gebruikt om een computernaam (hostname) te vertalen naar het bijbehorende IP-adres, via het /etc/hosts bestand of door het opzoeken van de internet domeinnaam via het Domain Name System (DNS). Om het lek te misbruiken hoeft een aanvaller alleen een ongeldige hostname aan de gethostbyname functie terug te geven. Dit veroorzaakt een buffer overflow waarmee willekeurige code kan worden uitgevoerd op de server. De code wordt uitgevoerd met de rechten van de DNS-gebruiker op het systeem. Hiermee kan een kwaadwillende een server op afstand overnemen.

“GHOST vormt een risico voor het uitvoeren van willekeurige code op afstand waarmee het heel eenvoudig is voor een aanvaller om een machine te misbruiken. Zo kan een aanvaller simpelweg een e-mail sturen op een Linux-gebaseerd systeem en hiermee automatisch volledige toegang tot die machine krijgen”, aldus Qualys’s CTO Wolfgang Kandek in een verklaring. “Gezien het grote aantal systemen op basis van glibc, zijn wij van mening dat dit een zeer ernstige kwetsbaarheid is die onmiddellijk moet worden verholpen. De beste aanpak om het risico te beperken is een patch van uw Linux-leverancier te installeren.”

Qualys heeft een Proof of Concept (PoC) ontwikkeld waarmee een remote shell op een Linux mailserver wordt verkregen, door een speciaal geprepareerd e-mail bericht aan deze mailserver te sturen. Volgens Qualys “omzeilt dit alle bestaande beveiligingen (zoals ASLR, PIE en NX) op zowel 32-bit en 64-bit systemen.”

Advies: beveiligingsupdate direct installeren
Het advies is de beveiligingsupdate voor CVE-2015-0235 direct te installeren wanneer deze voor uw Linux distributie beschikbaar komt. Hierna moet het systeem worden herstart omdat gethostbyname door veel systeemprocessen wordt aangeroepen, waaronder auditd, dbus-Daem, dhclient, init, master, mysqld, rsyslogd, sshd, udevd, en xinetd. Een herstart is de enige manier waarop deze processen gegarandeerd de nieuwe glibc code gebruiken.

Via het Red Hat Network zijn inmiddels updates beschikbaar gemaakt waarmee de GHOST kwetsbaarheid op Red Hat Enterprise Linux (RHEL) versies 5, 6 en 7 is te repareren. Debian is op dit moment zijn ‘core distributions’ aan het repareren en heeft een overzicht van kwetsbare versies gepubliceerd. Ubuntu heeft het lek voor de huidige versie 12.04 en de oudere versie 10.04 opgelost. CentOS werkt op dit moment aan een beveiligingsupdate, maar wacht volgens een forumbericht op het beschikbaar komen van een ‘upstream patch’ en een medewerker die de code kan ondertekenen. Update: Voor CentOS is inmiddels ook een beveiligingsupdate beschikbaar.

Testscript
Met het onderstaande script kan worden getest of een Linux systeem kwetsbaar is voor GHOST:

Stap 1. Maak het volgende tekstbestand:
$ cat > GHOST.c < < EOF #include
#include
#include
#include
#include

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

Stap 2. Compileer het bovenstaande script:
$ gcc GHOST.c -o GHOST

Stap 3. Test uw server door het script aan te roepen:
$ ./GHOST

Aanmelden voor onze nieuwsbrief