From: Zong Li <zong.li@sifive.com>
To: Deepak Gupta <debug@rivosinc.com>
Cc: Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
Dave Hansen <dave.hansen@linux.intel.com>,
x86@kernel.org, "H. Peter Anvin" <hpa@zytor.com>,
Andrew Morton <akpm@linux-foundation.org>,
"Liam R. Howlett" <Liam.Howlett@oracle.com>,
Vlastimil Babka <vbabka@suse.cz>,
Lorenzo Stoakes <lorenzo.stoakes@oracle.com>,
Paul Walmsley <paul.walmsley@sifive.com>,
Palmer Dabbelt <palmer@dabbelt.com>,
Albert Ou <aou@eecs.berkeley.edu>,
Conor Dooley <conor@kernel.org>, Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Arnd Bergmann <arnd@arndb.de>,
Christian Brauner <brauner@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Oleg Nesterov <oleg@redhat.com>,
Eric Biederman <ebiederm@xmission.com>,
Kees Cook <kees@kernel.org>, Jonathan Corbet <corbet@lwn.net>,
Shuah Khan <shuah@kernel.org>,
linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org,
linux-mm@kvack.org, linux-riscv@lists.infradead.org,
devicetree@vger.kernel.org, linux-arch@vger.kernel.org,
linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org,
alistair.francis@wdc.com, richard.henderson@linaro.org,
jim.shu@sifive.com, andybnac@gmail.com, kito.cheng@sifive.com,
charlie@rivosinc.com, atishp@rivosinc.com, evan@rivosinc.com,
cleger@rivosinc.com, alexghiti@rivosinc.com,
samitolvanen@google.com, broonie@kernel.org,
rick.p.edgecombe@intel.com
Subject: Re: [PATCH 16/33] riscv/shstk: If needed allocate a new shadow stack on clone
Date: Tue, 8 Oct 2024 14:18:58 +0800 [thread overview]
Message-ID: <CANXhq0r611Hi7pohDGRXhvi2E_uOFjwLRDrqZcL2WdLHcs+oHA@mail.gmail.com> (raw)
In-Reply-To: <ZwTDonkiATv999sS@debug.ba.rivosinc.com>
On Tue, Oct 8, 2024 at 1:31 PM Deepak Gupta <debug@rivosinc.com> wrote:
>
> On Tue, Oct 08, 2024 at 01:16:17PM +0800, Zong Li wrote:
> >On Tue, Oct 8, 2024 at 7:30 AM Deepak Gupta <debug@rivosinc.com> wrote:
> >>
> >> On Mon, Oct 07, 2024 at 04:17:47PM +0800, Zong Li wrote:
> >> >On Wed, Oct 2, 2024 at 12:20 AM Deepak Gupta <debug@rivosinc.com> wrote:
> >> >>
> >> >> Userspace specifies CLONE_VM to share address space and spawn new thread.
> >> >> `clone` allow userspace to specify a new stack for new thread. However
> >> >> there is no way to specify new shadow stack base address without changing
> >> >> API. This patch allocates a new shadow stack whenever CLONE_VM is given.
> >> >>
> >> >> In case of CLONE_VFORK, parent is suspended until child finishes and thus
> >> >> can child use parent shadow stack. In case of !CLONE_VM, COW kicks in
> >> >> because entire address space is copied from parent to child.
> >> >>
> >> >> `clone3` is extensible and can provide mechanisms using which shadow stack
> >> >> as an input parameter can be provided. This is not settled yet and being
> >> >> extensively discussed on mailing list. Once that's settled, this commit
> >> >> will adapt to that.
> >> >>
> >> >> Signed-off-by: Deepak Gupta <debug@rivosinc.com>
> >> >> ---
> >> >> arch/riscv/include/asm/usercfi.h | 25 ++++++++
> >>
> >> ... snipped...
> >>
> >> >> +
> >> >> +/*
> >> >> + * This gets called during clone/clone3/fork. And is needed to allocate a shadow stack for
> >> >> + * cases where CLONE_VM is specified and thus a different stack is specified by user. We
> >> >> + * thus need a separate shadow stack too. How does separate shadow stack is specified by
> >> >> + * user is still being debated. Once that's settled, remove this part of the comment.
> >> >> + * This function simply returns 0 if shadow stack are not supported or if separate shadow
> >> >> + * stack allocation is not needed (like in case of !CLONE_VM)
> >> >> + */
> >> >> +unsigned long shstk_alloc_thread_stack(struct task_struct *tsk,
> >> >> + const struct kernel_clone_args *args)
> >> >> +{
> >> >> + unsigned long addr, size;
> >> >> +
> >> >> + /* If shadow stack is not supported, return 0 */
> >> >> + if (!cpu_supports_shadow_stack())
> >> >> + return 0;
> >> >> +
> >> >> + /*
> >> >> + * If shadow stack is not enabled on the new thread, skip any
> >> >> + * switch to a new shadow stack.
> >> >> + */
> >> >> + if (is_shstk_enabled(tsk))
> >> >
> >> >Hi Deepak,
> >> >Should it be '!' is_shstk_enabled(tsk)?
> >>
> >> Yes it is a bug. It seems like fork without CLONE_VM or with CLONE_VFORK, it was returning
> >> 0 anyways. And in the case of CLONE_VM (used by pthread), it was not doing the right thing.
> >
> >Hi Deepak,
> >I'd like to know if I understand correctly. Could I know whether there
> >might also be a risk when the user program doesn't enable the CFI and
> >the kernel doesn't activate CFI. Because this flow will still try to
> >allocate the shadow stack and execute the ssamowap command. Thanks
>
> `shstk_alloc_thread_stack` is only called from `copy_thread` and allocates and
> returns non-zero (positive value) for ssp only if `CLONE_VM` is specified.
> `CLONE_VM` means that address space is shared and userspace has allocated
> separate stack. This flow is ensuring that newly created thread with separate
> data stack gets a separate shadow stack as well.
>
> Retruning zero value from `shstk_alloc_thread_stack` means that, no need to
> allocate a shadow stack. If you look at `copy_thread` function, it simply sets
> the returned ssp in newly created task's task_struct (if it was non-zero).
> If returned ssp was zero, `copy_thread` doesn't do anything. Thus whatever is
> current task settings are that will be copied over to new forked/cloned task.
> If current task had shadow stack enabled, new task will also get it enabled at
> same address (to be COWed later).
>
> Any task get shadow stack enabled for first time using new prctls (see prctl
> patches).
>
> So only time `ssamoswap` will be exercised will be are
> - User issues enabling `prctl` (it'll be issued from loader)
> - fork/clone happens
>
> In both cases, it is guarded against checks of whether cpu supports it and task
> has shadow stack enabled.
>
> Let me know if you think I missed any flow.
Thanks a lot for the detail, it is very helpful for me. But sorry for
the confusion, my question is actually on the situation with this bug
(i.e., before the fix)
>
> >
> >> Most of the testing has been with busybox build (independent binaries0 driven via buildroot
> >> setup. Wondering why it wasn't caught.
> >>
> >> Anyways, will fix it. Thanks for catching it.
> >>
> >> >
> >> >> + return 0;
> >> >> +
> >> >> + /*
next prev parent reply other threads:[~2024-10-08 6:19 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-01 16:06 [PATCH 00/33] riscv control-flow integrity for usermode Deepak Gupta
2024-10-01 16:06 ` [PATCH 01/33] mm: Introduce ARCH_HAS_USER_SHADOW_STACK Deepak Gupta
2024-10-01 16:06 ` [PATCH 02/33] mm: helper `is_shadow_stack_vma` to check shadow stack vma Deepak Gupta
2024-10-01 16:06 ` [PATCH 03/33] riscv: Enable cbo.zero only when all harts support Zicboz Deepak Gupta
2024-10-01 16:06 ` [PATCH 04/33] riscv: Add support for per-thread envcfg CSR values Deepak Gupta
2024-10-01 16:06 ` [PATCH 05/33] riscv: Call riscv_user_isa_enable() only on the boot hart Deepak Gupta
2024-10-01 16:06 ` [PATCH 06/33] riscv/Kconfig: enable HAVE_EXIT_THREAD for riscv Deepak Gupta
2024-10-01 16:06 ` [PATCH 07/33] riscv: zicfilp / zicfiss in dt-bindings (extensions.yaml) Deepak Gupta
2024-10-02 21:03 ` Rob Herring
2024-10-01 16:06 ` [PATCH 08/33] riscv: zicfiss / zicfilp enumeration Deepak Gupta
2024-10-01 16:06 ` [PATCH 09/33] riscv: zicfiss / zicfilp extension csr and bit definitions Deepak Gupta
2024-10-01 16:06 ` [PATCH 10/33] riscv: usercfi state for task and save/restore of CSR_SSP on trap entry/exit Deepak Gupta
2024-10-01 16:06 ` [PATCH 11/33] riscv/mm : ensure PROT_WRITE leads to VM_READ | VM_WRITE Deepak Gupta
2024-10-01 16:06 ` [PATCH 12/33] riscv mm: manufacture shadow stack pte Deepak Gupta
2024-10-01 16:06 ` [PATCH 13/33] riscv mmu: teach pte_mkwrite to manufacture shadow stack PTEs Deepak Gupta
2024-10-01 16:06 ` [PATCH 14/33] riscv mmu: write protect and shadow stack Deepak Gupta
2024-10-01 16:06 ` [PATCH 15/33] riscv/mm: Implement map_shadow_stack() syscall Deepak Gupta
2024-10-01 16:06 ` [PATCH 16/33] riscv/shstk: If needed allocate a new shadow stack on clone Deepak Gupta
2024-10-07 8:17 ` Zong Li
2024-10-07 23:30 ` Deepak Gupta
2024-10-08 5:16 ` Zong Li
2024-10-08 5:31 ` Deepak Gupta
2024-10-08 6:18 ` Zong Li [this message]
2024-10-08 6:27 ` Deepak Gupta
2024-10-01 16:06 ` [PATCH 17/33] prctl: arch-agnostic prctl for shadow stack Deepak Gupta
2024-10-01 16:15 ` Mark Brown
2024-10-01 21:46 ` Deepak Gupta
2024-10-01 16:06 ` [PATCH 18/33] prctl: arch-agnostic prctl for indirect branch tracking Deepak Gupta
2024-10-01 16:06 ` [PATCH 19/33] riscv: Implements arch agnostic shadow stack prctls Deepak Gupta
2024-10-01 16:06 ` [PATCH 20/33] riscv: Implements arch agnostic indirect branch tracking prctls Deepak Gupta
2024-10-01 16:06 ` [PATCH 21/33] riscv/traps: Introduce software check exception Deepak Gupta
2024-10-01 16:06 ` [PATCH 22/33] riscv: signal: abstract header saving for setup_sigcontext Deepak Gupta
2024-10-04 1:20 ` kernel test robot
2024-10-01 16:06 ` [PATCH 23/33] riscv signal: save and restore of shadow stack for signal Deepak Gupta
2024-10-01 16:06 ` [PATCH 24/33] riscv/kernel: update __show_regs to print shadow stack register Deepak Gupta
2024-10-01 16:06 ` [PATCH 25/33] riscv/ptrace: riscv cfi status and state via ptrace and in core files Deepak Gupta
2024-10-01 16:06 ` [PATCH 26/33] riscv/hwprobe: zicfilp / zicfiss enumeration in hwprobe Deepak Gupta
2024-10-01 16:06 ` [PATCH 27/33] riscv: Add Firmware Feature SBI extensions definitions Deepak Gupta
2024-10-01 16:06 ` [PATCH 28/33] riscv: enable kernel access to shadow stack memory via FWFT sbi call Deepak Gupta
2024-10-01 16:06 ` [PATCH 29/33] riscv: kernel command line option to opt out of user cfi Deepak Gupta
2024-10-01 16:06 ` [PATCH 30/33] riscv: create a config for shadow stack and landing pad instr support Deepak Gupta
2024-10-01 16:06 ` [PATCH 31/33] riscv: Documentation for landing pad / indirect branch tracking Deepak Gupta
2024-10-01 16:06 ` [PATCH 32/33] riscv: Documentation for shadow stack on riscv Deepak Gupta
2024-10-01 16:06 ` [PATCH 33/33] kselftest/riscv: kselftest for user mode cfi Deepak Gupta
2024-10-02 23:18 ` Shuah Khan
2024-10-03 11:03 ` Mark Brown
2024-10-03 23:04 ` Shuah Khan
2024-10-03 23:12 ` Edgecombe, Rick P
2024-10-04 18:59 ` Deepak Gupta
2024-10-06 13:29 ` [PATCH 00/33] riscv control-flow integrity for usermode patchwork-bot+linux-riscv
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CANXhq0r611Hi7pohDGRXhvi2E_uOFjwLRDrqZcL2WdLHcs+oHA@mail.gmail.com \
--to=zong.li@sifive.com \
--cc=Liam.Howlett@oracle.com \
--cc=akpm@linux-foundation.org \
--cc=alexghiti@rivosinc.com \
--cc=alistair.francis@wdc.com \
--cc=andybnac@gmail.com \
--cc=aou@eecs.berkeley.edu \
--cc=arnd@arndb.de \
--cc=atishp@rivosinc.com \
--cc=bp@alien8.de \
--cc=brauner@kernel.org \
--cc=broonie@kernel.org \
--cc=charlie@rivosinc.com \
--cc=cleger@rivosinc.com \
--cc=conor@kernel.org \
--cc=corbet@lwn.net \
--cc=dave.hansen@linux.intel.com \
--cc=debug@rivosinc.com \
--cc=devicetree@vger.kernel.org \
--cc=ebiederm@xmission.com \
--cc=evan@rivosinc.com \
--cc=hpa@zytor.com \
--cc=jim.shu@sifive.com \
--cc=kees@kernel.org \
--cc=kito.cheng@sifive.com \
--cc=krzk+dt@kernel.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-riscv@lists.infradead.org \
--cc=lorenzo.stoakes@oracle.com \
--cc=mingo@redhat.com \
--cc=oleg@redhat.com \
--cc=palmer@dabbelt.com \
--cc=paul.walmsley@sifive.com \
--cc=peterz@infradead.org \
--cc=richard.henderson@linaro.org \
--cc=rick.p.edgecombe@intel.com \
--cc=robh@kernel.org \
--cc=samitolvanen@google.com \
--cc=shuah@kernel.org \
--cc=tglx@linutronix.de \
--cc=vbabka@suse.cz \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).