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

Re: [Xen-devel] [PATCH QEMU for-4.7] main loop: Big hammer to fix logfile disk DoS in Xen setups



On Thu, May 26, 2016 at 04:21:56PM +0100, Wei Liu wrote:
> From: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
> 
> Each time round the main loop, we now fstat stderr.  If it is too big,
> we dup2 /dev/null onto it.  This is not a very pretty patch but it is
> very simple, easy to see that it's correct, and has a low risk of
> collateral damage.
> 
> The limit is 1Mby by default but can be adjusted by setting a new
> environment variable.
> 
> This fixes CVE-2014-3672.
> 
> Signed-off-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
> Tested-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
> 
> Set the default to 0 so that it won't affect non-xen installation. The
> limit will be set by Xen toolstack.
> 
> Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>

Beside the confusing commit message and the call in the WIN32 specific
mainloop, the patch look good. So,

Acked-by: Anthony PERARD <anthony.perard@xxxxxxxxxx>

> ---
>  main-loop.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 48 insertions(+)
> 
> diff --git a/main-loop.c b/main-loop.c
> index 3997043..aa32f5b 100644
> --- a/main-loop.c
> +++ b/main-loop.c
> @@ -164,6 +164,50 @@ int qemu_init_main_loop(Error **errp)
>      return 0;
>  }
>  
> +static void check_cve_2014_3672_xen(void)
> +{
> +    static unsigned long limit = ~0UL;
> +    const int fd = 2;
> +    struct stat stab;
> +
> +    if (limit == ~0UL) {
> +        const char *s = getenv("XEN_QEMU_CONSOLE_LIMIT");
> +        /* XEN_QEMU_CONSOLE_LIMIT=0 means no limit */
> +        limit = s ? strtoul(s,0,0) : 0;
> +    }
> +    if (limit == 0)
> +        return;
> +
> +    int r = fstat(fd, &stab);
> +    if (r) {
> +        perror("fstat stderr (for CVE-2014-3672 check)");
> +        exit(-1);
> +    }
> +    if (!S_ISREG(stab.st_mode))
> +        return;
> +    if (stab.st_size <= limit)
> +        return;
> +
> +    /* oh dear */
> +    fprintf(stderr,"\r\n"
> +            "Closing stderr due to CVE-2014-3672 limit. "
> +            " Set XEN_QEMU_CONSOLE_LIMIT to number of bytes to override,"
> +            " or 0 for no limit.\n");
> +    fflush(stderr);
> +
> +    int nfd = open("/dev/null", O_WRONLY);
> +    if (nfd < 0) {
> +        perror("open /dev/null (for CVE-2014-3672 check)");
> +        exit(-1);
> +    }
> +    r = dup2(nfd, fd);
> +    if (r != fd) {
> +        perror("dup2 /dev/null (for CVE-2014-3672 check)");
> +        exit(-1);
> +    }
> +    close(nfd);
> +}
> +
>  static int max_priority;
>  
>  #ifndef _WIN32
> @@ -216,6 +260,8 @@ static int os_host_main_loop_wait(int64_t timeout)
>      int ret;
>      static int spin_counter;
>  
> +    check_cve_2014_3672_xen();
> +
>      glib_pollfds_fill(&timeout);
>  
>      /* If the I/O thread is very busy or we are incorrectly busy waiting in
> @@ -407,6 +453,8 @@ static int os_host_main_loop_wait(int64_t timeout)
>      fd_set rfds, wfds, xfds;
>      int nfds;
>  
> +    check_cve_2014_3672_xen();
> +

That's the call within an #ifdef _WIN32.

>      /* XXX: need to suppress polling by better using win32 events */
>      ret = 0;
>      for (pe = first_polling_entry; pe != NULL; pe = pe->next) {

-- 
Anthony PERARD

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.