Received: by 2002:a05:6a10:2726:0:0:0:0 with SMTP id ib38csp3492744pxb; Mon, 4 Apr 2022 18:44:08 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz5LT7GGaS9pyjkcqnYxb8dowT3kkHGRe8laqh2ZHkIy2tOXO1/5C3ru+MVVpSegsmtBRpm X-Received: by 2002:a17:902:e543:b0:156:c93c:6a13 with SMTP id n3-20020a170902e54300b00156c93c6a13mr1141652plf.60.1649123047941; Mon, 04 Apr 2022 18:44:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649123047; cv=none; d=google.com; s=arc-20160816; b=iGInyyqGUzuYIc6X/QigmmvE8ne7piQn4xfSGKvKNWVLTnT45dh+jVqoreRnq9zMju Rt8NS7Y7i4RpKx7CHyqyMioD/zOf61OZlpBJwQRE4kk2J3SFefIhFIGLEr/qC6JmEjyD rbJFGUE0Xvs9FYtGXcy1dMYtwZjot8XBeGwhwqNkX9FjgKIJSL3bEbMppgfvcs7trgsi 51ieLSLrTF2nXWJEyHYQMaJDFbcju/6F1C3PUGrLVH5zl3iFoBgzg+av2Ag98J/dm3+v MmWwKPgOqBxfseYo09p30+o2UkUXm64vUNzdNIcGEZUwM13NT1tGeNebUdhnUY57HVNY n6Pw== 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 :dkim-signature; bh=GGy12Ftw4loYyE/TAP1mAYq+WnfJrqLYyR2nxuIM2Fs=; b=glcDyvHlePkNmUVdPyRo35aiAZZVBh+P1Xupsi3AhdpNm7O2AbvLG3wrT7lsjs+ber zWOlI26XwnMUkMxo4QoRvKI3slgFQ84o+h4U7s3w+5J64XeEw8RT5faR5yX5/lNOaySv XRtuyX+GqDhpsM2q7SDitg7FIadIqgZwAiIbj5unB5zWsIx8X9uuyebWyKx2kr0PUWoM +j79U8aqNTUBGNSN1InDbX9PhqHutvp57ipRZZWhCzUh983Wt4BKnWWY1M6eydF0RRtM asVYskBntG+NrjdfFTCuKGutLANI8Z5jpy/sqhI/brGmrdwbKOEMlA7piX/Xmfx7nq6d J+SA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=SL+SlsZQ; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [23.128.96.19]) by mx.google.com with ESMTPS id o4-20020a170902d4c400b00153b2d1645dsi12601420plg.101.2022.04.04.18.44.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 Apr 2022 18:44:07 -0700 (PDT) Received-SPF: softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) client-ip=23.128.96.19; Authentication-Results: mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=SL+SlsZQ; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: from out1.vger.email (out1.vger.email [IPv6:2620:137:e000::1:20]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 4F0632A9127; Mon, 4 Apr 2022 17:43:21 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240995AbiDAWKy (ORCPT + 99 others); Fri, 1 Apr 2022 18:10:54 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48052 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353230AbiDAWKo (ORCPT ); Fri, 1 Apr 2022 18:10:44 -0400 Received: from mail-pl1-x62b.google.com (mail-pl1-x62b.google.com [IPv6:2607:f8b0:4864:20::62b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A136736E01 for ; Fri, 1 Apr 2022 15:08:52 -0700 (PDT) Received: by mail-pl1-x62b.google.com with SMTP id x2so3560282plm.7 for ; Fri, 01 Apr 2022 15:08:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=GGy12Ftw4loYyE/TAP1mAYq+WnfJrqLYyR2nxuIM2Fs=; b=SL+SlsZQoHtn/QL8/tkQm0FjSPuHuOxWUbuUxvj8p1fi5KcysZoVhJslgdNUIpCfdx xMaLuCHkzzhLEtjWry6xZ18Kd8ePrZ0yDFhYQrDIwtgMlcC0xLi8wlA+UmB3/v01zVJM 6kkF19DbqpacsUKj/Tf9vROFF0KI1KSVapvFw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=GGy12Ftw4loYyE/TAP1mAYq+WnfJrqLYyR2nxuIM2Fs=; b=qTp2eUI9jghjoBQMrdv1UUhyg0Ru6o7yHYghgVNqx1WgUMdFpSLHJME8WW50xXKuU3 TGahIturYjFOHtrqFC+1410V+VZBdn/oWCm85y1FhW/uiwKct+wQrHRsGjIivyrfCXAO x97P0g5c7w0yDqjSYUDj+pgpd2S9lc5Bvs83ZWUSQrj0L3bpMOrQC2PqiTERXro82q30 YFUaokAysLhgPDfY3H7Xyj0mWXxktmHSjfXOh7u4b5n3Hn2Jy5UsQ449lZ0jw2QL19AY 7oTH3EuW6OE7oHIJ79V2UAgIDYKoKqprJFqF3uNf48zF71S+57E5xO2+dZROR70JRVIj LjAA== X-Gm-Message-State: AOAM530Bwjglq7dmQ9hUJuk9psJ+B85cqkGh27E50nuqfWKKYb+uKTgW PIZhp+PxGusL0faUMrYqdWJayg== X-Received: by 2002:a17:902:db0f:b0:154:665e:af75 with SMTP id m15-20020a170902db0f00b00154665eaf75mr48318074plx.147.1648850932149; Fri, 01 Apr 2022 15:08:52 -0700 (PDT) Received: from localhost ([2620:15c:202:201:72c9:527e:d936:c24b]) by smtp.gmail.com with UTF8SMTPSA id k18-20020a056a00135200b004fb18fc6c78sm4219370pfu.31.2022.04.01.15.08.51 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 01 Apr 2022 15:08:51 -0700 (PDT) From: Daniel Verkamp To: linux-mm@kvack.org Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Andrew Morton , Hugh Dickins , Mattias Nissler , Dmitry Torokhov , Kees Cook , Daniel Verkamp Subject: [PATCH 2/4] mm/memfd: add MFD_NOEXEC flag to memfd_create Date: Fri, 1 Apr 2022 15:08:32 -0700 Message-Id: <20220401220834.307660-3-dverkamp@chromium.org> X-Mailer: git-send-email 2.35.1.1094.g7c7d902a7c-goog In-Reply-To: <20220401220834.307660-1-dverkamp@chromium.org> References: <20220401220834.307660-1-dverkamp@chromium.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,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 The new MFD_NOEXEC flag allows the creation of a permanently non-executable memfd. This is accomplished by creating it with a different set of file mode bits (0666) than the default (0777) and applying the F_SEAL_EXEC seal at creation time, so there is no window between memfd creation and seal application. Unfortunately, the default for memfd must remain executable, since changing this would be an API break, and some programs depend on being able to exec code from a memfd directly. However, this new flag will allow programs to create non-executable memfds, and a distribution may choose to enforce use of this flag in memfd_create calls via other security mechanisms. Signed-off-by: Daniel Verkamp --- include/uapi/linux/memfd.h | 1 + mm/memfd.c | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/include/uapi/linux/memfd.h b/include/uapi/linux/memfd.h index 7a8a26751c23..140e125c9f65 100644 --- a/include/uapi/linux/memfd.h +++ b/include/uapi/linux/memfd.h @@ -8,6 +8,7 @@ #define MFD_CLOEXEC 0x0001U #define MFD_ALLOW_SEALING 0x0002U #define MFD_HUGETLB 0x0004U +#define MFD_NOEXEC 0x0008U /* * Huge page size encoding when MFD_HUGETLB is specified, and a huge page diff --git a/mm/memfd.c b/mm/memfd.c index 4ebeab94aa74..b841514eb0fd 100644 --- a/mm/memfd.c +++ b/mm/memfd.c @@ -263,7 +263,7 @@ long memfd_fcntl(struct file *file, unsigned int cmd, unsigned long arg) #define MFD_NAME_PREFIX_LEN (sizeof(MFD_NAME_PREFIX) - 1) #define MFD_NAME_MAX_LEN (NAME_MAX - MFD_NAME_PREFIX_LEN) -#define MFD_ALL_FLAGS (MFD_CLOEXEC | MFD_ALLOW_SEALING | MFD_HUGETLB) +#define MFD_ALL_FLAGS (MFD_CLOEXEC | MFD_ALLOW_SEALING | MFD_HUGETLB | MFD_NOEXEC) SYSCALL_DEFINE2(memfd_create, const char __user *, uname, @@ -333,6 +333,14 @@ SYSCALL_DEFINE2(memfd_create, *file_seals &= ~F_SEAL_SEAL; } + if (flags & MFD_NOEXEC) { + struct inode *inode = file_inode(file); + + inode->i_mode &= ~0111; + file_seals = memfd_file_seals_ptr(file); + *file_seals |= F_SEAL_EXEC; + } + fd_install(fd, file); kfree(name); return fd; -- 2.35.1.1094.g7c7d902a7c-goog