svn commit: r272505 - in head/sys: kern sys
Bjoern A. Zeeb
bz at FreeBSD.org
Sat Oct 4 14:22:33 UTC 2014
On 04 Oct 2014, at 08:08 , Mateusz Guzik <mjg at FreeBSD.org> wrote:
> Author: mjg
> Date: Sat Oct 4 08:08:56 2014
> New Revision: 272505
> URL: https://svnweb.freebsd.org/changeset/base/272505
>
> Log:
> Plug capability races.
>
> fp and appropriate capability lookups were not atomic, which could result in
> improper capabilities being checked.
>
> This could result either in protection bypass or in a spurious ENOTCAPABLE.
>
> Make fp + capability check atomic with the help of sequence counters.
>
> Reviewed by: kib
> MFC after: 3 weeks
>
> Modified:
> head/sys/kern/kern_descrip.c
> head/sys/sys/filedesc.h
> …
This file is included from user space. There is no opt_capsicum.h there.
Including an opt_* in the header file seems wrong in a lot of ways usually.
I tried to add a bandaid for the moment with r272523 which (to be honest) makes it worse.
This needs a better fix.
I also wonder why the (conditional) fde_seq ended up at the beginning of the structure rather than the end?
> Modified: head/sys/sys/filedesc.h
> ==============================================================================
> --- head/sys/sys/filedesc.h Sat Oct 4 08:05:39 2014 (r272504)
> +++ head/sys/sys/filedesc.h Sat Oct 4 08:08:56 2014 (r272505)
> @@ -33,11 +33,14 @@
> #ifndef _SYS_FILEDESC_H_
> #define _SYS_FILEDESC_H_
>
> +#include "opt_capsicum.h"
> +
> #include <sys/caprights.h>
> #include <sys/queue.h>
> #include <sys/event.h>
> #include <sys/lock.h>
> #include <sys/priority.h>
> +#include <sys/seq.h>
> #include <sys/sx.h>
>
> #include <machine/_limits.h>
> @@ -50,6 +53,9 @@ struct filecaps {
> };
>
> struct filedescent {
> +#ifdef CAPABILITIES
> + seq_t fde_seq; /* if you need fde_file and fde_caps in sync */
> +#endif
> struct file *fde_file; /* file structure for open file */
> struct filecaps fde_caps; /* per-descriptor rights */
> uint8_t fde_flags; /* per-process open file flags */
> @@ -58,6 +64,13 @@ struct filedescent {
> #define fde_fcntls fde_caps.fc_fcntls
> #define fde_ioctls fde_caps.fc_ioctls
> #define fde_nioctls fde_caps.fc_nioctls
> +#ifdef CAPABILITIES
> +#define fde_change(fde) ((char *)(fde) + sizeof(seq_t))
> +#define fde_change_size (sizeof(struct filedescent) - sizeof(seq_t))
> +#else
> +#define fde_change(fde) ((fde))
> +#define fde_change_size (sizeof(struct filedescent))
> +#endif
>
> /*
> * This structure is used for the management of descriptors. It may be
> @@ -82,6 +95,9 @@ struct filedesc {
> int fd_holdleaderscount; /* block fdfree() for shared close() */
> int fd_holdleaderswakeup; /* fdfree() needs wakeup */
> };
> +#ifdef CAPABILITIES
> +#define fd_seq(fdp, fd) (&(fdp)->fd_ofiles[(fd)].fde_seq)
> +#endif
>
> /*
> * Structure to keep track of (process leader, struct fildedesc) tuples.
>
—
Bjoern A. Zeeb "Come on. Learn, goddamn it.", WarGames, 1983
More information about the svn-src-all
mailing list