Received: by 2002:a25:868d:0:0:0:0:0 with SMTP id z13csp508438ybk; Wed, 13 May 2020 06:02:14 -0700 (PDT) X-Google-Smtp-Source: APiQypL0NdiRLJ0IZha6sOZ2w5X3a///CbBeVBUSbYQE4Hd9/slNOx5AJ/+dJxlnOa1Xl7C1wpuO X-Received: by 2002:a05:6402:1768:: with SMTP id da8mr22361494edb.216.1589374934015; Wed, 13 May 2020 06:02:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1589374934; cv=none; d=google.com; s=arc-20160816; b=UVzin+zR2p4vSMPvt9QltB/2AVE6HnaVoG65bvU++A9iRjm3/Y8HFfEY/sCSz/urW7 LV7IPAfzTYJvj4WFlAKn1vg4IQFYR6kw2tbRm3zKKPpyOyiR4z+V/E7ClfipF/3ftppm nEr1igmvG3rk0Hm4Wp5U+iBoiXXYjo+zD1hOXoceKHnBS+iDvIAyuRSTDlRz1n5WgC44 sLmHztBvTAfnwYjrRmnwV5N+ch6662waF8J6ePtnC/7WlOPusuRUNpiZ/BHIV2DT2m64 wxfH/CIi3iLwCUWamWE5KEksVj6QKZMI4vSdA2F13PLopyZ2WZ840SvNxOg5TgH4jc77 qHGg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=VpypxEyENRJvROK6xHUL5Ckp8cqPiu+d4URbR3v3TwI=; b=LfX6KvV260qKITiDNZSgqRTg+yinV8aiOHnVFEbAmxW8amh7ap5/mWoNvREVM5NdZB p6n0iaSfkPy/jJEwBLpqMHKYz3JPhCgH4wNZ6Qh/VnLHxmI77S4+cJqUD62wlnbX7kDu 1BDC6DYqWM+URzca7q80aAKauTaBN6x1JSqo1a3Yn2vJ/H8Pok2cRjpuzMc8xj9MDH1F M8FAnwr2F4dVuUQ7BvkBf9qoCTsK+ngKEYdvcjNDBAyZK/AAwRiLYERvWDV5lEjRDUJ1 XcXSPmBRQd8qqkgGgocNr0man+UES3nMyZ3lp2n12EWnKhD0f84worNOsRyZOr+5QHYs qC9g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=KD2wVadA; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id r24si9415825edm.269.2020.05.13.06.01.44; Wed, 13 May 2020 06:02:14 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=KD2wVadA; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732991AbgEMM6q (ORCPT + 99 others); Wed, 13 May 2020 08:58:46 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50542 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729345AbgEMM6p (ORCPT ); Wed, 13 May 2020 08:58:45 -0400 Received: from mail-oo1-xc44.google.com (mail-oo1-xc44.google.com [IPv6:2607:f8b0:4864:20::c44]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EA78DC061A0C; Wed, 13 May 2020 05:58:44 -0700 (PDT) Received: by mail-oo1-xc44.google.com with SMTP id p123so2264058oop.12; Wed, 13 May 2020 05:58:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=VpypxEyENRJvROK6xHUL5Ckp8cqPiu+d4URbR3v3TwI=; b=KD2wVadAGyIh11NpAP/DdtGIgop1WPoYhQk+DFExxk4bhPbEpAH1Qo7KIQHvFSw30R yFuPjY6oQTyfKGwpb+FgLCU9y/yJIhHIqe5a7PFAmDZAecHf/mit4+04qV0oNssK3i/j K2fLGCHafAXNCPyZUtYQjFWbK/6j5NzSQPtp6TqwHTQkUEg2ng6yh7lIyFvBArktiKwQ e0FLR3sD9HMws7w7vG+nySxH2y6KY/zGrOdVK+q5p/hRmH/ZorCkSsJGNh2oK7jaRM8e q1yrE1WztV87Ndk9Y+DF3ayPOjQ0XlDIGzCpASYeiiM9Mnsi4unJBS9n/nLQNAp66yn3 ZMkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=VpypxEyENRJvROK6xHUL5Ckp8cqPiu+d4URbR3v3TwI=; b=NYFmnIAWbITh9hYXpESi4af25X9RIqNEhk/7zzckFT1FJCIG+mzKmf24v8cDtEuO6R TSZG90Z7l7SENRUmrqm6pkR+ZWs3/E5Wn4mGnIlRv2jXpv+M7VKz8Cyc5JYiZ/o/Cx9u VqNlNIJXtrPN2cLZD7bGRvaj6PkcyIxO2uNec8dpaXWCpC7amYzv4Pn2I0pv16TdW9D0 eVmQV6+0nW8qEbzyJBX7JW3r6oNfjx1ldfW9Ikadk9pjQwLkTSd5wjN4NpPWvTfQkJ29 1SUNI9XB5mf+o7RlOpwfuL+k3lYKTyC+uAMjcfhzyicptBlIkgM8xqGLRtSJ5oCwS0k+ 0NsQ== X-Gm-Message-State: AOAM533hVA2T77Rj26QKWVfQnlRryoC2h/rvaBo7PIWBm6B+OA4JqZGa hLYqMjyWcR83yTEcGLNGbFqkrQedYOnZ7WvM9VQ= X-Received: by 2002:a4a:a2c4:: with SMTP id r4mr1160804ool.71.1589374724283; Wed, 13 May 2020 05:58:44 -0700 (PDT) MIME-Version: 1.0 References: <158932282880.2885325.2688622278854566047.stgit@warthog.procyon.org.uk> In-Reply-To: <158932282880.2885325.2688622278854566047.stgit@warthog.procyon.org.uk> From: Stephen Smalley Date: Wed, 13 May 2020 08:58:33 -0400 Message-ID: Subject: Re: [PATCH] keys: Make the KEY_NEED_* perms an enum rather than a mask To: David Howells Cc: Jarkko Sakkinen , Paul Moore , Casey Schaufler , keyrings@vger.kernel.org, SElinux list , LSM List , linux-kernel Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, May 12, 2020 at 6:33 PM David Howells wrote: > > Since the meaning of combining the KEY_NEED_* constants is undefined, make > it so that you can't do that by turning them into an enum. > > The enum is also given some extra values to represent special > circumstances, such as: > > (1) The '0' value is reserved and causes a warning to trap the parameter > being unset. > > (2) The key is to be unlinked and we require no permissions on it, only > the keyring, (this replaces the KEY_LOOKUP_FOR_UNLINK flag). > > (3) An override due to CAP_SYS_ADMIN. CAP_SYS_ADMIN should never skip SELinux checking. Even for Smack, there is a separate capability (CAP_MAC_ADMIN) for that purpose. > (4) An override due to an instantiation token being present. Not sure what this means but again we shouldn't skip SELinux checking based on mere possession of an object capability (not a POSIX capability). > > (5) The permissions check is being deferred to later key_permission() > calls. > > The extra values give the opportunity for LSMs to audit these situations. > --- > diff --git a/security/keys/keyctl.c b/security/keys/keyctl.c > index 7d8de1c9a478..6763ee45e04d 100644 > --- a/security/keys/keyctl.c > +++ b/security/keys/keyctl.c > @@ -434,7 +434,7 @@ long keyctl_invalidate_key(key_serial_t id) > > /* Root is permitted to invalidate certain special keys */ > if (capable(CAP_SYS_ADMIN)) { > - key_ref = lookup_user_key(id, 0, 0); > + key_ref = lookup_user_key(id, 0, KEY_SYSADMIN_OVERRIDE); It would be better if the permission indicated the actual operation (e.g. KEY_NEED_INVALIDATE_SPECIAL), and the decision whether to permit CAP_SYS_ADMIN processes to override was left to the security modules. SELinux doesn't automatically allow CAP_SYS_ADMIN processes to do everything. > @@ -479,7 +479,8 @@ long keyctl_keyring_clear(key_serial_t ringid) > > /* Root is permitted to invalidate certain special keyrings */ > if (capable(CAP_SYS_ADMIN)) { > - keyring_ref = lookup_user_key(ringid, 0, 0); > + keyring_ref = lookup_user_key(ringid, 0, > + KEY_SYSADMIN_OVERRIDE); Ditto. > @@ -663,7 +664,7 @@ long keyctl_describe_key(key_serial_t keyid, > key_put(instkey); > key_ref = lookup_user_key(keyid, > KEY_LOOKUP_PARTIAL, > - 0); > + KEY_AUTHTOKEN_OVERRIDE); Similarly, it would be better if the permission indicated the operation (e.g. KEY_NEED_DESCRIBE) rather than the means by which it is being authorized. A MAC scheme won't allow mere knowledge of a token/password-capability to permit violation of its policy. > @@ -1471,7 +1472,7 @@ long keyctl_set_timeout(key_serial_t id, unsigned timeout) > key_put(instkey); > key_ref = lookup_user_key(id, > KEY_LOOKUP_PARTIAL, > - 0); > + KEY_AUTHTOKEN_OVERRIDE); Ditto. > @@ -1579,7 +1580,8 @@ long keyctl_get_security(key_serial_t keyid, > return PTR_ERR(instkey); > key_put(instkey); > > - key_ref = lookup_user_key(keyid, KEY_LOOKUP_PARTIAL, 0); > + key_ref = lookup_user_key(keyid, KEY_LOOKUP_PARTIAL, > + KEY_AUTHTOKEN_OVERRIDE); Ditto > diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c > index 0b4e32161b77..3ff6b6dfc5ca 100644 > --- a/security/selinux/hooks.c > +++ b/security/selinux/hooks.c > @@ -6541,20 +6541,31 @@ static void selinux_key_free(struct key *k) > > static int selinux_key_permission(key_ref_t key_ref, > const struct cred *cred, > - unsigned perm) > + enum key_need_perm need_perm) > { > struct key *key; > struct key_security_struct *ksec; > - u32 sid; > + u32 perm, sid; > > - /* if no specific permissions are requested, we skip the > - permission check. No serious, additional covert channels > - appear to be created. */ > - if (perm == 0) > + switch (need_perm) { > + case KEY_NEED_UNLINK: > + case KEY_SYSADMIN_OVERRIDE: > + case KEY_AUTHTOKEN_OVERRIDE: > + case KEY_DEFER_PERM_CHECK: > return 0; We really shouldn't be skipping any/all checking on CAP_SYS_ADMIN or an AUTHTOKEN; those should still be subject to MAC policy.