Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1739948

Re: [kernel-hardening] [RFC v2 2/2] Protected O_CREAT open in sticky directory

From Jann Horn <jannh@google.com>
Newsgroups linux.kernel
Subject Re: [kernel-hardening] [RFC v2 2/2] Protected O_CREAT open in sticky directory
Date 2017-09-26 16:50 +0200
Message-ID <utZln-62J-9@gated-at.bofh.it> (permalink)
References <utYSl-5Rt-11@gated-at.bofh.it> <utYSm-5Rt-25@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


On Tue, Sep 26, 2017 at 4:14 PM, Salvatore Mesoraca
<s.mesoraca16@gmail.com> wrote:
> Disallows O_CREAT open missing the O_EXCL flag, in world or
> group writable directories, even if the file doesn't exist yet.
> With few exceptions (e.g. shared lock files based on flock())
> if a program tries to open a file with the O_CREAT flag and
> without the O_EXCL, it probably has a bug.
> This feature allows to detect and potentially block programs that
> act this way and can be used to find vulnerabilities (like those
> prevented by patch #1) and to do policy enforcement.
[...]
> +static int may_create_no_excl(struct dentry * const dir,
> +                             const unsigned char * const name,
> +                             struct inode * const inode)
> +{
> +       umode_t mode = dir->d_inode->i_mode;
> +
> +       if (likely(!(mode & S_ISVTX)))
> +               return 0;
> +       if (inode && (uid_eq(inode->i_uid, dir->d_inode->i_uid) ||
> +                     uid_eq(current_fsuid(), inode->i_uid)))
> +               return 0;

Why is there an exception for inode->i_uid==dir->d_inode->i_uid? Is this
kind of behavior more likely to be correct when the directory owner is
doing it?


> +       if ((sysctl_protected_sticky_child_create && likely(mode & 0002)) ||
> +           (sysctl_protected_sticky_child_create >= 2 && mode & 0020)) {
> +               pr_notice_ratelimited("unsafe O_CREAT open (missing O_EXCL) of '%s' in a sticky directory by UID %d, EUID %d, process %s:%d.\n",
> +                                     name,
> +                                     from_kuid(&init_user_ns, current_uid()),
> +                                     from_kuid(&init_user_ns, current_euid()),
> +                                     current->comm, current->pid);

As far as I can tell, uid_t is unsigned, so the first two "%d"
format string elements are technically wrong:
  extern uid_t from_kuid(struct user_namespace *to, kuid_t uid);
  typedef __kernel_uid32_t uid_t;
  typedef unsigned int __kernel_uid32_t;

> +               if (sysctl_protected_sticky_child_create >= 4 ||
> +                   (sysctl_protected_sticky_child_create == 3 &&
> +                    likely(mode & 0002)))
> +                       return -EACCES;
> +       }
> +       return 0;
> +}

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[RFC v2 0/2] Restrict dangerous open in sticky directories Salvatore Mesoraca <s.mesoraca16@gmail.com> - 2017-09-26 16:20 +0200
  [RFC v2 2/2] Protected O_CREAT open in sticky directory Salvatore Mesoraca <s.mesoraca16@gmail.com> - 2017-09-26 16:20 +0200
    Re: [kernel-hardening] [RFC v2 2/2] Protected O_CREAT open in sticky directory Jann Horn <jannh@google.com> - 2017-09-26 16:50 +0200
      Re: [kernel-hardening] [RFC v2 2/2] Protected O_CREAT open in sticky directory Salvatore Mesoraca <s.mesoraca16@gmail.com> - 2017-09-26 17:20 +0200

csiph-web