All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yann E. MORIN <yann.morin.1998@free.fr>
To: buildroot@busybox.net
Subject: [Buildroot] [PATCH 1/2] package/pure-ftpd: fix CVE-2019-20176
Date: Sun, 1 Mar 2020 14:21:36 +0100	[thread overview]
Message-ID: <20200301132136.GJ8743@scaer> (raw)
In-Reply-To: <20200229203416.3462566-1-fontaine.fabrice@gmail.com>

Fabrice, All,

On 2020-02-29 21:34 +0100, Fabrice Fontaine spake thusly:
> In Pure-FTPd 1.0.49, a stack exhaustion issue was discovered in the
> listdir function in ls.c.
> 
> Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>

Series applied to master, thanks.

Regards,
Yann E. MORIN.

> ---
>  ...-to-store-every-file-name-to-display.patch | 70 +++++++++++++++++++
>  package/pure-ftpd/pure-ftpd.mk                |  3 +
>  2 files changed, 73 insertions(+)
>  create mode 100644 package/pure-ftpd/0001-listdir-reuse-a-single-buffer-to-store-every-file-name-to-display.patch
> 
> diff --git a/package/pure-ftpd/0001-listdir-reuse-a-single-buffer-to-store-every-file-name-to-display.patch b/package/pure-ftpd/0001-listdir-reuse-a-single-buffer-to-store-every-file-name-to-display.patch
> new file mode 100644
> index 0000000000..2f791d1d6e
> --- /dev/null
> +++ b/package/pure-ftpd/0001-listdir-reuse-a-single-buffer-to-store-every-file-name-to-display.patch
> @@ -0,0 +1,70 @@
> +From aea56f4bcb9948d456f3fae4d044fd3fa2e19706 Mon Sep 17 00:00:00 2001
> +From: Frank Denis <github@pureftpd.org>
> +Date: Mon, 30 Dec 2019 17:40:04 +0100
> +Subject: [PATCH] listdir(): reuse a single buffer to store every file name to
> + display
> +
> +Allocating a new buffer for each entry is useless.
> +
> +And as these buffers are allocated on the stack, on systems with a
> +small stack size, with many entries, the limit can easily be reached,
> +causing a stack exhaustion and aborting the user session.
> +
> +Reported by Antonio Morales from the GitHub Security Lab team, thanks!
> +[Retrieved from:
> +https://github.com/jedisct1/pure-ftpd/commit/aea56f4bcb9948d456f3fae4d044fd3fa2e19706]
> +Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
> +---
> + src/ls.c | 15 ++++++++-------
> + 1 file changed, 8 insertions(+), 7 deletions(-)
> +
> +diff --git a/src/ls.c b/src/ls.c
> +index cf804c7..f8a588f 100644
> +--- a/src/ls.c
> ++++ b/src/ls.c
> +@@ -661,6 +661,8 @@ static void listdir(unsigned int depth, int f, void * const tls_fd,
> +     char *names;
> +     PureFileInfo *s;
> +     PureFileInfo *r;
> ++    char *alloca_subdir;
> ++    size_t sizeof_subdir;
> +     int d;
> + 
> +     if (depth >= max_ls_depth || matches >= max_ls_files) {
> +@@ -690,14 +692,12 @@ static void listdir(unsigned int depth, int f, void * const tls_fd,
> +     }
> +     outputfiles(f, tls_fd);
> +     r = dir;
> ++    sizeof_subdir = PATH_MAX + 1U;
> ++    if ((alloca_subdir = ALLOCA(sizeof_subdir)) == NULL) {
> ++        goto toomany;
> ++    }
> +     while (opt_R && r != s) {
> +         if (r->name_offset != (size_t) -1 && !chdir(FI_NAME(r))) {
> +-            char *alloca_subdir;
> +-            const size_t sizeof_subdir = PATH_MAX + 1U;
> +-
> +-            if ((alloca_subdir = ALLOCA(sizeof_subdir)) == NULL) {
> +-                goto toomany;
> +-            }
> +             if (SNCHECK(snprintf(alloca_subdir, sizeof_subdir, "%s/%s",
> +                                  name, FI_NAME(r)), sizeof_subdir)) {
> +                 goto nolist;
> +@@ -706,8 +706,8 @@ static void listdir(unsigned int depth, int f, void * const tls_fd,
> +             wrstr(f, tls_fd, alloca_subdir);
> +             wrstr(f, tls_fd, ":\r\n\r\n");
> +             listdir(depth + 1U, f, tls_fd, alloca_subdir);
> ++
> +             nolist:
> +-            ALLOCA_FREE(alloca_subdir);
> +             if (matches >= max_ls_files) {
> +                 goto toomany;
> +             }
> +@@ -720,6 +720,7 @@ static void listdir(unsigned int depth, int f, void * const tls_fd,
> +         r++;
> +     }
> +     toomany:
> ++    ALLOCA_FREE(alloca_subdir);
> +     free(names);
> +     free(dir);
> +     names = NULL;
> diff --git a/package/pure-ftpd/pure-ftpd.mk b/package/pure-ftpd/pure-ftpd.mk
> index 2d69efe3f9..3af66a066c 100644
> --- a/package/pure-ftpd/pure-ftpd.mk
> +++ b/package/pure-ftpd/pure-ftpd.mk
> @@ -11,6 +11,9 @@ PURE_FTPD_LICENSE = ISC
>  PURE_FTPD_LICENSE_FILES = COPYING
>  PURE_FTPD_DEPENDENCIES = $(if $(BR2_PACKAGE_LIBICONV),libiconv)
>  
> +# 0001-listdir-reuse-a-single-buffer-to-store-every-file-name-to-display.patch
> +PURE_FTPD_IGNORE_CVES += CVE-2019-20176
> +
>  PURE_FTPD_CONF_OPTS = \
>  	--with-altlog \
>  	--with-puredb
> -- 
> 2.25.0
> 
> _______________________________________________
> buildroot mailing list
> buildroot at busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot

-- 
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 561 099 427 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'

  parent reply	other threads:[~2020-03-01 13:21 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-29 20:34 [Buildroot] [PATCH 1/2] package/pure-ftpd: fix CVE-2019-20176 Fabrice Fontaine
2020-02-29 20:34 ` [Buildroot] [PATCH 2/2] package/pure-ftpd: fix CVE-2020-9365 Fabrice Fontaine
2020-03-14 18:33   ` Peter Korsgaard
2020-03-01 13:21 ` Yann E. MORIN [this message]
2020-03-14 18:33 ` [Buildroot] [PATCH 1/2] package/pure-ftpd: fix CVE-2019-20176 Peter Korsgaard

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200301132136.GJ8743@scaer \
    --to=yann.morin.1998@free.fr \
    --cc=buildroot@busybox.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.