Received: by 2002:a05:6a10:5bc5:0:0:0:0 with SMTP id os5csp1177413pxb; Tue, 19 Oct 2021 23:17:06 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwBAzCQRyk1lr9g4P60zySAtSVkF3MxzIgUNVwNexAWYCfIjT37fdoPnPGXMkFRneG/4vNX X-Received: by 2002:a17:90b:3695:: with SMTP id mj21mr5129222pjb.194.1634710626251; Tue, 19 Oct 2021 23:17:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1634710626; cv=none; d=google.com; s=arc-20160816; b=nUh/cEgdXzk0wdY60TzQ5KIRufjrHo/760cS2yEfHBHq32l5dtjtz+11nEbV4Cm7dt fI7VmeWVCUMl7zTSdhNM7PdfCSGYtEuZlCPYeFPTBhhAW1F53v4yPZZ2LElfE4l0ZN1X AvjPNoecX/jVtGbEll38WZeMlPEtb/sj+Cq1O+C+/IY9KQEh4nqsH9z/ENVS+ancdEx9 nd9k8aTtShYh3apfLIibjzXP7zKm8DhV9cYrQTFDfP2SdrAggNenibwkOFfb8I4IHSHr oIK+RX05uKRnBA0hF5bGq03jQh4WY5pYcULTNe0PqQw90wz+sjDSXRJKJ5q2a5KbtcYJ kcug== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:content-transfer-encoding :message-id:date:subject:cc:to:from:dkim-signature; bh=UfrRFBYQx9gkHBS+vYlccWelm2vmFNQUiXhyKdyTBLM=; b=mHb1ytQ+tj9fym5C/LNqzJC1CV5FTiyG7OzOCgDx2JS/2z3vD0oHPdJNgGfOS1MsAi aXbuVG0LKv9DCyjmI1Uv7vKXanEF2y5Ht55+G8cXVqNrJQeQar0OlRwXDn/oIYyshL3g KZkCruNIIQRHF4oumlM5vKsqs1BXJ/ZXwuxnNxdZZW8CqsnF1ta3fl1FhJymsAOrntBi Js6Foa6t84IpAeyKd1PFoo3P7ynaM93P5GoNFVcMTnCCO6ywrbryDMCNATDnlSos3fAk QPy5ydymD5fd7rOZ4yKf8FmKrFALLpqeH6/MvPItEmrpXRKXA3XfVeOnV7uzYoN453nl KsSw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@ibm.com header.s=pp1 header.b="NH/H2ORO"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=ibm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id r17si1694576pgr.190.2021.10.19.23.16.54; Tue, 19 Oct 2021 23:17:06 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@ibm.com header.s=pp1 header.b="NH/H2ORO"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=ibm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229822AbhJTGRE (ORCPT + 99 others); Wed, 20 Oct 2021 02:17:04 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:32918 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S229591AbhJTGRD (ORCPT ); Wed, 20 Oct 2021 02:17:03 -0400 Received: from pps.filterd (m0098420.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 19K6DksJ011958; Wed, 20 Oct 2021 02:14:26 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=from : to : cc : subject : date : message-id : content-transfer-encoding : mime-version; s=pp1; bh=UfrRFBYQx9gkHBS+vYlccWelm2vmFNQUiXhyKdyTBLM=; b=NH/H2OROhMHQNza5xUUMYwe3um2zbJkCrtEYfYDKmcdWHMjL1F+bT3YlFWZnE/SQ0mqG m4joeDapg+dMYWMGPi0taL7cA3il9bFCIzZwfjdch17w5+h8Pld0AXQQHQffIdpRIRP2 zDS7IgEqjztBy7XS9CAklnwAg0D7ajep/mYSWknkUGm+ligrfD2AwzSyYCSS3c1A617o YSMIGq5W6QrDnqoBGgq98k3PfATm11CXpXmw5+A2frPHE574YmKaVquCYs8NMIkLMkDB 89CK81hj9RTDQChVMvnROySAj9W1XdMBA9wuVk1sXsoyh+PoHal/LIs2JJPZhWwuYmGN Tg== Received: from pps.reinject (localhost [127.0.0.1]) by mx0b-001b2d01.pphosted.com with ESMTP id 3bt8erne4h-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 20 Oct 2021 02:14:26 -0400 Received: from m0098420.ppops.net (m0098420.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.43/8.16.0.43) with SMTP id 19K609K1029320; Wed, 20 Oct 2021 02:14:25 -0400 Received: from ppma03wdc.us.ibm.com (ba.79.3fa9.ip4.static.sl-reverse.com [169.63.121.186]) by mx0b-001b2d01.pphosted.com with ESMTP id 3bt8erne43-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 20 Oct 2021 02:14:25 -0400 Received: from pps.filterd (ppma03wdc.us.ibm.com [127.0.0.1]) by ppma03wdc.us.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 19K6C3gN025597; Wed, 20 Oct 2021 06:14:24 GMT Received: from b01cxnp23033.gho.pok.ibm.com (b01cxnp23033.gho.pok.ibm.com [9.57.198.28]) by ppma03wdc.us.ibm.com with ESMTP id 3bt4ss03pd-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 20 Oct 2021 06:14:24 +0000 Received: from b01ledav006.gho.pok.ibm.com (b01ledav006.gho.pok.ibm.com [9.57.199.111]) by b01cxnp23033.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 19K6EMFf28770622 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 20 Oct 2021 06:14:22 GMT Received: from b01ledav006.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C6583AC06D; Wed, 20 Oct 2021 06:14:22 +0000 (GMT) Received: from b01ledav006.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7644BAC060; Wed, 20 Oct 2021 06:14:22 +0000 (GMT) Received: from amdrome3.watson.ibm.com (unknown [9.2.130.16]) by b01ledav006.gho.pok.ibm.com (Postfix) with ESMTP; Wed, 20 Oct 2021 06:14:22 +0000 (GMT) From: Dov Murik To: linux-efi@vger.kernel.org Cc: Dov Murik , Borislav Petkov , Ashish Kalra , Brijesh Singh , Tom Lendacky , Ard Biesheuvel , James Morris , "Serge E. Hallyn" , Andi Kleen , Greg KH , Andrew Scull , Dave Hansen , "Dr. David Alan Gilbert" , James Bottomley , Tobin Feldman-Fitzthum , Jim Cadden , Daniele Buono , linux-coco@lists.linux.dev, linux-security-module@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 0/3] Allow guest access to EFI confidential computing secret area Date: Wed, 20 Oct 2021 06:14:05 +0000 Message-Id: <20211020061408.3447533-1-dovmurik@linux.ibm.com> X-Mailer: git-send-email 2.25.1 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: s3MdFjZC4chFKF3eovMH3PdW_AI4P886 X-Proofpoint-ORIG-GUID: p46Ip2hBK8FC_XrDWkEVCpdtExPE-G9V Content-Transfer-Encoding: 8bit X-Proofpoint-UnRewURL: 0 URL was un-rewritten MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.182.1,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.0.607.475 definitions=2021-10-20_01,2021-10-19_01,2020-04-07_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 priorityscore=1501 phishscore=0 clxscore=1015 suspectscore=0 adultscore=0 malwarescore=0 mlxscore=0 bulkscore=0 mlxlogscore=999 spamscore=0 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2109230001 definitions=main-2110200032 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Confidential computing (coco) hardware such as AMD SEV (Secure Encrypted Virtualization) allows guest owners to inject secrets into the VMs memory without the host/hypervisor being able to read them. In SEV, secret injection is performed early in the VM launch process, before the guest starts running. OVMF already reserves designated area for secret injection (in its AmdSev package; see edk2 commit 01726b6d23d4 "OvmfPkg/AmdSev: Expose the Sev Secret area using a configuration table" [1]), but the secrets were not available in the guest kernel. The patch series copies the secrets from the EFI-provided memory to kernel reserved memory, and optionally exposes them to userspace via securityfs using a new efi_secret kernel module. The first patch in efi/libstub copies the secret area from the EFI memory to specially allocated memory; the second patch reserves that memory block; and the third patch introduces the new efi_secret module that exposes the content of the secret entries as securityfs files, and allows clearing out secrets with a file unlink interface. As a usage example, consider a guest performing computations on encrypted files. The Guest Owner provides the decryption key (= secret) using the secret injection mechanism. The guest application reads the secret from the efi_secret filesystem and proceeds to decrypt the files into memory and then performs the needed computations on the content. In this example, the host can't read the files from the disk image because they are encrypted. Host can't read the decryption key because it is passed using the secret injection mechanism (= secure channel). Host can't read the decrypted content from memory because it's a confidential (memory-encrypted) guest. This has been tested with AMD SEV and SEV-ES guests, but the kernel side of handling the secret area has no SEV-specific dependencies, and therefore might be usable (perhaps with minor changes) for any confidential computing hardware that can publish the secret area via the standard EFI config table entry. To enable this functionality, set CONFIG_EFI_SECRET=m when building the guest kernel. Here is a simple example for usage of the efi_secret module in a guest to which an EFI secret area with 4 secrets was injected during launch: # modprobe efi_secret # ls -la /sys/kernel/security/coco/efi_secret total 0 drwxr-xr-x 2 root root 0 Jun 28 11:54 . drwxr-xr-x 3 root root 0 Jun 28 11:54 .. -r--r----- 1 root root 0 Jun 28 11:54 736870e5-84f0-4973-92ec-06879ce3da0b -r--r----- 1 root root 0 Jun 28 11:54 83c83f7f-1356-4975-8b7e-d3a0b54312c6 -r--r----- 1 root root 0 Jun 28 11:54 9553f55d-3da2-43ee-ab5d-ff17f78864d2 -r--r----- 1 root root 0 Jun 28 11:54 e6f5a162-d67f-4750-a67c-5d065f2a9910 # xxd /sys/kernel/security/coco/efi_secret/e6f5a162-d67f-4750-a67c-5d065f2a9910 00000000: 7468 6573 652d 6172 652d 7468 652d 6b61 these-are-the-ka 00000010: 7461 2d73 6563 7265 7473 0001 0203 0405 ta-secrets...... 00000020: 0607 .. # rm /sys/kernel/security/coco/efi_secret/e6f5a162-d67f-4750-a67c-5d065f2a9910 # ls -la /sys/kernel/security/coco/efi_secret total 0 drwxr-xr-x 2 root root 0 Jun 28 11:55 . drwxr-xr-x 3 root root 0 Jun 28 11:54 .. -r--r----- 1 root root 0 Jun 28 11:54 736870e5-84f0-4973-92ec-06879ce3da0b -r--r----- 1 root root 0 Jun 28 11:54 83c83f7f-1356-4975-8b7e-d3a0b54312c6 -r--r----- 1 root root 0 Jun 28 11:54 9553f55d-3da2-43ee-ab5d-ff17f78864d2 [1] https://github.com/tianocore/edk2/commit/01726b6d23d4 --- v4 changes: - Guard all the new EFI and efi-stub code (patches 1+2) with #ifdef CONFIG_EFI_COCO_SECRET (thanks Greg KH). Selecting CONFIG_EFI_SECRET=m (patch 3) will enable the EFI parts as well. - Guard call to clflush_cache_range() with #ifdef CONFIG_X86 (Reported-by: kernel test robot ) v3: https://lore.kernel.org/linux-coco/20211014130848.592611-1-dovmurik@linux.ibm.com/ v3 changes: - Rename the module to efi_secret - Remove the exporting of clean_cache_range - Use clflush_cache_range in wipe_memory - Document function wipe_memory - Initialize efi.coco_secret to EFI_INVALID_TABLE_ADDR to correctly detect when there's no secret area published in the EFI configuration tables v2: https://lore.kernel.org/linux-coco/20211007061838.1381129-1-dovmurik@linux.ibm.com v2 changes: - Export clean_cache_range() - When deleteing a secret, call clean_cache_range() after explicit_memzero - Add Documentation/ABI/testing/securityfs-coco-sev_secret v1: https://lore.kernel.org/linux-coco/20210809190157.279332-1-dovmurik@linux.ibm.com/ RFC: https://lore.kernel.org/linux-coco/20210628183431.953934-1-dovmurik@linux.ibm.com/ Dov Murik (3): efi/libstub: Copy confidential computing secret area efi: Reserve confidential computing secret area virt: Add efi_secret module to expose confidential computing secrets .../ABI/testing/securityfs-coco-efi_secret | 50 +++ arch/x86/platform/efi/efi.c | 3 + drivers/firmware/efi/Kconfig | 12 + drivers/firmware/efi/Makefile | 1 + drivers/firmware/efi/coco.c | 41 +++ drivers/firmware/efi/efi.c | 8 + drivers/firmware/efi/libstub/Makefile | 1 + drivers/firmware/efi/libstub/coco.c | 68 ++++ drivers/firmware/efi/libstub/efi-stub.c | 2 + drivers/firmware/efi/libstub/efistub.h | 6 + drivers/firmware/efi/libstub/x86-stub.c | 2 + drivers/virt/Kconfig | 3 + drivers/virt/Makefile | 1 + drivers/virt/coco/efi_secret/Kconfig | 11 + drivers/virt/coco/efi_secret/Makefile | 2 + drivers/virt/coco/efi_secret/efi_secret.c | 326 ++++++++++++++++++ include/linux/efi.h | 16 + 17 files changed, 553 insertions(+) create mode 100644 Documentation/ABI/testing/securityfs-coco-efi_secret create mode 100644 drivers/firmware/efi/coco.c create mode 100644 drivers/firmware/efi/libstub/coco.c create mode 100644 drivers/virt/coco/efi_secret/Kconfig create mode 100644 drivers/virt/coco/efi_secret/Makefile create mode 100644 drivers/virt/coco/efi_secret/efi_secret.c base-commit: 348949d9a4440abdab3b1dc99a9bb660e8c7da7c -- 2.25.1