Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp2256872ybi; Sat, 13 Jul 2019 10:11:47 -0700 (PDT) X-Google-Smtp-Source: APXvYqyeaNvkRRUF0sP59Ywx1CyVxji0Pyw0TsQEhYmeB7+bdMDDaEoDDFkPwZmoU5CXKnH0BOhH X-Received: by 2002:a63:125c:: with SMTP id 28mr17724629pgs.255.1563037907728; Sat, 13 Jul 2019 10:11:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1563037907; cv=none; d=google.com; s=arc-20160816; b=J1i7LIo/nykniyRNZpRh3NNe9PLdkqOuaAHVqXHWrPQMzeySkg/6LE9Towjun9XsFw iprHnU1dkYjXfSII2mNV/EQiu2St+HPTuEybTl5MS/aQ5HcDeNu99EUv413NbgotNnX2 RttRSt8fiKUlftHAQSFPA/AnjUd5qeA8txjA749Nn/CX3DAdS6ga5FAPq5tyjOOnFgnA XaolFBUjBtnafKsqDQAuRV7mN3tCKatBiuHCv408dQiydkL8OJyRkPWo56drJPPsSoVq NYmXJvjNjhKlwlnvltnCcfOjavL257cQp0f3lWL7AiF3ERCBigi7UIIHH5AVnl19QZIr x2Gw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=iAxyVaKaNquQ8AwsWJ21QV/1AdOmMxyNWNuUiG9Zni0=; b=W+e43AOHmFYzi2V3PkWOYSljETNkVG3T2ufwe/hdfOCPHTgz7dvWyRKDWJgL1liDhJ flN5XdZ3JtowG06cseQ4SCdxu8nwLqi9WtPZZEzZpEdLdegvaHYuRZ5QEW0IjpiHUAE9 8VHtEqK/+VjDWzHNlxC4XB80gWmBWLktj7h17rZq4YevTssUZAi5Nk6ChhO44cUs6JFZ aXxZOglzCpuIS7M5lVADwGdrZoihP+j/TJQ+JEY7d4gsBGby1tfjNTI84zXafxUiAT+k pOpaz/fNldx7O61D8JqQ6CWawjb47UIthmOVEYACOeS+8m5E91KfQ1ls6eNSaleWP0c0 evHg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id z3si5529766pju.48.2019.07.13.10.11.32; Sat, 13 Jul 2019 10:11:47 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728072AbfGMRLD (ORCPT + 99 others); Sat, 13 Jul 2019 13:11:03 -0400 Received: from mga12.intel.com ([192.55.52.136]:62266 "EHLO mga12.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727784AbfGMRLD (ORCPT ); Sat, 13 Jul 2019 13:11:03 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Jul 2019 10:11:02 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.63,487,1557212400"; d="scan'208";a="341981406" Received: from hbriegel-mobl.ger.corp.intel.com (HELO localhost) ([10.252.50.48]) by orsmga005.jf.intel.com with ESMTP; 13 Jul 2019 10:10:53 -0700 From: Jarkko Sakkinen To: linux-kernel@vger.kernel.org, x86@kernel.org, linux-sgx@vger.kernel.org Cc: akpm@linux-foundation.org, dave.hansen@intel.com, sean.j.christopherson@intel.com, nhorman@redhat.com, npmccallum@redhat.com, serge.ayoun@intel.com, shay.katz-zamir@intel.com, haitao.huang@intel.com, andriy.shevchenko@linux.intel.com, tglx@linutronix.de, kai.svahn@intel.com, bp@alien8.de, josh@joshtriplett.org, luto@kernel.org, kai.huang@intel.com, rientjes@google.com, cedric.xing@intel.com Subject: [PATCH v21 15/28] mm: Introduce vm_ops->may_mprotect() Date: Sat, 13 Jul 2019 20:07:51 +0300 Message-Id: <20190713170804.2340-16-jarkko.sakkinen@linux.intel.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190713170804.2340-1-jarkko.sakkinen@linux.intel.com> References: <20190713170804.2340-1-jarkko.sakkinen@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Sean Christopherson SGX will use ->may_mprotect() to invoke and enforce SGX variations on the existing file_mprotect() and mmap_file() LSM hooks. The name may_mprotect() is intended to reflect the hook's purpose as a way to restrict mprotect() as opposed to a wholesale replacement. Due to the nature of SGX and its Enclave Page Cache (EPC), all enclave VMAs are backed by a single file, i.e. /dev/sgx/enclave, that must be MAP_SHARED. Furthermore, all enclaves need read, write and execute VMAs. As a result, applying W^X restrictions on /dev/sgx/enclave using existing LSM hooks is for all intents and purposes impossible, e.g. denying either W or X would deny access to *any* enclave. By hooking mprotect(), SGX can enforce maximal PTE protections that are checked by LSMs at enclave load time (when the source file is available) and can also invoke LSM hooks at the time of mapping, e.g. an enclave specific hook or a modified call to file_mprotect(), e.g. to check W+X mappings. Signed-off-by: Sean Christopherson --- include/linux/mm.h | 2 ++ mm/mprotect.c | 13 ++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index dd0b5f4e1e45..0099b638836b 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -469,6 +469,8 @@ struct vm_operations_struct { void (*close)(struct vm_area_struct * area); int (*split)(struct vm_area_struct * area, unsigned long addr); int (*mremap)(struct vm_area_struct * area); + int (*may_mprotect)(struct vm_area_struct *vma, unsigned long start, + unsigned long end, unsigned long prot); vm_fault_t (*fault)(struct vm_fault *vmf); vm_fault_t (*huge_fault)(struct vm_fault *vmf, enum page_entry_size pe_size); diff --git a/mm/mprotect.c b/mm/mprotect.c index bf38dfbbb4b4..18732543b295 100644 --- a/mm/mprotect.c +++ b/mm/mprotect.c @@ -547,13 +547,20 @@ static int do_mprotect_pkey(unsigned long start, size_t len, goto out; } + tmp = vma->vm_end; + if (tmp > end) + tmp = end; + + if (vma->vm_ops && vma->vm_ops->may_mprotect) { + error = vma->vm_ops->may_mprotect(vma, nstart, tmp, prot); + if (error) + goto out; + } + error = security_file_mprotect(vma, reqprot, prot); if (error) goto out; - tmp = vma->vm_end; - if (tmp > end) - tmp = end; error = mprotect_fixup(vma, &prev, nstart, tmp, newflags); if (error) goto out; -- 2.20.1