[X2Go-Dev] [X2Go-Commits] [nx-libs] 23/52: CVE-2014-0210: unvalidated length fields in fs_read_query_info() from xorg/lib/libXfont commit 491291cabf78efdeec8f18b09e14726a9030cc8f

Michael DePaulo mikedep333 at gmail.com
Sun Feb 15 21:13:42 CET 2015


On Sun, Feb 15, 2015 at 3:08 PM, Mihai Moldovan <ionic at ionic.de> wrote:
> On 14.02.2015 05:47 PM, git-admin at x2go.org wrote:
>> This is an automated email from the git hooks/post-receive script.
>>
>> x2go pushed a commit to branch 3.6.x
>> in repository nx-libs.
>>
>> commit c6aebf9284855a0e24ad9c5ffdd36aa65e16bec7
>> Author: Mike DePaulo <mikedep333 at gmail.com>
>> Date:   Sun Feb 8 22:08:09 2015 -0500
>>
>>     CVE-2014-0210: unvalidated length fields in fs_read_query_info() from xorg/lib/libXfont commit 491291cabf78efdeec8f18b09e14726a9030cc8f
>>
>>     fs_read_query_info() parses a reply from the font server.  The reply
>>     contains embedded length fields, none of which are validated.  This
>>     can cause out of bound reads in either fs_read_query_info() or in
>>     _fs_convert_props() which it calls to parse the fsPropInfo in the reply.
>> ---
>>  nx-X11/lib/font/fc/fsconvert.c |   19 ++++++++++++++-----
>>  nx-X11/lib/font/fc/fserve.c    |   40 ++++++++++++++++++++++++++++++++++++++--
>>  2 files changed, 52 insertions(+), 7 deletions(-)
>>
>> [...]
>> diff --git a/nx-X11/lib/font/fc/fserve.c b/nx-X11/lib/font/fc/fserve.c
>> index 7762653..2a6f6c9 100644
>> --- a/nx-X11/lib/font/fc/fserve.c
>> +++ b/nx-X11/lib/font/fc/fserve.c
>> @@ -865,6 +865,7 @@ fs_read_query_info(FontPathElementPtr fpe, FSBlockDataPtr blockrec)
>>      FSFpePtr         conn = (FSFpePtr) fpe->private;
>>      fsQueryXInfoReply        *rep;
>>      char             *buf;
>> +    long             bufleft; /* length of reply left to use */
>
> Please initialize variables. Even if they are re-set later on.
>
> long            bufleft = 0;
>
>
>>      fsPropInfo               *pi;
>>      fsPropOffset     *po;
>>      pointer          pd;
>> @@ -895,7 +896,10 @@ fs_read_query_info(FontPathElementPtr fpe, FSBlockDataPtr blockrec)
>>
>>      buf = (char *) rep;
>>      buf += SIZEOF(fsQueryXInfoReply);
>> -
>> +
>> +    bufleft = rep->length << 2;
>> +    bufleft -= SIZEOF(fsQueryXInfoReply);
>> +
>>      /* move the data over */
>>      fsUnpack_XFontInfoHeader(rep, pInfo);
>>
>> @@ -903,19 +907,51 @@ fs_read_query_info(FontPathElementPtr fpe, FSBlockDataPtr blockrec)
>>      _fs_init_fontinfo(conn, pInfo);
>>
>>      /* Compute offsets into the reply */
>> +    if (bufleft < SIZEOF(fsPropInfo))
>> +    {
>> +     ret = -1;
>> +#ifdef DEBUG
>> +     fprintf(stderr, "fsQueryXInfo: bufleft (%ld) < SIZEOF(fsPropInfo)\n",
>> +             bufleft);
>> +#endif
>> +     goto bail;
>> +    }
>>      pi = (fsPropInfo *) buf;
>>      buf += SIZEOF (fsPropInfo);
>> +    bufleft -= pi->num_offsets * SIZEOF(fsPropOffset);
>
> This looks wrong. You probably meant to use:
>
> bufleft -= SIZEOF (fsPropInfo);
>
>
>
>> +    if (bufleft < pi->data_len)
>
> This looks wrong, too. Check:
>
> https://git.centos.org/blob/rpms!libXfont.git/cf1e18c13a5ba2054e36a6f0b044c3ed10c1b358/SOURCES!0006-CVE-2014-0210-unvalidated-length-fields-in-fs_read_q.patch;jsessionid=12hi4vv3qj9yo2ercznrbzevc
>
> You probably meant to use:
>
> if ((bufleft / SIZEOF(fsPropOffset)) < pi->num_offsets)
>
> or
>
> if (bufleft < (SIZEOF(fsPropOffset) * pi->num_offsets))
>
> and
>
>> +    {
>> +     ret = -1;
>> +#ifdef DEBUG
>> +     fprintf(stderr,
>> +             "fsQueryXInfo: bufleft (%ld) < data_len (%d)\n",
>> +             bufleft, pi->data_len);
>
> here either:
>
> "fsQueryXInfo: (bufleft / SIZEOF(fsPropOffset)) (%ld) < pi->num_offsets (%d)\n",
> bufleft / SIZEOF(fsPropOffset), pi->num_offsets);
>
> or
>
> "fsQueryXInfo: bufleft (%ld) < (SIZEOF(fsPropOffset) * pi->num_offsets) (%d)\n",
> bufleft, SIZEOF(fsPropOffset) * pi->num_offsets);
>
>
> depending on what you used before.
>
>
>> +#endif
>> +     goto bail;
>> +    }
>>      po = (fsPropOffset *) buf;
>>      buf += pi->num_offsets * SIZEOF(fsPropOffset);
>> +    bufleft -= pi->data_len;
>
> Same problem here. Should be:
>
> bufleft -= pi->num_offsets * SIZEOF(fsPropOffset);
>
>
>
>> +    {
>
> This block will ALWAYS be executed and ALWAYS *FAIL*!
>
> You're missing (*before* the curly brace):
>
> if (bufleft < pi->data_len)
>
>
>
>> +     ret = -1;
>> +#ifdef DEBUG
>> +     fprintf(stderr,
>> +             "fsQueryXInfo: bufleft (%ld) < data_len (%d)\n",
>> +             bufleft, pi->data_len);
>> +#endif
>> +     goto bail;
>> +    }
>>      pd = (pointer) buf;
>>      buf += pi->data_len;
>> +    bufleft -= pi->data_len;
>>
>>      /* convert the properties and step over the reply */
>>      ret = _fs_convert_props(pi, po, pd, pInfo);
>> +  bail:
>>      _fs_done_read (conn, rep->length << 2);
>> -
>> +
>>      if (ret == -1)
>>      {
>>       fs_cleanup_bfont (bfont);
>
> This looks OK again.

Would you mind making a follow-up commit?


More information about the x2go-dev mailing list