Lucene search
K

freeswitch Heap Overflow Vulnerability

🗓️ 30 Sep 2015 00:00:00Reported by Marcello DuarteType 
zdt
 zdt
🔗 0day.today👁 54 Views

Heap overflow in freeswitch json parser < 1.6.2 & < 1.4.23. User-supplied json string causing heap overflow with user-controlled data in parse_string function

Related
Code
ReporterTitlePublishedViews
Family
CNVD
FreeSWITCH Heap Buffer Overflow Vulnerability
10 Oct 201500:00
cnvd
CVE
CVE-2015-7392
5 Oct 201514:00
cve
Cvelist
CVE-2015-7392
5 Oct 201514:00
cvelist
EUVD
EUVD-2015-7316
7 Oct 202500:30
euvd
Tenable Nessus
FreeSWITCH < 1.4.26 / 1.6.x < 1.6.5 JSON Parser RCE
11 Feb 201600:00
nessus
NVD
CVE-2015-7392
5 Oct 201514:59
nvd
Prion
Heap overflow
5 Oct 201514:59
prion
securityvulns
CVE-2015-7392 Heap overflow in Freeswitch json parser &lt; 1.6.2 &amp; &lt; 1.4.23
12 Oct 201500:00
securityvulns
securityvulns
FreeSWITCH buffer overflow
12 Oct 201500:00
securityvulns
1. Advisory Information

Title: Heap overflow in freeswitch json parser < 1.6.2 & < 1.4.23
Submitter: Marcello Duarte ([email protected])
Product: freeswitch
Product URL: http://freeswitch.org
Affected Versions: freeswitch < 1.6.2 & < 1.4.23
Fixed Versions: 1.6.2 , 1.4.23
Link to source code diff:
https://freeswitch.org/stash/projects/FS/repos/freeswitch/commits/cf892528a1a107ed6eb67fb98ed22533e27778fd
CVE Status: CVE-2015-7392

2. Vulnerability Information

Impact: Code execution
Remotely Exploitable: Yes
Locally Exploitable: No


3. Vulnerability Description

Product Information: FreeSWITCH is a scalable open source
cross-platform telephony platform designed to route and interconnect
popular communication protocols using audio, video, text or any other
form of media.  It was created in 2006 to fill the void left by
proprietary commercial solutions.  FreeSWITCH also provides a stable
telephony platform on which many applications can be developed using a
wide range of free tools.

Vulnerability:

A carefully crafted json string supplied to cJSON_Parse will trigger a
heap overflow with user controlled data.

The underlying vulnerability occurs in the parse_string function.

By passing a json string with \u at the end of the string will cause
the parser to increment past the null at the end of string.

This confuses the code responsible for copying the string. Since it
doesn't detect the NULL in this situation,  it will keep copying until
it hits a null in memory. This leads to a heap overflow with user
controlled data.

Any modules or core code which allows user supplied json to enter the
json parser will be vulnerable.


Vulnerable Source Code:

static const char *parse_string(cJSON *item, const char *str) {

...

/* HACKLOG The length of string is determined here, it will stop
counting when it hits a null */

  while (*ptr != '\"' && *ptr && ++len)
    if (*ptr++ == '\\')
      ptr++; /* Skip escaped quotes. */


/* HACKLOG The buffer is alloced with the length obtained from the
previous section */

 out = (char *)cJSON_malloc(
      len + 1); /* This is how long we need for the string, roughly. */
  if (!out)
    return 0;

/* HACKLOG the following code will copy the string into the alloced
buffer taking into account utf16 to utf8 conversion */

  ptr = str + 1;
  ptr2 = out;
/* 1 */
  while (*ptr != '\"' && *ptr) {
    if (*ptr != '\\')
      *ptr2++ = *ptr++;
    else {
      ptr++;
      switch (*ptr) {
      case 'b':
        *ptr2++ = '\b';
        break;
      case 'f':
        *ptr2++ = '\f';
        break;
      case 'n':
        *ptr2++ = '\n';
        break;
      case 'r':
        *ptr2++ = '\r';
        break;
      case 't':
        *ptr2++ = '\t';
        break;
      case 'u': /* transcode utf16 to utf8. */
        if (sscanf(ptr + 1, "%4x", &uc) < 1)
          break;

    ptr += 4; /* get the unicode char. */

        if ((uc >= 0xDC00 && uc <= 0xDFFF) || uc == 0)
          break; // check for invalid.

        if (uc >= 0xD800 && uc <= 0xDBFF) // UTF16 surrogate pairs.
        {
          if (ptr[1] != '\\' || ptr[2] != 'u')
            break; // missing second-half of surrogate.
          if (sscanf(ptr + 3, "%4x", &uc2) < 1)
            break;
          ptr += 6;
          if (uc2 < 0xDC00 || uc2 > 0xDFFF)
            break; // invalid second-half of surrogate.
          uc = 0x10000 | ((uc & 0x3FF) << 10) | (uc2 & 0x3FF);
        }

        len = 4;
        if (uc < 0x80)
          len = 1;
        else if (uc < 0x800)
          len = 2;
        else if (uc < 0x10000)
          len = 3;
        ptr2 += len;

        switch (len) {
        case 4:
          *--ptr2 = ((uc | 0x80) & 0xBF);
          uc >>= 6;
        case 3:
          *--ptr2 = ((uc | 0x80) & 0xBF);
          uc >>= 6;
        case 2:
          *--ptr2 = ((uc | 0x80) & 0xBF);
          uc >>= 6;
        case 1:
          *--ptr2 = (char)(uc | firstByteMark[len]);
        }
        ptr2 += len;
        break;
      default:
        *ptr2++ = *ptr;
        break;
      }

      /* HACKLOG INCREMENTS past null here, causing the while loop to
not detect the end of the buffer so it keeps copying past the end of
the alloced buffer */
      ptr++;
    }



4. Vendor Information, Solutions

Freeswitch has released versions 1.6.2 , 1.4.23 which fix the issue.

#  0day.today [2018-04-04]  #

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation

30 Sep 2015 00:00Current
6.7Medium risk
Vulners AI Score6.7
EPSS0.04668
54