Re: [PATCH] text-utils/ul: Fix buffer overflow

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Sep 8, 2016 at 2:19 PM, Tobias Stoeckmann <tobias@xxxxxxxxxxxxxx> wrote:
> The text-utility ul can run into a buffer overflow on very long lines.
> See this proof of concept how to reproduce the issue:
>
> $ dd if=/dev/zero bs=1M count=10 | tr '\000' '\041' > poc.txt
> $ echo -ne '\xe\x5f\x8\x5f\x61\x2\xf\x5f\x8\x5f' | dd of=poc.txt conv=notrunc
> $ ul -i poc.txt > /dev/null # output would take ages
> Segmentation fault
> $ _
>
> The problem manifests by using alloca with "maxcol", which can be as
> large as INT_MAX, based on the input line.
>
> A very long line (> 8 MB) with modes must be supplied to ul, as seen in
> my proof of concept byte sequence above.
>
> It is rather easy to fix this issue: allocate space on the heap instead.
> maxcol could overflow here, but in that case no system will have enough
> space to handle the request, properly ending ul through an err() call.
>
>
> Signed-off-by: Tobias Stoeckmann <tobias@xxxxxxxxxxxxxx>
> ---
>  text-utils/ul.c | 14 ++++----------
>  1 file changed, 4 insertions(+), 10 deletions(-)

Just a nit .. may as well change 'i' from an int to a long here as well.
That should cover the theoretical overflow for 64 bit machines.

> diff --git a/text-utils/ul.c b/text-utils/ul.c
> index 6721974..3fd0b6a 100644
> --- a/text-utils/ul.c
> +++ b/text-utils/ul.c
> @@ -402,11 +402,7 @@ static void flushln(void)
>  static void overstrike(void)
>  {
>         register int i;
> -#ifdef __GNUC__
> -       register wchar_t *lbuf = __builtin_alloca((maxcol + 1) * sizeof(wchar_t));
> -#else
> -       wchar_t lbuf[BUFSIZ];
> -#endif
> +       register wchar_t *lbuf = xmalloc((maxcol + 1) * sizeof(wchar_t));
>         register wchar_t *cp = lbuf;
>         int hadbold=0;
>
> @@ -439,16 +435,13 @@ static void overstrike(void)
>                 for (cp = lbuf; *cp; cp++)
>                         putwchar(*cp == '_' ? ' ' : *cp);
>         }
> +       free(lbuf);
>  }
>
>  static void iattr(void)
>  {
>         register int i;
> -#ifdef __GNUC__
> -       register wchar_t *lbuf = __builtin_alloca((maxcol+1)*sizeof(wchar_t));
> -#else
> -       wchar_t lbuf[BUFSIZ];
> -#endif
> +       register wchar_t *lbuf = xmalloc((maxcol + 1) * sizeof(wchar_t));
>         register wchar_t *cp = lbuf;
>
>         for (i = 0; i < maxcol; i++)
> @@ -465,6 +458,7 @@ static void iattr(void)
>                 *cp = 0;
>         fputws(lbuf, stdout);
>         putwchar('\n');
> +       free(lbuf);
>  }
>
>  static void initbuf(void)
> --
> 2.10.0
>
> --
> To unsubscribe from this list: send the line "unsubscribe util-linux" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  https://urldefense.proofpoint.com/v2/url?u=http-3A__vger.kernel.org_majordomo-2Dinfo.html&d=DQIBAg&c=IGDlg0lD0b-nebmJJ0Kp8A&r=Wg5NqlNlVTT7Ugl8V50qIHLe856QW0qfG3WVYGOrWzA&m=bbRXLX-CYSIowTPqY28dCLlGaWC6MpdmP2mvIBLoArU&s=Tc2CgUqDnP1yFVDSU30eZqiQqUOBot-jL8ovTKiAHyk&e=



-- 
Shaun Tancheff
--
To unsubscribe from this list: send the line "unsubscribe util-linux" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux