Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp164663pxv; Wed, 30 Jun 2021 02:39:32 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwe+4ZNFJzyBH5xvQOVqW2UlK51bip2vQvJhC8x3B44Mg0bADjYKjHYhuBtWXiIErO2/w2A X-Received: by 2002:a17:906:dc95:: with SMTP id cs21mr4807769ejc.365.1625045972543; Wed, 30 Jun 2021 02:39:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625045972; cv=none; d=google.com; s=arc-20160816; b=YnOYZcF6/lI6nXfYeNon8PtlKflTgfAWoe0NYbxPnpJHdzZ38Ipu3aB32stXa5Ol1x 2obuwOsaKeimb47xsSmQNI+FWc7pF5DFykKIAISIODyYBRL9JzD508aNKx5gf3xq/O+E ZQQ9bvZcSDyfQQV8ep+w+545ZaQRRKlp4IIo5qEcLbBhgofXqsHUprxwAEzBxnNB916O LYrxN6x0gbKLgF5ilTHsdFaAx51B99uQfhcG+6rPeFMNvefGEFZTOJ9cMvPAXNd2ash2 hFFjNtUJYwViewxMzzyUKh4IOI/r6Oy+VneUHu8EtFmbnyoH8Ylh185osLl7PGis7FeM QKXg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:mime-version:message-id:date :dkim-signature; bh=JhgrCS9Vj640V8x1cFNbO5yNaZtMM+Zz5JPkP+NN88k=; b=XDhbB9IvFMkeV6JjNMN70VXMf7eaIqPcFp0pFect3E/kaQpiryqgn80BkjCPMzeibB oObMGXtLEh8SRibIgdB09xoFXFHqQRJ8/ok/5Vj389OPEgsMPlseYJ8dKrzjciAPeNOg ZUGFGGteb207Wbm2l2X36hZsfUsiHb7iIslNrU7iP7T/5TZwmIXYoYI98o85rq8sY5xZ YNtAtum8Ve6u1YjxCKC43iZcMd25UQODUCuAmGNkgdPnoaqgAGfSXsXLPYl64vkREI7i JOgTTVk4KX3Ld6VRxJunFc/RkVasCployMx3EMxOnk6dTLeZSt0dsSdxs0TWTCgrYp+v q7mQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=hOGR+88o; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id dz21si954185edb.94.2021.06.30.02.39.09; Wed, 30 Jun 2021 02:39:32 -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=@google.com header.s=20161025 header.b=hOGR+88o; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233867AbhF3JkO (ORCPT + 99 others); Wed, 30 Jun 2021 05:40:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45882 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233817AbhF3JkN (ORCPT ); Wed, 30 Jun 2021 05:40:13 -0400 Received: from mail-wr1-x449.google.com (mail-wr1-x449.google.com [IPv6:2a00:1450:4864:20::449]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 83E54C061756 for ; Wed, 30 Jun 2021 02:37:43 -0700 (PDT) Received: by mail-wr1-x449.google.com with SMTP id v18-20020adfa1d20000b029012c379fbc45so147567wrv.22 for ; Wed, 30 Jun 2021 02:37:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:message-id:mime-version:subject:from:to:cc; bh=JhgrCS9Vj640V8x1cFNbO5yNaZtMM+Zz5JPkP+NN88k=; b=hOGR+88o6wgh2BS77C9e3IW5lpLeoKlfQpOyo0vBRi0/nOkMjDwyqlhB1sCe+OArkh 9qxed+lEX/yr9DODAh2C+/67NHa38Ru3QIfEuTWy+N0mZPdR3yc9FmtU7HR5TSYrw4XR Pnbphx2nxpTq0y3aE6Xf1wIJNFBrQor8dRtXxpwz+UWHJbubCIMHVOdhrDBe7YaQ9KF1 N4zqbDnQD4evL1iqNYm8CkXIeoIU8aKeMUq622KMpnRNff716iQW6ahiSRDH2jjddvWf dHcLiyQq9vn9oEC7xE6//J8vX3Onwt2Syz6i/JKPiGuxKlfK/BuNH3TSq8mNnz0JrMNR /Kmg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:message-id:mime-version:subject:from:to:cc; bh=JhgrCS9Vj640V8x1cFNbO5yNaZtMM+Zz5JPkP+NN88k=; b=KNAepVoX5Vq4jFihIRkXEqqlZ93MRjul73yCKR76EkzV5ErO9pEDSRC/xrIcTDE2mC AZ+HyXbC7rFGoI5cViRTEX82aQToqTkJe8BDbDPJXgSloGmTZkDMULTrJW1zbeN+d3sG zErEA9pPcG3v1l0voBqBjM+erqPlhj0QqiNnFeatt/xtyU2lkwv2GG9gRFqEhKOj7Esl 4vYhPVn/49UnAPBp+pO/EUPYMzuwmO+g9Uxx2TdR2iAJXLTrmF2/2DbTrnIrG/4fWhBp OeFyuNfTnhFmPSj+lMsHw6/ED8x8Hqq8gFu7LcKrXJQD544vTBoKBIa080U6Pp+zrYlR 8xUg== X-Gm-Message-State: AOAM532LeapycuY9HwnIfNqfCnkPiX0/7aRjVujk/NKW8z7G7K5JCbhk 31Jc0oBXVZ98n5p9CAisfmMHDgSkLw== X-Received: from elver.muc.corp.google.com ([2a00:79e0:15:13:d0e2:84e5:6f2a:9752]) (user=elver job=sendgmr) by 2002:a1c:e486:: with SMTP id b128mr3501221wmh.58.1625045861994; Wed, 30 Jun 2021 02:37:41 -0700 (PDT) Date: Wed, 30 Jun 2021 11:37:09 +0200 Message-Id: <20210630093709.3612997-1-elver@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.32.0.93.g670b81a890-goog Subject: [PATCH] perf: Require CAP_KILL if sigtrap is requested From: Marco Elver To: elver@google.com, peterz@infradead.org Cc: tglx@linutronix.de, mingo@kernel.org, kasan-dev@googlegroups.com, linux-kernel@vger.kernel.org, serge@hallyn.com, mingo@redhat.com, acme@kernel.org, mark.rutland@arm.com, alexander.shishkin@linux.intel.com, jolsa@redhat.com, namhyung@kernel.org, linux-security-module@vger.kernel.org, linux-perf-users@vger.kernel.org, Eric Biederman , Dmitry Vyukov Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If perf_event_open() is called with another task as target and perf_event_attr::sigtrap is set, and the target task's user does not match the calling user, also require the CAP_KILL capability. Otherwise, with the CAP_PERFMON capability alone it would be possible for a user to send SIGTRAP signals via perf events to another user's tasks. This could potentially result in those tasks being terminated if they cannot handle SIGTRAP signals. Fixes: 97ba62b27867 ("perf: Add support for SIGTRAP on perf events") Reported-by: Dmitry Vyukov Signed-off-by: Marco Elver --- include/linux/capability.h | 5 +++++ kernel/events/core.c | 13 ++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/include/linux/capability.h b/include/linux/capability.h index 65efb74c3585..1c6be4743dbe 100644 --- a/include/linux/capability.h +++ b/include/linux/capability.h @@ -264,6 +264,11 @@ static inline bool bpf_capable(void) return capable(CAP_BPF) || capable(CAP_SYS_ADMIN); } +static inline bool kill_capable(void) +{ + return capable(CAP_KILL) || capable(CAP_SYS_ADMIN); +} + static inline bool checkpoint_restore_ns_capable(struct user_namespace *ns) { return ns_capable(ns, CAP_CHECKPOINT_RESTORE) || diff --git a/kernel/events/core.c b/kernel/events/core.c index fe88d6eea3c2..1ab4bc867531 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -12152,10 +12152,21 @@ SYSCALL_DEFINE5(perf_event_open, } if (task) { + bool is_capable; + err = down_read_interruptible(&task->signal->exec_update_lock); if (err) goto err_file; + is_capable = perfmon_capable(); + if (attr.sigtrap) { + /* + * perf_event_attr::sigtrap sends signals to the other + * task. Require the current task to have CAP_KILL. + */ + is_capable &= kill_capable(); + } + /* * Preserve ptrace permission check for backwards compatibility. * @@ -12165,7 +12176,7 @@ SYSCALL_DEFINE5(perf_event_open, * perf_event_exit_task() that could imply). */ err = -EACCES; - if (!perfmon_capable() && !ptrace_may_access(task, PTRACE_MODE_READ_REALCREDS)) + if (!is_capable && !ptrace_may_access(task, PTRACE_MODE_READ_REALCREDS)) goto err_cred; } -- 2.32.0.93.g670b81a890-goog