Bugtraq mailing list archives

OpenSSL v1.0.2 for Linux affected by CVE-2015-0235


From: "Nicholas Lemonias." <lem.nikolas () googlemail com>
Date: Wed, 11 Mar 2015 15:35:49 +0000

-=[  Advanced Information Security Corporation ]=-


-----------------------------------------------------------------------------------
Author: Nicholas Lemonias
Type:   Security Audit Notes
Date:   07/3/2015
Email:  lem.nikolas () gmail com
Audit:   OpenSSL v1.0.2 (22nd of January, 2015 Release)
-----------------------------------------------------------------------------------

Introduction
==========
During a source-code audit of the OpenSSL v1.0.2 implementation for
Linux; conducted internally by the Advanced Information Security
Group, instances of deprecated function use, were observed in relation
to the GHOST vulnerability (CVE-2015-0235). However this may not be a
direct vulnerability in the way the SSL/TLS protocol functions, the
OpenSSL implementation is impacted, leaving systems subtle to attacks.
The issue stems from a heap based buffer overflow in the
__nss_hostname_digits_dots() function in glibc and which subsequently
affects the _gethostbyname as per the (CVE-2015-0235).  [1] [2]

Software Overview
===============
OpenSSL is an open-source implementation of the SSL and TLS protocol.
The core library is written in the C Language, and implements basic
cryptographic functions, and
also provides various utility functions. Implementation versions are
available for most
UNIX-like operating systems (including Solaris,Linux, Mac OS X and the
various open-
source BSD operating systems), OpenVMS and
Microsoft Windows. IBM provides a port for the System i (OS/400).
OpenSSL is based on SSLeay by Eric Andrew Young and Tim Hudson,
development of which unofficially ended on December 17, 1998, when
Young and Hudson both started to work for RSA Security
.
Vulnerability
===============
Software that make use of _gethostbyname()
are affected ( when glibc 2.2 through to 2.17 is used).
The issues stem from a heap-based buffer overflow in the
__nss_hostname_digits_dots() function in glibc, and which subsequently
affects the _gethostbyname family.

Therefore, this security note is to inform OpenSSL users and service,
since many Linux distributions have still not backported an upgrade
for the GHOST vulnerability for their distros, thus constituing the
OpenSSL v1.0.2 implementation for Linux a point of intrusion.



PoC - Code Snippet
========================
(.../crypto/bio/b_sock.c)

{  Line 114 - 148 }

int BIO_get_host_ip(const char *str, unsigned char *ip)
{
    int i;
    int err = 1;
    int locked = 0;
    struct hostent *he;  /* vulnerable structure */
    i = get_ip(str, ip);
    if (i < 0) {
        BIOerr(BIO_F_BIO_GET_HOST_IP, BIO_R_INVALID_IP_ADDRESS);
        goto err;
    }

    /*
     * At this point, we have something that is most probably correct in some
     * way, so let's init the socket.
     */
    if (BIO_sock_init() != 1)
        return 0;               /* don't generate another error code here */

    /*
     * If the string actually contained an IP address, we need not do
     * anything more
     */
    if (i > 0)
        return (1);

    /* do a gethostbyname */
    CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME);
    locked = 1;
    he = BIO_gethostbyname(str); /* affected gethostbyname function*/
    if (he == NULL) {
        BIOerr(BIO_F_BIO_GET_HOST_IP, BIO_R_BAD_HOSTNAME_LOOKUP);
        goto err;
    }
--------------------------[Continue]--------------------------------------------------------------
{  Lines 374 - 379 }

struct hostent *BIO_gethostbyname(const char *name) /* affected code */
{
# if 1
    /*
     * Caching gethostbyname() results forever is wrong, so we have to let
     * the true gethostbyname() worry about this
     */
#  if (defined(NETWARE_BSDSOCK) && !defined(__NOVELL_LIBC__))
    return gethostbyname((char *)name);
#  else
    return gethostbyname(name);  /* affected code */
#  endif
# else
    struct hostent *ret;
    int i, lowi = 0, j;
    unsigned long low = (unsigned long)-1;


(.../apps/s_server.c)
===============

When a BIO_do_connect() is issued by a client and the reverse dns
procedure fails the following error occurs on the server side:

gethostbyname failure
0 items in the session cache
0 client connects (SSL_connect())
0 client renegotiates (SSL_connect())
0 client connects that finished
0 server accepts (SSL_accept())
0 server renegotiates (SSL_accept())
0 server accepts that finished
0 session cache hits
0 session cache misses
0 session cache timeouts
0 callback cache hits
0 cache full overflows

(.../apps/s_client.c)
===============
openssltest@shell:~$ openssl s_client -connect 0x1337.1337.12883.us:5061
gethostbyname failure
connect:errno=0
openssltest@shell:~$

Appendice
==========
Sincere Thanks to the OpenSSL team for their feedback.

The heap overflow can affect OpenSSL implementations when an unpatched
version of glibc is use. However, while Redhat and other major
distributions have issued a fix for (CVE-2015-0235) recently, many
others failed to backport an upgrade, as of yet.


References
==========
[1] CVE Mitre (2015). March 2015 CVE Mitre - CVE-2015-0235 [Online]
Available at: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-0235
[Last Accessed 7 Mar. 2015]

[2] NVD Website (2015). March 2015. National Vulnerability Database
(NVD) | CVE-2015-0235 [Online] Available at:
https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-0235 [Last
Accessed 7 Mar. 2015]


Current thread: