Received: by 2002:a05:6a10:413:0:0:0:0 with SMTP id 19csp800450pxp; Fri, 11 Mar 2022 15:29:53 -0800 (PST) X-Google-Smtp-Source: ABdhPJx2xHGgVSViJvUu/ka0pFfyEZZEOF8dnir48s+5Zg96lK/7apXi5kNGj+fWyYWGKCbSjgbA X-Received: by 2002:a05:6a00:9a9:b0:4f7:876e:1e83 with SMTP id u41-20020a056a0009a900b004f7876e1e83mr7100376pfg.71.1647041393685; Fri, 11 Mar 2022 15:29:53 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1647041393; cv=none; d=google.com; s=arc-20160816; b=NAzwhGia07IXmUsylfW9wvjlxNkDMitbMx3BPGluYOAUw71Msc6mamqrq9DMB3rNrc lI2ZZQHx9SNYxWHa89em0gtDwwGBlCYEcDczF2q/0EzrGFygxS8nkyHhzTB+PrK8JuLI L0afvoA4V06ov8F1MHiDRKjctAZowB3oKR2jdiQxQjGnb2zvznOl8ksOKhUC28MNPDHb vEsZVHQRtUVezZV83GriC3+uzeElUMYcn01nvwNnnAcJT3r0FPLsKEgtCyC679vnwztf uHDpyndMKe3t2pDt/mxsv3rm8W7AoeK6FsvjyAOE+keWuRy9U9vY5NSGPfadVHWj17rX j8mg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date:dkim-signature; bh=XaC5p5aRufFHB1wvyg7VStVsB2ivx7gvc/SxoTC2bf8=; b=W7rk4kRbDoepnecXsL56Llh4SrM8/OfGDkEDHYa+mLI00gz4tXVoqb0zfPIuEaIzVN /zg4/QweG0Gqn5dY/pmaHt7ftxs6mI+LIxk6z03zZ57CrhgKqQWVaSlRIuwj6lGN/j9P CEX1RtCW4iY73NHkxYHaVRK4p+ORsZbd6eOb3fVz9BM02MPO6vGzcjYQnDk/W4NRLYN/ Hl9bOsWjt87PeqsJpufnVB9/XsTtU/twY1i7y8DkqISkLBXKEzwIbDL8KGc1hTtUkE7H G4ZnmYEb2imtvZrqwO2jdVIkk65vzEI0ey6manVsOZnwfjJhyi/C5nd7aPCvulxqvdCE GDeA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=Sw3AuBCb; 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=kernel.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [23.128.96.19]) by mx.google.com with ESMTPS id m11-20020a170902f64b00b00153215fec34si6173176plg.27.2022.03.11.15.29.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Mar 2022 15:29:53 -0800 (PST) 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=@kernel.org header.s=k20201202 header.b=Sw3AuBCb; 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=kernel.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id D18BE3126F6; Fri, 11 Mar 2022 14:16:17 -0800 (PST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241888AbiCKMMO (ORCPT + 99 others); Fri, 11 Mar 2022 07:12:14 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54498 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239673AbiCKMMN (ORCPT ); Fri, 11 Mar 2022 07:12:13 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 64FB3119F14; Fri, 11 Mar 2022 04:11:08 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 243B6B82BEB; Fri, 11 Mar 2022 12:11:07 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 866E9C340E9; Fri, 11 Mar 2022 12:11:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1647000665; bh=O89ScCFBuspgUWddx0ttaCHWVam7dsgvZ77m4faLqt4=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=Sw3AuBCbdamTmM2i1PmRwyH29G+wXBiUGt/ZAMzGGnCeJth+Rr0A9oqta4xzZyaCJ rko0mYWNshkTwlPnk1uN1RiBJ9nMqQ8tWf5CXcOiSb+N0iERSCa70SKsvlhYli23IJ HbWQ4KR8JHuXwH7M5KM4ozEYjvvd9eSoyBGODtrh12gtrPxDPChbhb03HY5juOdLHK rVAeEvvn8XOeHF2lmpWU7QmwNsPPg0mBXAtpDn0bssIZTmD3M0WhMJ+iYBIzkgze0S bYoBPwlh4oLLw9hoj7250ZuMiVVQllQim4AkLIS5xn4gkh7sqEhcX1kY+GFyxLJVgw bEb9YfRtrl+yg== Date: Fri, 11 Mar 2022 14:10:21 +0200 From: Jarkko Sakkinen To: Haitao Huang , "Chatre, Reinette" Cc: "Dhanraj, Vijay" , "Chatre, Reinette" , "dave.hansen@linux.intel.com" , "tglx@linutronix.de" , "bp@alien8.de" , "Lutomirski, Andy" , "mingo@redhat.com" , "linux-sgx@vger.kernel.org" , "x86@kernel.org" , "Christopherson,, Sean" , "Huang, Kai" , "Zhang, Cathy" , "Xing, Cedric" , "Huang, Haitao" , "Shanahan, Mark" , "hpa@zytor.com" , "linux-kernel@vger.kernel.org" Subject: Re: [PATCH V2 16/32] x86/sgx: Support restricting of enclave page permissions Message-ID: References: <4ce06608b5351f65f4e6bc6fc87c88a71215a2e7.1644274683.git.reinette.chatre@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-Spam-Status: No, score=-2.8 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,MAILING_LIST_MULTI, RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=unavailable 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 On Thu, Mar 10, 2022 at 12:33:20PM -0600, Haitao Huang wrote: > Hi Jarkko > > I have some trouble understanding the sequences below. > > On Thu, 10 Mar 2022 00:10:48 -0600, Jarkko Sakkinen > wrote: > > > On Wed, Feb 23, 2022 at 07:21:50PM +0000, Dhanraj, Vijay wrote: > > > Hi All, > > > > > > Regarding the recent update of splitting the page permissions change > > > request into two IOCTLS (RELAX and RESTRICT), can we combine them into > > > one? That is, revert to how it was done in the v1 version? > > > > > > Why? Currently in Gramine (a library OS for unmodified applications, > > > https://gramineproject.io/) with the new proposed change, one needs to > > > store the page permission for each page or range of pages. And for every > > > request of `mmap` or `mprotect`, Gramine would have to do a lookup > > > of the > > > page permissions for the request range and then call the respective > > > IOCTL > > > either RESTRICT or RELAX. This seems a little overwhelming. > > > > > > Request: Instead, can we do `MODPE`, call `RESTRICT` IOCTL, and then do > > > an `EACCEPT` irrespective of RELAX or RESTRICT page permission request? > > > With this approach, we can avoid storing page permissions and simplify > > > the implementation. > > > > > > I understand RESTRICT IOCTL would do a `MODPR` and trigger `ETRACK` > > > flows > > > to do TLB shootdowns which might not be needed for RELAX IOCTL but I am > > > not sure what will be the performance impact. Is there any data point to > > > see the performance impact? > > > > > > Thanks, > > > -Vijay > > > > This should get better in the next versuin. "relax" is gone. And for > > dynamic EAUG'd pages only VMA and EPCM permissions matter, i.e. > > internal vm_max_prot_bits is set to RWX. > > > > I patched the existing series eno > > > > For Enarx I'm using the following patterns. > > > > Shim mmap() handler: > > 1. Ask host for mmap() syscall. > > 2. Construct secinfo matching the protection bits. > > 3. For each page in the address range: EACCEPTCOPY with a > > zero page. > > For EACCEPTCOPY to work, I believe PTE.RW is required for the target page. > So this only works for mmap(..., RW) or mmap(...,RWX). I use it only with EAUG. > So that gives you pages with RW/RWX. > > To change permissions of any of those pages from RW/RWX to R/RX , you need > call ENCLAVE_RESTRICT_PERMISSIONS ioctl with R or with PROT_NONE. you can't > just do EMODPE. > > so for RW->R, you either: > > 1)EMODPR(EPCM.NONE) > 2)EACCEPT(EPCM.NONE) > 3)EMODPE(R) -- not sure this would work as spec says EMODPE requires "Read > access permitted by enclave" > > or: > > 1)EMODPR(EPCM.PROT_R) > 2)EACCEPT(EPCM.PROT_R) I checked from SDM and you're correct. Then the appropriate thing is to reset to R. > > Shim mprotect() handler: > > 1. Ask host for mprotect() syscall. > > 2. For each page in the address range: EACCEPT with PROT_NONE > > secinfo and EMODPE with the secinfo having the prot bits. > > EACCEPT requires PTE.R. And EAUG'd pages will always initialized with > EPCM.RW, > so EACCEPT(EPCM.PROT_NONE) will fail with SGX_PAGE_ATTRIBUTES_MISMATCH. Ditto. > > Backend mprotect() handler: > > 1. Invoke ENCLAVE_RESTRICT_PERMISSIONS ioctl for the address > > range with PROT_NONE. > > 2. Invoke real mprotect() syscall. > > > Note #1 can only be done after EACCEPT. MODPR is not allowed for pending > pages. Yes, and that's what I'm doing. After that shim does EACCEPT's in a loop. Reinette, the ioctl should already check that either R or W is set in secinfo and return -EACCES. I.e. (* Check for misconfigured SECINFO flags*) IF ( (SCRATCH_SECINFO reserved fields are not zero ) or (SCRATCH_SECINFO.FLAGS.R is 0 and SCRATCH_SECINFO.FLAGS.W is not 0) ) THEN #GP(0); FI; I was testing this and wondering why my enclave #GP's, and then I checked SDM after reading Haitao's response. So clearly check in kernel side is needed. BR, Jarkko