Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp32931pxb; Fri, 15 Jan 2021 07:03:31 -0800 (PST) X-Google-Smtp-Source: ABdhPJy1eNfyEYKaZgOcVJRi7/NGlQgTeI53jl6iocDxopD0puVPbiy0V3so+45k1RUx8Fs9s7+e X-Received: by 2002:a1c:f706:: with SMTP id v6mr9189575wmh.85.1610723010882; Fri, 15 Jan 2021 07:03:30 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1610723010; cv=none; d=google.com; s=arc-20160816; b=MvN7CZJfSI68Teq2ysei4g9MQ552WIZOYSX2Lmb/VcClIWK0JNHhRDlmA/gPZsuW+J SRuIbDWE/EbRKTVfu8KWM9CVltG/tbJfzny/fza2a6nRKNnMOaCk+d7bmYMp7ZH7uKOm me8FQ/nYS/UbYFx2PX+a8Omg9gZzF4SIVyHfOeD7jBY76fpZ+meCAH9smh8fo2/yNDev yhjd/YGrAXv3abUyFzfOGqq8pXd/25sCXPBQLqk9T21w8d9YdPa7pFvfUuFriMVVObML A+r+C2Xy0mw4DMIGQpliJ+zgE1DY5w0xP7wopEtKA/FRysJ9qkdEmQMug0yybKCdYU8s 8Y/g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=cLr3/7MFhX+1ftVPzuu1bI+iV26gwQzB5/3s2x+OKus=; b=Ds0w8sWDWvqfr+M0Mc5UL2qHImY6LugNXztIgCgkTMNSvWLOFwwOBu9PzubQ1K1MqC AJbeZh6Edh5Gio1S6yPCMLEmBLpMgRrnl2mTBoTjdX4SKUbmB/ZL6VmuRIL/+IudBeLD cxCjsmBHVKR7I3bJ6eNYgi/hGFjRnrQFiYLX9WQF7+wxRTgm+HCW/+xexfBC1RJNq+fY aKU4DqUv71UBW7pUjviQ6rptUy6jGeZwFkKCxGsq9tQl5rycI0gJ7kXHRmQ4qzCj6gzg GwvZyyUqAHkeqCkOXWDDIdi+zpR+9MKOn0KnDUlxP+qWcVMmeIiTSpiT6y2pn3i7L/GR 38qw== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (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 h12si1236293edk.467.2021.01.15.07.03.05; Fri, 15 Jan 2021 07:03:30 -0800 (PST) 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; 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=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732607AbhAOPAg (ORCPT + 99 others); Fri, 15 Jan 2021 10:00:36 -0500 Received: from raptor.unsafe.ru ([5.9.43.93]:54398 "EHLO raptor.unsafe.ru" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732591AbhAOPAg (ORCPT ); Fri, 15 Jan 2021 10:00:36 -0500 Received: from comp-core-i7-2640m-0182e6.redhat.com (ip-89-103-122-167.net.upcbroadband.cz [89.103.122.167]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by raptor.unsafe.ru (Postfix) with ESMTPSA id BB5F720A22; Fri, 15 Jan 2021 14:59:13 +0000 (UTC) From: Alexey Gladkov To: LKML , io-uring@vger.kernel.org, Kernel Hardening , Linux Containers , linux-mm@kvack.org Cc: Alexey Gladkov , Andrew Morton , Christian Brauner , "Eric W . Biederman" , Jann Horn , Jens Axboe , Kees Cook , Linus Torvalds , Oleg Nesterov Subject: [RFC PATCH v3 7/8] Move RLIMIT_NPROC check to the place where we increment the counter Date: Fri, 15 Jan 2021 15:57:28 +0100 Message-Id: <0829877fe0381f10d927bb94548021224e72f3c9.1610722474.git.gladkov.alexey@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.6.1 (raptor.unsafe.ru [5.9.43.93]); Fri, 15 Jan 2021 14:59:14 +0000 (UTC) Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org After calling set_user(), we always have to call commit_creds() to apply new credentials upon the current task. There is no need to separate limit check and counter incrementing. Signed-off-by: Alexey Gladkov --- kernel/cred.c | 22 +++++++++++++++++----- kernel/sys.c | 13 ------------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/kernel/cred.c b/kernel/cred.c index c43e30407d22..991c43559ee8 100644 --- a/kernel/cred.c +++ b/kernel/cred.c @@ -487,14 +487,26 @@ int commit_creds(struct cred *new) if (!gid_eq(new->fsgid, old->fsgid)) key_fsgid_changed(new); - /* do it - * RLIMIT_NPROC limits on user->processes have already been checked - * in set_user(). - */ alter_cred_subscribers(new, 2); if (new->user != old->user || new->user_ns != old->user_ns) { + bool overlimit; + set_cred_ucounts(new, new->user_ns, new->euid); - inc_rlimit_ucounts(new->ucounts, UCOUNT_RLIMIT_NPROC, 1); + + overlimit = inc_rlimit_ucounts_and_test(new->ucounts, UCOUNT_RLIMIT_NPROC, + 1, rlimit(RLIMIT_NPROC)); + + /* + * We don't fail in case of NPROC limit excess here because too many + * poorly written programs don't check set*uid() return code, assuming + * it never fails if called by root. We may still enforce NPROC limit + * for programs doing set*uid()+execve() by harmlessly deferring the + * failure to the execve() stage. + */ + if (overlimit && new->user != INIT_USER) + current->flags |= PF_NPROC_EXCEEDED; + else + current->flags &= ~PF_NPROC_EXCEEDED; } rcu_assign_pointer(task->real_cred, new); rcu_assign_pointer(task->cred, new); diff --git a/kernel/sys.c b/kernel/sys.c index c2734ab9474e..180c4e06064f 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -467,19 +467,6 @@ static int set_user(struct cred *new) if (!new_user) return -EAGAIN; - /* - * We don't fail in case of NPROC limit excess here because too many - * poorly written programs don't check set*uid() return code, assuming - * it never fails if called by root. We may still enforce NPROC limit - * for programs doing set*uid()+execve() by harmlessly deferring the - * failure to the execve() stage. - */ - if (is_ucounts_overlimit(new->ucounts, UCOUNT_RLIMIT_NPROC, rlimit(RLIMIT_NPROC)) && - new_user != INIT_USER) - current->flags |= PF_NPROC_EXCEEDED; - else - current->flags &= ~PF_NPROC_EXCEEDED; - free_uid(new->user); new->user = new_user; return 0; -- 2.29.2