Received: by 2002:ab2:2994:0:b0:1ef:ca3e:3cd5 with SMTP id n20csp714229lqb; Fri, 15 Mar 2024 04:42:56 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCUFfx1bWhQXIvFs6EHZgazfKYRgAigGLdS2Xq1dic3WRBzrez5gRlW1yPGKoAwacHvZxCoywllXWmfcF1mDfU2Fp/I9cwEIC20EAZ6mWw== X-Google-Smtp-Source: AGHT+IHIqgrYlgIisTTRXa0W8s0zCAI9e41qGVx64uvUHfm//UYcQznzW/CHwbsQji659olHZO6y X-Received: by 2002:a05:6a21:170f:b0:1a3:4979:f25e with SMTP id nv15-20020a056a21170f00b001a34979f25emr3114767pzb.59.1710502976273; Fri, 15 Mar 2024 04:42:56 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1710502976; cv=pass; d=google.com; s=arc-20160816; b=fz31L3c9PsLc85MsjgXq/pGXIynSNsWhPe6Zy56xIOPgRGXlgtSz28zRON2TQYibIs Ia/NZ39SrpHV05k6xbnxDF9XJ6z7qzJdUfkAgUYn95/vw5M88G94l3KgrJg5hU40/MRa 0+CMGJQPL4f9N9U8NgC5e3vdUjh7SWaw8e8s9fn//c1XzlmBvtSqczsur7DUd5DAw17I HWCvUXIrGGJc5XdlBa9j3Vrh/M6PE3EZDh1rfcjnpZzxH7Irtc2fram+tuKxi5+QtWOq Un3SrdWFZI4ZoLsfJUJtYk/C8GmJtD32f1PTwGAs1zo4SqOdB5ufMI6wgxWZGNln706E YtcA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=cfmF9oVuH/nqtcAZ9ZoTPovZTcMFlC6oTWbI9R5zfGA=; fh=6mmFZUBTC1dp/9sUim5Jh7WBYEoCVfgLbcflaT+JWV4=; b=OhEOEttXUoNnVqTa+CW3VN96/kRYZbc5DZTNoOnDo9KtCnFyYZghJ797etkQEZKRix rs0Tf94saTfLQpwCjA6CIXl6wT7F40OekTtlC5ArTOiNlS6Ce18c9a/KLTqRJn5hcmOB oMzYoM+7G5c1dGqbitjk+UACH1k4W5q8k6MGSJ9o12oodTFboNf8wesIbigSZuDseKgo CdswLYo5j4SlvcWfeL9wo5Z63NxNqMCaaU6oNknpqWiAXOIItU7yTldXTIbfZBBY08cP khf8t/O2GVcxCGRLrszG+KXGL8Ep53CmRhJOf5lgN8/xFR4rE1C9s0MRHu691hNoAl97 SsHg==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@googlemail.com header.s=20230601 header.b=febbbb5S; arc=pass (i=1 spf=pass spfdomain=googlemail.com dkim=pass dkdomain=googlemail.com dmarc=pass fromdomain=googlemail.com); spf=pass (google.com: domain of linux-kernel+bounces-104359-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-104359-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=googlemail.com Return-Path: Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [2604:1380:40f1:3f00::1]) by mx.google.com with ESMTPS id a15-20020a631a4f000000b005dc422f07easi2485682pgm.902.2024.03.15.04.42.55 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 Mar 2024 04:42:56 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-104359-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) client-ip=2604:1380:40f1:3f00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@googlemail.com header.s=20230601 header.b=febbbb5S; arc=pass (i=1 spf=pass spfdomain=googlemail.com dkim=pass dkdomain=googlemail.com dmarc=pass fromdomain=googlemail.com); spf=pass (google.com: domain of linux-kernel+bounces-104359-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-104359-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=googlemail.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sy.mirrors.kernel.org (Postfix) with ESMTPS id A7C91B22A8B for ; Fri, 15 Mar 2024 11:41:59 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 7405E3B789; Fri, 15 Mar 2024 11:39:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=googlemail.com header.i=@googlemail.com header.b="febbbb5S" Received: from mail-ed1-f44.google.com (mail-ed1-f44.google.com [209.85.208.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 760DA374F8; Fri, 15 Mar 2024 11:39:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.44 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710502753; cv=none; b=fB2d6dblCSodsQ+TNXJNpu/iWreB4qE9IDdhG2lIQesfcninPAS8lghhVXcPSXWi5G/y/zIKaCoLQ52131If1aWb9WVO+TpTQ8CFOemi5/5wEPyHwzA1w94ibM8fkz5Bh9GrZp+LoHgZitgj6Q/cccHd5sjh4L/RvyOLWXJTTRs= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710502753; c=relaxed/simple; bh=q188HzvOUC/SWbrcVrOvRopYEaFyTUWDEJRgbVqCiO4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=I1HJJ5RUty+aY8gHBKX3MTUgHNz83m5naLib43FivFVnki0hL9IiiSSbVmhlUBudXg2vM777wznyTLbZ8KvU//COKVqbao3pooKyfPfj8+yDLDqOu1c1hNcvToo7IbON2hSWoRsMlQlUBCWSAuRO1FUvQjmA3SXN5Dwzm3/ldHc= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=googlemail.com; spf=pass smtp.mailfrom=googlemail.com; dkim=pass (2048-bit key) header.d=googlemail.com header.i=@googlemail.com header.b=febbbb5S; arc=none smtp.client-ip=209.85.208.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=googlemail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=googlemail.com Received: by mail-ed1-f44.google.com with SMTP id 4fb4d7f45d1cf-563c595f968so2579136a12.0; Fri, 15 Mar 2024 04:39:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20230601; t=1710502750; x=1711107550; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=cfmF9oVuH/nqtcAZ9ZoTPovZTcMFlC6oTWbI9R5zfGA=; b=febbbb5S6zucEme1c3YDVJghkJzmoxo53V2i8FKe9wvFAw3ovHOIY1VaJ1rXM1FKxF EQ4Xiju5bVy8M11BrOdiy3vUmbspXL2M6zwvc3xBLGvVJqQ6bHvdswXPGvBd9blqHhrL rEmQeU78d9jw0RJtzilfFr8svnEe9YPpBhSLQb8kJC32PBcmRj5Q4TE926YZsWaP4+NB JQZKjPRGnVV+tGM4WvREV8XhWf43E50WOQXFe8ke11kue1PSufxmpEgoANbtstYdNMTV y11Sn17VmZA0dKj7/sidoFrM2A9Laz67lVa+9xOtPd3U7TpuvvcWjf6e1TYU4Bx/sTC2 CwFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710502750; x=1711107550; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=cfmF9oVuH/nqtcAZ9ZoTPovZTcMFlC6oTWbI9R5zfGA=; b=iJYHXdQuvK6x3RW7EJnyreV34G/dgUcEJw3F4TVNC49Vtg0LSau6dTNMajsYkrYDpn JVDmFNBq06eShid3Vj3XMCwBvUi3ZOtClTTDGjB7n8/DXDns9Sz7LtQZ/rsPQyasJFLi wL9/tsNrb54gjg1wjuR9gwI3YxU5BLp/Cn4Y2Wgt53Nju+rx2brG75QfIbZQJRLDfCYe SUMWmAVrZ39p9ak3YXmXqOPlyT5awee/omWFsCOW4enwC9pFhktKOPkhCRSd6agKIefb 5LBcXfHORnVvsDdi2EOWs3tB7X5OerpE+g3Y0i9MGxaW/MnDu1XmpZfB2RDMUoQOj96S +VmA== X-Forwarded-Encrypted: i=1; AJvYcCXy8EFAigHF5YWFoPDslQK6rWEpddaq/43rvIOhxfaJk8BteoAMQ1b0aj/7xVshtYckx+KLHxsCLLGng1c9LvEvBnjaKef/NYTi/Iid07WiAPYoGw8HPp9kEHgqe+Tvcc/G X-Gm-Message-State: AOJu0Yx6d9NHFovyx7tYBhYk1Q1ZeXErtVU3hCUbQLFFtECKVjhUBH5T pFHXP5wTRUqHyuQ291n2ImSSfKuipm1ZzqfDObj3QP4I347kdhmwg0VpbfV84qpD6A== X-Received: by 2002:aa7:cd58:0:b0:568:260b:e502 with SMTP id v24-20020aa7cd58000000b00568260be502mr2091951edw.13.1710502749840; Fri, 15 Mar 2024 04:39:09 -0700 (PDT) Received: from ddev.DebianHome (dynamic-095-119-217-226.95.119.pool.telefonica.de. [95.119.217.226]) by smtp.gmail.com with ESMTPSA id fg3-20020a056402548300b005682f47aea7sm1610024edb.94.2024.03.15.04.39.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 Mar 2024 04:39:09 -0700 (PDT) From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= To: linux-security-module@vger.kernel.org Cc: Serge Hallyn , Julia Lawall , Nicolas Palix , linux-kernel@vger.kernel.org, cocci@inria.fr, bpf@vger.kernel.org Subject: [PATCH 10/10] coccinelle: add script for capable_any() Date: Fri, 15 Mar 2024 12:37:31 +0100 Message-ID: <20240315113828.258005-10-cgzones@googlemail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240315113828.258005-1-cgzones@googlemail.com> References: <20240315113828.258005-1-cgzones@googlemail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a script to find and replace chained capable() calls with capable_any(). Also find and replace capable_any() calls where CAP_SYS_ADMIN was passed as first argument. Signed-off-by: Christian Göttsche --- v5: add patch --- MAINTAINERS | 1 + scripts/coccinelle/api/capable_any.cocci | 164 +++++++++++++++++++++++ 2 files changed, 165 insertions(+) create mode 100644 scripts/coccinelle/api/capable_any.cocci diff --git a/MAINTAINERS b/MAINTAINERS index f4d7f7cb7577..32349e4c5f56 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -4731,6 +4731,7 @@ S: Supported F: include/linux/capability.h F: include/uapi/linux/capability.h F: kernel/capability.c +F: scripts/coccinelle/api/capable_any.cocci F: security/commoncap.c CAPELLA MICROSYSTEMS LIGHT SENSOR DRIVER diff --git a/scripts/coccinelle/api/capable_any.cocci b/scripts/coccinelle/api/capable_any.cocci new file mode 100644 index 000000000000..83aedd3bf81d --- /dev/null +++ b/scripts/coccinelle/api/capable_any.cocci @@ -0,0 +1,164 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Use capable_any rather than chaining capable and order CAP_SYS_ADMIN last +/// +// Confidence: High +// Copyright: (C) 2024 Christian Göttsche. +// URL: https://coccinelle.gitlabpages.inria.fr/website +// Options: --no-includes --include-headers +// Keywords: capable, capable_any, ns_capable, ns_capable_any, sockopt_ns_capable, sockopt_ns_capable_any + +virtual patch +virtual context +virtual org +virtual report + +//---------------------------------------------------------- +// For patch mode +//---------------------------------------------------------- + +@ depends on patch@ +binary operator op; +expression cap1,cap2,E; +expression ns; +@@ + +( +- capable(cap1) || capable(cap2) ++ capable_any(cap1, cap2) +| +- E op capable(cap1) || capable(cap2) ++ E op capable_any(cap1, cap2) +| +- !capable(cap1) && !capable(cap2) ++ !capable_any(cap1, cap2) +| +- E op !capable(cap1) && !capable(cap2) ++ E op !capable_any(cap1, cap2) +| +- ns_capable(ns, cap1) || ns_capable(ns, cap2) ++ ns_capable_any(ns, cap1, cap2) +| +- E op ns_capable(ns, cap1) || ns_capable(ns, cap2) ++ E op ns_capable_any(ns, cap1, cap2) +| +- !ns_capable(ns, cap1) && !ns_capable(ns, cap2) ++ !ns_capable_any(ns, cap1, cap2) +| +- E op !ns_capable(ns, cap1) && !ns_capable(ns, cap2) ++ E op !ns_capable_any(ns, cap1, cap2) +| +- sockopt_ns_capable(ns, cap1) || sockopt_ns_capable(ns, cap2) ++ sockopt_ns_capable_any(ns, cap1, cap2) +| +- E op sockopt_ns_capable(ns, cap1) || sockopt_ns_capable(ns, cap2) ++ E op sockopt_ns_capable_any(ns, cap1, cap2) +| +- !sockopt_ns_capable(ns, cap1) && !sockopt_ns_capable(ns, cap2) ++ !sockopt_ns_capable_any(ns, cap1, cap2) +| +- E op !sockopt_ns_capable(ns, cap1) && !sockopt_ns_capable(ns, cap2) ++ E op !sockopt_ns_capable_any(ns, cap1, cap2) +) + +@ depends on patch@ +identifier func = { capable_any, ns_capable_any, sockopt_ns_capable_any }; +expression cap; +expression ns; +@@ + +( +- func(CAP_SYS_ADMIN, cap) ++ func(cap, CAP_SYS_ADMIN) +| +- func(ns, CAP_SYS_ADMIN, cap) ++ func(ns, cap, CAP_SYS_ADMIN) +) + +//---------------------------------------------------------- +// For context mode +//---------------------------------------------------------- + +@r1 depends on !patch exists@ +binary operator op; +expression cap1,cap2,E; +expression ns; +position p1,p2; +@@ + +( +* capable@p1(cap1) || capable@p2(cap2) +| +* E op capable@p1(cap1) || capable@p2(cap2) +| +* !capable@p1(cap1) && !capable@p2(cap2) +| +* E op !capable@p1(cap1) && !capable@p2(cap2) +| +* ns_capable@p1(ns, cap1) || ns_capable@p2(ns, cap2) +| +* E op ns_capable@p1(ns, cap1) || ns_capable@p2(ns, cap2) +| +* !ns_capable@p1(ns, cap1) && !ns_capable@p2(ns, cap2) +| +* E op !ns_capable@p1(ns, cap1) && !ns_capable@p2(ns, cap2) +| +* sockopt_ns_capable@p1(ns, cap1) || sockopt_ns_capable@p2(ns, cap2) +| +* E op sockopt_ns_capable@p1(ns, cap1) || sockopt_ns_capable@p2(ns, cap2) +| +* !sockopt_ns_capable@p1(ns, cap1) && !sockopt_ns_capable@p2(ns, cap2) +| +* E op !sockopt_ns_capable@p1(ns, cap1) && !sockopt_ns_capable@p2(ns, cap2) +) + +@r2 depends on !patch exists@ +identifier func = { capable_any, ns_capable_any, sockopt_ns_capable_any }; +expression cap; +expression ns; +position p; +@@ + +( +* func@p(CAP_SYS_ADMIN, cap) +| +* func@p(ns, CAP_SYS_ADMIN, cap) +) + +//---------------------------------------------------------- +// For org mode +//---------------------------------------------------------- + +@script:python depends on org@ +p1 << r1.p1; +p2 << r1.p2; +@@ + +cocci.print_main("WARNING opportunity for capable_any",p1) +cocci.print_secs("chained capable",p2) + +@script:python depends on org@ +p << r2.p; +f << r2.func; +@@ + +cocci.print_main("WARNING " + f + " arguments should be reordered",p) + +//---------------------------------------------------------- +// For report mode +//---------------------------------------------------------- + +@script:python depends on report@ +p1 << r1.p1; +p2 << r1.p2; +@@ + +msg = "WARNING opportunity for capable_any (chained capable line %s)" % (p2[0].line) +coccilib.report.print_report(p1[0], msg) + +@script:python depends on report@ +p << r2.p; +f << r2.func; +@@ + +msg = "WARNING %s arguments should be reordered" % (f) +coccilib.report.print_report(p[0], msg) -- 2.43.0