[PATCH 1/2] libX11: check size of GetReqExtra after XFlush
Alan Coopersmith
alan.coopersmith at oracle.com
Mon Jul 22 23:55:23 PDT 2013
Sorry, was distracted long enough that all memory of these patches had been
flushed from my cache, so I had to dig into them again to reunderstand them.
I think they look good enough now, so I've added
Reviewed-by: Alan Coopersmith <alan.coopersmith at oracle.com>
and pushed both to git master:
To ssh://git.freedesktop.org/git/xorg/lib/libX11
24d3ee0..feb131b master -> master
-alan-
On 07/18/13 03:52 PM, Kees Cook wrote:
> Re-re-ping. :) Can anyone commit these two patches please?
>
> Thanks!
>
> -Kees
>
> On Sun, Jun 09, 2013 at 11:13:42AM -0700, Kees Cook wrote:
>> Two users of GetReqExtra pass arbitrarily sized allocations from the
>> caller (ModMap and Host). Adjust _XGetRequest() (called by the GetReqExtra
>> macro) to double-check the requested length and invalidate "req" when
>> this happens. Users of GetReqExtra passing lengths greater than the Xlib
>> buffer size (normally 16K) must check "req" and fail gracefully instead
>> of crashing.
>>
>> Any callers of GetReqExtra that do not check "req" for NULL
>> will experience this change, in the pathological case, as a NULL
>> dereference instead of a buffer overflow. This is an improvement, but
>> the documentation for GetReqExtra has been updated to reflect the need
>> to check the value of "req" after the call.
>>
>> Bug that manifested the problem:
>> https://bugs.launchpad.net/ubuntu/+source/x11-xserver-utils/+bug/792628
>>
>> Signed-off-by: Kees Cook <kees at outflux.net>
>> ---
>> specs/libX11/AppC.xml | 4 +++-
>> src/XlibInt.c | 8 ++++++++
>> 2 files changed, 11 insertions(+), 1 deletion(-)
>>
>> diff --git a/specs/libX11/AppC.xml b/specs/libX11/AppC.xml
>> index df25027..0b37048 100644
>> --- a/specs/libX11/AppC.xml
>> +++ b/specs/libX11/AppC.xml
>> @@ -2468,7 +2468,9 @@ which is the same as
>> <function>GetReq</function>
>> except that it takes an additional argument (the number of
>> extra bytes to allocate in the output buffer after the request structure).
>> -This number should always be a multiple of four.
>> +This number should always be a multiple of four. Note that it is possible
>> +for req to be set to NULL as a defensive measure if the requested length
>> +exceeds the Xlib's buffer size (normally 16K).
>> </para>
>> </sect2>
>> <sect2 id="Variable_Length_Arguments">
>> diff --git a/src/XlibInt.c b/src/XlibInt.c
>> index b06e57b..c3273a8 100644
>> --- a/src/XlibInt.c
>> +++ b/src/XlibInt.c
>> @@ -1733,6 +1733,14 @@ void *_XGetRequest(Display *dpy, CARD8 type, size_t len)
>>
>> if (dpy->bufptr + len > dpy->bufmax)
>> _XFlush(dpy);
>> + /* Request still too large, so do not allow it to overflow. */
>> + if (dpy->bufptr + len > dpy->bufmax) {
>> + fprintf(stderr,
>> + "Xlib: request %d length %zd would exceed buffer size.\n",
>> + type, len);
>> + /* Changes failure condition from overflow to NULL dereference. */
>> + return NULL;
>> + }
>>
>> if (len % 4)
>> fprintf(stderr,
>> --
>> 1.8.1.2
>
--
-Alan Coopersmith- alan.coopersmith at oracle.com
Oracle Solaris Engineering - http://blogs.oracle.com/alanc
More information about the xorg-devel
mailing list