2015-02-01 3 views
5

Ich habe einen Redhat ES 3.x-Server (ich kann aufgrund der Einschränkungen in einer alten, nicht unterstützten Anwendung keine spätere Distribution installieren) und versuche, glibc manuell zu patchen für die Ghost-Schwachstelle.Manuelles Patchen für die Ghost-Schwachstelle auf dem Legacy-Server

Basierend auf der Analyse von Qualys (http://www.openwall.com/lists/oss-security/2015/01/27/9) scheint es, dass es leicht sein sollte, die glib-Quelle zu ändern, um das Stack/Heap-Überlaufproblem zu behandeln. Aber ich hätte gerne noch ein paar Augen mehr auf meine Prozedur, um zu sehen, ob ich etwas verpasst habe, usw.

Hier ist was ich getan habe. Zuerst habe ich gebaut & den glib Quellbaum aus den SRPM prepped:

rpm -ivh glibc-2.3.2-95.50.src.rpm 
rpmbuild -bp /usr/src/redhat/SPECS/glibc.spec 
cd /usr/src/redhat/BUILD 
cp -av glibc-2.3.2-200309260658 glibc-org 
cd glibc-2.3.2-200309260658 

Als nächsten bearbeiten ich NSS/digits_dots.c vor allem auf diesem Absatz aus dem QALYs Artikel oben:

Linien 121-125 Bereiten Sie Zeiger vor, um vier (4) unterschiedliche Entitäten in Puffer zu speichern: host_addr, h_addr_ptrs, h_alias_ptr und hostname. Die Größe (* h_alias_ptr) - die Größe eines Char-Zeigers - fehlt in der Berechnung von size_needed.

vi nss/digits_dots.c 

I edited these two statements: 
    105: size_needed = (sizeof (*host_addr) 
        + sizeof (*h_addr_ptrs) + strlen (name) + 1); 

    277: size_needed = (sizeof (*host_addr) 
        + sizeof (*h_addr_ptrs) + strlen (name) + 1); 

to this: 
    105: size_needed = (sizeof (*host_addr) 
        + sizeof (*h_addr_ptrs) + strlen (name) 
        + sizeof (*h_alias_ptr) + 1); 

    277: size_needed = (sizeof (*host_addr) 
         + sizeof (*h_addr_ptrs) + strlen (name) 
         + sizeof (*h_alias_ptr) + 1);      

Als nächstes habe ich eine Patch-Datei + aktualisiert, um die Spec-Datei mein Patch enthalten + gebaut Binärdateien:

cd /usr/src/redhat/BUILD 
diff -Npru glibc-org glibc-2.3.2-200309260658 > glibc-digit_dots-ghost.patch 
cp glibc-digit_dots-ghost.patch ../SOURCES/ 

cd /usr/src/redhat/SPECS 
vi glibc.spec 
rpmbuild -ba glibc.spec 

Schließlich ich aktualisiert glibc die neuen Binärdateien mit (RPM):

cd /usr/src/redhat/RPMS/i386 
rpm -Uvh --nodeps glibc-2.3.2-95.51.i386.rpm glibc-devel-2.3.2-95.51.i386.rpm glibc-profile-2.3.2-95.51.i386.rpm glibc-utils-2.3.2-95.51.i386.rpm glibc-common-2.3.2-95.51.i386.rpm glibc-headers-2.3.2-95.51.i386.rpm 

Nach dem Neustart des Servers habe ich den Ghost-Tester (https://webshare.uchicago.edu/orgs/ITServices/itsec/Downloads/GHOST.c) erneut ausgeführt.

Dieses Mal habe ich "sollte nicht passieren" anstelle von "anfällig", was ich denke, ist gut. Aber ich hatte erwartet, "nicht verletzlich" zu werden. Habe ich etwas vermisst, oder ist es nur, dass meine Lösung sich von der offiziellen Lösung in den unterstützten Distributionen unterscheidet?

Antwort

3

Ich habe für ähnliche Patch für alte Fedora-Release der Suche ... fand ich diesen Q & A bei ServerFault über die über das Patchen ältere Debian Lenny ist:

https://serverfault.com/questions/662971/how-to-patch-cve-2015-0235-ghost-on-debian-lenny-and-squeeze

In einem die Antworten, sie verweisen auf official glibc patch, die das diff ein paar zusätzliche Änderungen anders als Ihre zeigt. Es ist wahrscheinlich die fehlende *status = NSS_STATUS_NOTFOUND;, die in den Zustand "sollte nicht passieren" geraten sollte.

Hoffe, dass hilft! (Entschuldigen Sie bitte nicht genug Rep Punkte um Ihre Frage zu verbessern ...)

+0

Einverstanden. Schauen Sie sich einfach das .patch an und benutzen Sie es als Leitfaden. – Joe

+0

@jason_uruguru Danke - Ich habe diesen offiziellen Glibc-Patch als Leitfaden für das Patchen meines Systems verwendet, und es scheint, als hätte es einen Zauber gewirkt! –

+0

Dank für alle Infos hier, tolles Lernen. Ich bekomme auch "sollte nicht passieren", obwohl ich eng an den Patch klebte, außer Test-digits-dots.c überspringen. @Jim, gab es eine bestimmte Codeänderung oder Konfiguration, die es schließlich gut gemacht hat? – rvh