PHP Sicherheitsleck: Entfernter Angreifer kann Befehle ausführen

Eine Sicherheitslücke in PHP hat zur Folge, dass ein entfernter Angreifer Befehle mit den Rechten der PHP-Applikation ausführen kann.

Der Angreifer muss zum Ausführen der Attacke ein speziell konstruiertes X.509-Zertifikat an die Applikation schicken. Entweder werden dann die von ihm
gewünschten Befehle ausgeführt oder die Anwendung stürzt ab. Ursache hierfür ist ein Speicherüberlauf, der in der “openssl_x509_parse()”-Funktion in der “ext/openssl/openssl.c”-Datei auftreten kann.

Der Patch hierfür sieht folgendermaßen aus:

--- a/ext/openssl/openssl.c
+++ b/ext/openssl/openssl.c
@@ -644,18 +644,28 @@ static time_t asn1_time_to_time_t(ASN1_UTCTIME * timestr TSRMLS_DC) /* {{{ */
        char * thestr;
        long gmadjust = 0;
 
-       if (timestr->length < 13) {
-               php_error_docref(NULL TSRMLS_CC, E_WARNING, "extension author too lazy to parse %s correctly", timestr->data);
+       if (ASN1_STRING_type(timestr) != V_ASN1_UTCTIME) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "illegal ASN1 data type for timestamp");
                return (time_t)-1;
        }
 
-       strbuf = estrdup((char *)timestr->data);
+       if (ASN1_STRING_length(timestr) != strlen(ASN1_STRING_data(timestr))) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "illegal length in timestamp");
+               return (time_t)-1;
+       }
+
+       if (ASN1_STRING_length(timestr) < 13) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to parse time string %s correctly", timestr->data);
+               return (time_t)-1;
+       }
+
+       strbuf = estrdup((char *)ASN1_STRING_data(timestr));
 
        memset(&thetime, 0, sizeof(thetime));
 
        /* we work backwards so that we can use atoi more easily */
 
-       thestr = strbuf + timestr->length - 3;
+       thestr = strbuf + ASN1_STRING_length(timestr) - 3;
 
        thetime.tm_sec = atoi(thestr);
        *thestr = '\0';

Der Overflow tritt in diesen Code-Zeilen im Zusammenhang mit der “timestr”-Variable auf, deren Wert ein Angreifer über das präparierte X.509-Zertifikat modifizieren kann. Der Patch ersetzt die unvollständigen Sicherheitschecks durch weitere “If()”-Abfragen, um die Attacke zu vermeiden.

Betroffen sind die Versionen vor 5.3.28, 5.4.23, 5.5.7.

Nach oben