From: Ingo Molnar <mingo@kernel.org>
To: Andy Lutomirski <luto@kernel.org>
Cc: Mike Rapoport <rppt@linux.ibm.com>,
LKML <linux-kernel@vger.kernel.org>,
Alexandre Chartre <alexandre.chartre@oracle.com>,
Borislav Petkov <bp@alien8.de>,
Dave Hansen <dave.hansen@linux.intel.com>,
"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@redhat.com>,
James Bottomley <James.Bottomley@hansenpartnership.com>,
Jonathan Adams <jwadams@google.com>,
Kees Cook <keescook@chromium.org>, Paul Turner <pjt@google.com>,
Peter Zijlstra <peterz@infradead.org>,
Thomas Gleixner <tglx@linutronix.de>,
Linux-MM <linux-mm@kvack.org>,
LSM List <linux-security-module@vger.kernel.org>,
X86 ML <x86@kernel.org>,
Linus Torvalds <torvalds@linux-foundation.org>,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [RFC PATCH 2/7] x86/sci: add core implementation for system call isolation
Date: Sat, 27 Apr 2019 12:46:15 +0200 [thread overview]
Message-ID: <20190427104615.GA55518@gmail.com> (raw)
In-Reply-To: <20190427084752.GA99668@gmail.com>
* Ingo Molnar <mingo@kernel.org> wrote:
> * Andy Lutomirski <luto@kernel.org> wrote:
>
> > > And no, I'm not arguing for Java or C#, but I am arguing for a saner
> > > version of C.
> >
> > IMO three are three credible choices:
> >
> > 1. C with fairly strong CFI protection. Grsecurity has this (supposedly
> > — there’s a distinct lack of source code available), and clang is
> > gradually working on it.
> >
> > 2. A safe language for parts of the kernel, e.g. drivers and maybe
> > eventually filesystems. Rust is probably the only credible candidate.
> > Actually creating a decent Rust wrapper around the core kernel
> > facilities would be quite a bit of work. Things like sysfs would be
> > interesting in Rust, since AFAIK few or even no drivers actually get
> > the locking fully correct. This means that naive users of the API
> > cannot port directly to safe Rust, because all the races won't compile
> > :)
> >
> > 3. A sandbox for parts of the kernel, e.g. drivers. The obvious
> > candidates are eBPF and WASM.
> >
> > #2 will give very good performance. #3 gives potentially stronger
> > protection against a sandboxed component corrupting the kernel overall,
> > but it gives much weaker protection against a sandboxed component
> > corrupting itself.
> >
> > In an ideal world, we could do #2 *and* #3. Drivers could, for
> > example, be written in a language like Rust, compiled to WASM, and run
> > in the kernel.
>
> So why not go for #1, which would still outperform #2/#3, right? Do we
> know what it would take, roughly, and how the runtime overhead looks
> like?
BTW., CFI protection is in essence a compiler (or hardware) technique to
detect stack frame or function pointer corruption after the fact.
So I'm wondering whether there's a 4th choice as well, which avoids
control flow corruption *before* it happens:
- A C language runtime that is a subset of current C syntax and
semantics used in the kernel, and which doesn't allow access outside
of existing objects and thus creates a strictly enforced separation
between memory used for data, and memory used for code and control
flow.
- This would involve, at minimum:
- tracking every type and object and its inherent length and valid
access patterns, and never losing track of its type.
- being a lot more organized about initialization, i.e. no
uninitialized variables/fields.
- being a lot more strict about type conversions and pointers in
general.
- ... and a metric ton of other details.
- If such a runtime could co-exist without big complications with
regular C kernel code then we could convert particular pieces of C
code into this safe-C runtime step by step, and would also allow the
compilation of a piece of code as regular C, or into the safe runtime.
- If a particular function can be formally proven to be safe, it can be
compiled as C - otherwise it would be compiled as safe-C.
- ... or something like this.
The advantage would be: data corruption could never be triggered by code
itself, if the compiler and runtime is correct. Return addresses and
stacks wouldn't have to be 'hardened' or 'checked', because they'd never
be corrupted in the first place. WX memory wouldn't be an issue as kernel
code could never jump into generated shell code or ROP gadgets.
The disadvantage: the overhead of managing this, and any loss of
flexibility on the kernel programming side.
Does this make sense, and if yes, does such a project exist already?
(And no, I don't mean Java or C#.)
Or would we in essence end up with a Java runtime, with C syntax?
Thanks,
Ingo
next prev parent reply other threads:[~2019-04-27 10:46 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-25 21:45 [RFC PATCH 0/7] x86: introduce system calls addess space isolation Mike Rapoport
2019-04-25 21:45 ` [RFC PATCH 1/7] x86/cpufeatures: add X86_FEATURE_SCI Mike Rapoport
2019-04-25 21:45 ` [RFC PATCH 2/7] x86/sci: add core implementation for system call isolation Mike Rapoport
2019-04-26 7:49 ` Peter Zijlstra
2019-04-28 5:45 ` Mike Rapoport
2019-04-26 8:31 ` Ingo Molnar
2019-04-26 9:58 ` Ingo Molnar
2019-04-26 21:26 ` Andy Lutomirski
2019-04-27 8:47 ` Ingo Molnar
2019-04-27 10:46 ` Ingo Molnar [this message]
2019-04-29 18:26 ` James Morris
2019-04-29 18:43 ` Andy Lutomirski
2019-04-29 18:46 ` Andy Lutomirski
2019-04-30 5:03 ` Ingo Molnar
2019-04-30 9:38 ` Peter Zijlstra
2019-04-30 11:05 ` Ingo Molnar
2019-05-02 11:35 ` Robert O'Callahan
2019-05-02 15:20 ` Ingo Molnar
2019-05-02 21:07 ` Robert O'Callahan
2019-04-26 14:44 ` James Bottomley
2019-04-26 14:46 ` Dave Hansen
2019-04-26 14:57 ` James Bottomley
2019-04-26 15:07 ` Andy Lutomirski
2019-04-26 15:19 ` James Bottomley
2019-04-26 17:40 ` Andy Lutomirski
2019-04-26 18:49 ` James Bottomley
2019-04-26 19:22 ` Andy Lutomirski
2019-04-25 21:45 ` [RFC PATCH 3/7] x86/entry/64: add infrastructure for switching to isolated syscall context Mike Rapoport
2019-04-25 21:45 ` [RFC PATCH 4/7] x86/sci: hook up isolated system call entry and exit Mike Rapoport
2019-04-25 21:45 ` [RFC PATCH 5/7] x86/mm/fault: hook up SCI verification Mike Rapoport
2019-04-26 7:42 ` Peter Zijlstra
2019-04-28 5:47 ` Mike Rapoport
2019-04-30 16:44 ` Andy Lutomirski
2019-05-01 5:39 ` Mike Rapoport
2019-04-25 21:45 ` [RFC PATCH 6/7] security: enable system call isolation in kernel config Mike Rapoport
2019-04-25 21:45 ` [RFC PATCH 7/7] sci: add example system calls to exercse SCI Mike Rapoport
2019-04-26 0:30 ` [RFC PATCH 0/7] x86: introduce system calls addess space isolation Andy Lutomirski
2019-04-26 8:07 ` Jiri Kosina
2019-04-28 6:01 ` Mike Rapoport
2019-04-26 14:41 ` Dave Hansen
2019-04-28 6:08 ` Mike Rapoport
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=20190427104615.GA55518@gmail.com \
--to=mingo@kernel.org \
--cc=James.Bottomley@hansenpartnership.com \
--cc=a.p.zijlstra@chello.nl \
--cc=akpm@linux-foundation.org \
--cc=alexandre.chartre@oracle.com \
--cc=bp@alien8.de \
--cc=dave.hansen@linux.intel.com \
--cc=hpa@zytor.com \
--cc=jwadams@google.com \
--cc=keescook@chromium.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-security-module@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=pjt@google.com \
--cc=rppt@linux.ibm.com \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--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).