Control: retitle -1 matplotlib: CVE-2013-1424: printf buffer overrun

Hi,

On Sun, Jan 18, 2015 at 01:44:36PM -0500, Michael Gilbert wrote:
> package: src:matplotlib
> version: 0.99.3-1
> severity: serious
> tag: security, patch
> 
> Matt Giuca reported a matplotlib buffer overrun to the private
> security team request tracker in 2013, which ended up falling through
> the cracks at the time.  See below for the original message and a
> proposed patch attached.
> 
> On Wed, Jan 23, 2013 at 11:21:14PM +0000, Matt Giuca via RT wrote:
> > The bug is in 
> > src/mplutils.cpp<https://github.com/matplotlib/matplotlib/blob/master/src/mplutils.cpp>.
> > The Printf::Printf constructor accepts an arbitrary format string and
> > values, and dumps it into a 1024-byte buffer with vsprintf. This is
> > obviously not safe, as the user can simply supply enough bytes to overflow
> > the 1024-byte buffer.
> >
> > The bug can be exploited from Python code, through a number of
> > Python-exposed functions that call Printf. The most obvious entry-point I
> > can find is ft2font.FT2Font constructor:
> >
> > >>> from matplotlib import ft2font
> > >>> ft2font.FT2Font('x' * 2048)
> > *** glibc detected *** python: free(): invalid next size (normal):
> > 0x00000000029f1480 ***
> >
> > There are several other Python functions that call Printf with
> > user-supplied data, but this is the cleanest one.
> >
> > As for what this can be used for: I'm not an expert in exploiting
> > vulnerabilities, but it allows any user who can supply either Python code
> > to be executed, or certain specific strings such as the name of a font, to
> > write an arbitrary number of bytes to a location on the heap, and I know
> > that that can potentially be used to compromise a machine.

> diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py
> index c7e3141..37feb20 100644
> --- a/lib/matplotlib/__init__.py
> +++ b/lib/matplotlib/__init__.py
> @@ -1114,6 +1114,7 @@ default_test_modules = [
>      'matplotlib.tests.test_lines',
>      'matplotlib.tests.test_mathtext',
>      'matplotlib.tests.test_mlab',
> +    'matplotlib.tests.test_mplutils',
>      'matplotlib.tests.test_patches',
>      'matplotlib.tests.test_pickle',
>      'matplotlib.tests.test_rcparams',
> diff --git a/lib/matplotlib/tests/test_mplutils.py 
> b/lib/matplotlib/tests/test_mplutils.py
> new file mode 100644
> index 0000000..e37e41c
> --- /dev/null
> +++ b/lib/matplotlib/tests/test_mplutils.py
> @@ -0,0 +1,12 @@
> +from __future__ import print_function
> +from nose.tools import assert_raises
> +from matplotlib import ft2font
> +from matplotlib.testing.decorators import knownfailureif
> +import sys
> +
> +def test_printf_buffer():
> +    """Tests Printf for buffer overrun."""
> +    # Use ft2font.FT2Font, which indirectly calls the Printf function in
> +    # mplutils.cpp.
> +    # Expect a RuntimeError, since the font is not found.
> +    assert_raises(RuntimeError, ft2font.FT2Font, 'x' * 2048)
> diff --git a/src/mplutils.cpp b/src/mplutils.cpp
> index febb97a..af3a2f3 100644
> --- a/src/mplutils.cpp
> +++ b/src/mplutils.cpp
> @@ -18,7 +18,10 @@ Printf::Printf(const char *fmt, ...)
>  {
>      va_list ap;
>      va_start(ap, fmt);
> -    vsprintf(buffer, fmt, ap);
> +    vsnprintf(buffer, 1024, fmt, ap);
> +    // Null-terminate the string. Non-standard C implementations (e.g.,
> +    // Microsoft Visual C++) do not do this automatically.
> +    buffer[1023] = '\0';
>      va_end(ap);  // look ma - I rememberd it this time
>  }

This was assigned CVE-2013-1424 back then from the Debian CVE pool.

Regards,
Salvatore


-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to