Received: by 2002:a05:6a10:7420:0:0:0:0 with SMTP id hk32csp4434017pxb; Mon, 21 Feb 2022 21:29:45 -0800 (PST) X-Google-Smtp-Source: ABdhPJwKO17dzexyB9il/mG/Ar5CABWnOmG+DK93PLTu0K09FOvjQ8Ul3K1YDcsydKZJJv9Ep8o6 X-Received: by 2002:a17:902:ea0d:b0:14f:c4bd:2b8e with SMTP id s13-20020a170902ea0d00b0014fc4bd2b8emr6005065plg.7.1645507785532; Mon, 21 Feb 2022 21:29:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1645507785; cv=none; d=google.com; s=arc-20160816; b=oul5BG897+TCbukprRQSqCMVrSvf2WeJrKbFJ1NeC1rGaiXK25hD3NHVb0axC++1YO OG9AlDwLorsNi+cp7H7/JPJCpcOG/vGYgKvY34NItLoe8c60Yr2GTW7UdpBD/Jj6KbAi 9EaSV6nQiVQPw5xAzCkZyrNDIXa3T6TBTEgESJG885HIEojOnzffr5QsrztGxJH9loI5 2f0RfTEzrs0mLKDP4p8633FNQjsboOA66L2NKLpe7GNhiKtytdL8fISs2fgHePQggXo6 L/rQMUW6VoUv28r/wiqm+Lw0Pt/8txduXfYOvgSu5WYkSN+qzQ55TXRyFYu+Ly4C7huy FNXg== 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=Z21ctRV66sNU3ahP7e4UNwCAZS7IXdmFD1TL4BzRv9I=; b=F+R9OjCx+b2Df/5Rv3BwTGWEMZqRkzzEqNg7O6CNNatHUqxtayzYA3wpl9j6Tc7Zzd sykGv+5wPBTXAtwIxt9V3aDWCiMkV5PLeaNGQQHTQNybnbVp68MGt6tpcPL0W1sfEZv2 ceTx2mn4o4j4yDiN42VGxJoGyF603jvCVN2g8JvdYH7CmZcTI5AI1BxlXR3gx7DxW/E6 j20W+BfiEC7f+6mtKvHPVHN3/WdCRvdaDw0Ce+GyhcHzyOQavPLT364cUGkUcjNSWMFH L+4izMDwwTQjQfIL5dbytFOtou1c9LtklHf4GHWCuOk4OVHkRTTUlKO2Bn8hBXz0TKEC bI6g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id u20si11905396pgm.423.2022.02.21.21.29.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Feb 2022 21:29:45 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 771866C1C4; Mon, 21 Feb 2022 20:58:38 -0800 (PST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234367AbiBUVPq (ORCPT + 99 others); Mon, 21 Feb 2022 16:15:46 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:41084 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234314AbiBUVPl (ORCPT ); Mon, 21 Feb 2022 16:15:41 -0500 Received: from smtp-bc0b.mail.infomaniak.ch (smtp-bc0b.mail.infomaniak.ch [IPv6:2001:1600:3:17::bc0b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B288823BFE for ; Mon, 21 Feb 2022 13:15:13 -0800 (PST) Received: from smtp-2-0001.mail.infomaniak.ch (unknown [10.5.36.108]) by smtp-2-3000.mail.infomaniak.ch (Postfix) with ESMTPS id 4K2Znr2D7BzMqK3b; Mon, 21 Feb 2022 22:15:12 +0100 (CET) Received: from localhost (unknown [23.97.221.149]) by smtp-2-0001.mail.infomaniak.ch (Postfix) with ESMTPA id 4K2Znr0TjLzlhPJX; Mon, 21 Feb 2022 22:15:12 +0100 (CET) From: =?UTF-8?q?Micka=C3=ABl=20Sala=C3=BCn?= To: James Morris , "Serge E . Hallyn" Cc: =?UTF-8?q?Micka=C3=ABl=20Sala=C3=BCn?= , Al Viro , Jann Horn , Kees Cook , Konstantin Meskhidze , Paul Moore , Shuah Khan , linux-doc@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-security-module@vger.kernel.org, =?UTF-8?q?Micka=C3=ABl=20Sala=C3=BCn?= Subject: [PATCH v1 02/11] landlock: Reduce the maximum number of layers to 16 Date: Mon, 21 Feb 2022 22:25:13 +0100 Message-Id: <20220221212522.320243-3-mic@digikod.net> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220221212522.320243-1-mic@digikod.net> References: <20220221212522.320243-1-mic@digikod.net> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RDNS_NONE, SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Mickaël Salaün The maximum number of nested Landlock domains is currently 64. Because of the following fix and to help reduce the stack size, let's reduce it to 16. This seems large enough for a lot of use cases (e.g. sandboxed init service, spawning a sandboxed SSH service, in nested sandboxed containers). Reducing the number of nested domains may also help to discover misuse of Landlock (e.g. creating a domain per rule). Add and use a dedicated layer_mask_t typedef to fit with the number of layers. This might be useful when changing it and to keep it consistent with the maximum number of layers. Signed-off-by: Mickaël Salaün Link: https://lore.kernel.org/r/20220221212522.320243-3-mic@digikod.net --- security/landlock/fs.c | 13 +++++-------- security/landlock/limits.h | 2 +- security/landlock/ruleset.h | 4 ++++ tools/testing/selftests/landlock/fs_test.c | 2 +- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/security/landlock/fs.c b/security/landlock/fs.c index 9de2a460a762..4048e3c04d75 100644 --- a/security/landlock/fs.c +++ b/security/landlock/fs.c @@ -180,10 +180,10 @@ int landlock_append_fs_rule(struct landlock_ruleset *const ruleset, /* Access-control management */ -static inline u64 unmask_layers( +static inline layer_mask_t unmask_layers( const struct landlock_ruleset *const domain, const struct path *const path, - const access_mask_t access_request, u64 layer_mask) + const access_mask_t access_request, layer_mask_t layer_mask) { const struct landlock_rule *rule; const struct inode *inode; @@ -209,11 +209,11 @@ static inline u64 unmask_layers( */ for (i = 0; i < rule->num_layers; i++) { const struct landlock_layer *const layer = &rule->layers[i]; - const u64 layer_level = BIT_ULL(layer->level - 1); + const layer_mask_t layer_bit = BIT_ULL(layer->level - 1); /* Checks that the layer grants access to the full request. */ if ((layer->access & access_request) == access_request) { - layer_mask &= ~layer_level; + layer_mask &= ~layer_bit; if (layer_mask == 0) return layer_mask; @@ -228,12 +228,9 @@ static int check_access_path(const struct landlock_ruleset *const domain, { bool allowed = false; struct path walker_path; - u64 layer_mask; + layer_mask_t layer_mask; size_t i; - /* Make sure all layers can be checked. */ - BUILD_BUG_ON(BITS_PER_TYPE(layer_mask) < LANDLOCK_MAX_NUM_LAYERS); - if (!access_request) return 0; if (WARN_ON_ONCE(!domain || !path)) diff --git a/security/landlock/limits.h b/security/landlock/limits.h index 458d1de32ed5..126d1ec04d34 100644 --- a/security/landlock/limits.h +++ b/security/landlock/limits.h @@ -13,7 +13,7 @@ #include #include -#define LANDLOCK_MAX_NUM_LAYERS 64 +#define LANDLOCK_MAX_NUM_LAYERS 16 #define LANDLOCK_MAX_NUM_RULES U32_MAX #define LANDLOCK_LAST_ACCESS_FS LANDLOCK_ACCESS_FS_MAKE_SYM diff --git a/security/landlock/ruleset.h b/security/landlock/ruleset.h index 7e7cac68e443..0128c56ee7ff 100644 --- a/security/landlock/ruleset.h +++ b/security/landlock/ruleset.h @@ -23,6 +23,10 @@ typedef u16 access_mask_t; /* Makes sure all filesystem access rights can be stored. */ static_assert(BITS_PER_TYPE(access_mask_t) >= LANDLOCK_NUM_ACCESS_FS); +typedef u16 layer_mask_t; +/* Makes sure all layers can be checked. */ +static_assert(BITS_PER_TYPE(layer_mask_t) >= LANDLOCK_MAX_NUM_LAYERS); + /** * struct landlock_layer - Access rights for a given layer */ diff --git a/tools/testing/selftests/landlock/fs_test.c b/tools/testing/selftests/landlock/fs_test.c index 10c9a1e4ebd9..99838cac970b 100644 --- a/tools/testing/selftests/landlock/fs_test.c +++ b/tools/testing/selftests/landlock/fs_test.c @@ -1080,7 +1080,7 @@ TEST_F_FORK(layout1, max_layers) const int ruleset_fd = create_ruleset(_metadata, ACCESS_RW, rules); ASSERT_LE(0, ruleset_fd); - for (i = 0; i < 64; i++) + for (i = 0; i < 16; i++) enforce_ruleset(_metadata, ruleset_fd); for (i = 0; i < 2; i++) { -- 2.35.1