Received: by 2002:a05:6a10:9afc:0:0:0:0 with SMTP id t28csp1537327pxm; Thu, 3 Mar 2022 21:10:50 -0800 (PST) X-Google-Smtp-Source: ABdhPJxFAhzU+21Ibzqff8yqkkIEdkbSJ0I8yVPANwpjepJK8EAt6gvzo4eycPiCL54sj2DyJCOs X-Received: by 2002:a05:6a00:24c7:b0:4e1:cb76:32d1 with SMTP id d7-20020a056a0024c700b004e1cb7632d1mr41514187pfv.36.1646370650611; Thu, 03 Mar 2022 21:10:50 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1646370650; cv=none; d=google.com; s=arc-20160816; b=HbvM8HytA1umxGCbrs1/2+asxETPejIn/XVwXwm85LE33wPo5j1syD2MbXppmTjKAQ sQOEUtcKh20mmXg0CrmmKSEjBhHrLspIFB9Zw389GCFzsRCJCGgqeQbHIfbn50qSV/CG dntMISc2f/MLvJBv0hW3kO15uQu7ybQvHPREegmDOxVXAOAgJfoBifBRTy6uH+u3HpJq yLaI/PnQCb0eedEQW9Fb2wkumhsUWTzcBH2KnQ2p4rkboRE2qQM6inbLykxiQK1wWms1 YE/vQyAY5jII1j1CcTh25VEjGZ7myX+8PHqCl/kINdZb4f6h1XdCl0smPRMq1qcrxhL5 PZrQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=bHsuBgZLJvDgSwoQabWORDHFKZHFRYZ1VL/wgnTYbHI=; b=vffeofJe9c6xTwlMmQCCZSgCP49yi8op7etlc/cQNk/3NVmW5yDT6ybOFgSNPytrl6 jrKwlX2AMEpk/nwSW8y9kLmTh5b+l/ZMNDu4hfat6CPbBIeHTf1AfnAUonMhFy12hxeX 7iWcFrnDNKB6XtF9Szkr5sFmg6v+07Gi1g1Cws9M6ofnOMquF25ZuGmwJFHjsb/u688M cw422AOdpTBozp+CoP0CdZXRv3yiD20z1F5LaUoL7+24NENb19CdDc6gRO8ZUJC1P/2L B57QU89msRmv7xVL771tiTmih73M7jh5NKHDeu1Ml2smNLjzw+PrS2S5pCMvXcuTJeZh xXew== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=AaBI9AYw; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id f12-20020a631f0c000000b003706482437dsi3936398pgf.441.2022.03.03.21.10.33; Thu, 03 Mar 2022 21:10:50 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=AaBI9AYw; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237111AbiCCXBo (ORCPT + 99 others); Thu, 3 Mar 2022 18:01:44 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51228 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235214AbiCCXBn (ORCPT ); Thu, 3 Mar 2022 18:01:43 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7D0D0F11B3 for ; Thu, 3 Mar 2022 15:00:56 -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 34110B82705 for ; Thu, 3 Mar 2022 23:00:55 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id EEC74C36AE3 for ; Thu, 3 Mar 2022 23:00:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1646348454; bh=FYI/8Y1WBT4HzXcUE12f554+O6V/H3p/NTj/MzLSdWk=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=AaBI9AYw916fHkP785EPyd6XN6s82z+R0fFDnP9fobA0gvyDhBlqs3qog090AVa9y TWkNoUQqJ93BKn9nmLd1WobCqhG9vUZKAq25uJ0l3WGcjFqyjAew7meOXiPlFVtszd GE4+nWJBWtU8yAl4a3flehl7ViFn2l6Dn7KJOTxJotdj8sTfoDg3mH5pi5MD4j+ugH R6tGFYy9jCh3F3Wbq5vNAO60/pvo/2UHK/A2fnzxmQesAWR1pgBv9jCW/5w8aw0OUY nZTkZsYt3gjCylySGxJ3hp8HkXCWbXiX9qsFxe9cNkuB1L2WzxlA0hpP1coW6hd1VT cp/XrBfXfjJMA== Received: by mail-lj1-f175.google.com with SMTP id o6so8781312ljp.3 for ; Thu, 03 Mar 2022 15:00:53 -0800 (PST) X-Gm-Message-State: AOAM532Bx90atr2PcdLtnJeYVwi2gc1jiOsog4FbJ6YDH3DE1ggn/tw5 U9oZd5ubksk0lP2Y3nnms/IzPz46tV0ixfYmpjpn/w== X-Received: by 2002:a05:6402:2c6:b0:415:b06c:de71 with SMTP id b6-20020a05640202c600b00415b06cde71mr11466619edx.50.1646348441080; Thu, 03 Mar 2022 15:00:41 -0800 (PST) MIME-Version: 1.0 References: <357664de-b089-4617-99d1-de5098953c80@www.fastmail.com> <8e36f20723ca175db49ed3cc73e42e8aa28d2615.camel@intel.com> <9d664c91-2116-42cc-ef8d-e6d236de43d0@kernel.org> <5a792e77-0072-4ded-9f89-e7fcc7f7a1d6@www.fastmail.com> <05df964f-552e-402e-981c-a8bea11c555c@www.fastmail.com> In-Reply-To: From: Andy Lutomirski Date: Thu, 3 Mar 2022 15:00:29 -0800 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH 00/35] Shadow stacks for userspace To: Mike Rapoport Cc: Andy Lutomirski , Rick P Edgecombe , Cyrill Gorcunov , Balbir Singh , "H. Peter Anvin" , Eugene Syromiatnikov , "Peter Zijlstra (Intel)" , Randy Dunlap , Kees Cook , Dmitry Safonov <0x7f454c46@gmail.com>, Dave Hansen , "Kirill A. Shutemov" , "Eranian, Stephane" , "linux-mm@kvack.org" , Adrian Reber , Florian Weimer , Nadav Amit , Jann Horn , Andrei Vagin , "linux-arch@vger.kernel.org" , "kcc@google.com" , Borislav Petkov , Oleg Nesterov , "H.J. Lu" , Pavel Machek , "linux-doc@vger.kernel.org" , Arnd Bergmann , "Moreira, Joao" , Thomas Gleixner , Mike Kravetz , "the arch/x86 maintainers" , Weijiang Yang , Dave Martin , "john.allen@amd.com" , Ingo Molnar , Dave Hansen , Jonathan Corbet , Linux Kernel Mailing List , Linux API , "Shankar, Ravi V" Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-7.5 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS,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 3, 2022 at 11:43 AM Mike Rapoport wrote: > > On Mon, Feb 28, 2022 at 02:55:30PM -0800, Andy Lutomirski wrote: > > > > > > On Mon, Feb 28, 2022, at 1:30 PM, Mike Rapoport wrote: > > > On Mon, Feb 28, 2022 at 12:30:41PM -0800, Andy Lutomirski wrote: > > >> > > >> > > >> On Mon, Feb 28, 2022, at 12:27 PM, Mike Rapoport wrote: > > >> > On Wed, Feb 09, 2022 at 06:37:53PM -0800, Andy Lutomirski wrote: > > >> >> On 2/8/22 18:18, Edgecombe, Rick P wrote: > > >> >> > On Tue, 2022-02-08 at 20:02 +0300, Cyrill Gorcunov wrote: > > >> >> > > > >> > > > >> > Even with the current shadow stack interface Rick proposed, CRIU can restore > > >> > the victim using ptrace without any additional knobs, but we loose an > > >> > important ability to "self-cure" the victim from the parasite in case > > >> > anything goes wrong with criu control process. > > >> > > > >> > Moreover, the issue with backward compatibility is not with ptrace but with > > >> > sigreturn and it seems that criu is not its only user. > > >> > > >> So we need an ability for a tracer to cause the tracee to call a function > > >> and to return successfully. Apparently a gdb branch can already do this > > >> with shstk, and my PTRACE_CALL_FUNCTION_SIGFRAME should also do the > > >> trick. I don't see why we need a sigretur-but-dont-verify -- we just > > >> need this mechanism to create a frame such that sigreturn actually works. > > > > > > If I understand correctly, PTRACE_CALL_FUNCTION_SIGFRAME() injects a frame > > > into the tracee and makes the tracee call sigreturn. > > > I.e. the tracee is stopped and this is used pretty much as PTRACE_CONT or > > > PTRACE_SYSCALL. > > > > > > In such case this defeats the purpose of sigreturn in CRIU because it is > > > called asynchronously by the tracee when the tracer is about to detach or > > > even already detached. > > > > The intent of PTRACE_CALL_FUNCTION_SIGFRAME is push a signal frame onto > > the stack and call a function. That function should then be able to call > > sigreturn just like any normal signal handler. > > Ok, let me reiterate. > > We have a seized and stopped tracee, use PTRACE_CALL_FUNCTION_SIGFRAME > to push a signal frame onto the tracee's stack so that sigreturn could use > that frame, then set the tracee %rip to the function we'd like to call and > then we PTRACE_CONT the tracee. Tracee continues to execute the parasite > code that calls sigreturn to clean up and restore the tracee process. > > PTRACE_CALL_FUNCTION_SIGFRAME also pushes a restore token to the shadow > stack, just like setup_rt_frame() does, so that sys_rt_sigreturn() won't > bail out at restore_signal_shadow_stack(). That is the intent. > > The only thing that CRIU actually needs is to push a restore token to the > shadow stack, so for us a ptrace call that does that would be ideal. > That seems fine too. The main benefit of the SIGFRAME approach is that, AIUI, CRIU eventually constructs a signal frame anyway, and getting one ready-made seems plausibly helpful. But if it's not actually that useful, then there's no need to do it.