Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1231993 > unrolled thread
| Started by | Ingo Molnar <mingo@kernel.org> |
|---|---|
| First post | 2015-09-24 12:00 +0200 |
| Last post | 2015-10-03 10:20 +0200 |
| Articles | 8 on this page of 28 — 6 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
Re: [PATCH 26/26] x86, pkeys: Documentation Ingo Molnar <mingo@kernel.org> - 2015-09-24 12:00 +0200
Re: [PATCH 26/26] x86, pkeys: Documentation Andy Lutomirski <luto@amacapital.net> - 2015-09-24 21:20 +0200
Re: [PATCH 26/26] x86, pkeys: Documentation Ingo Molnar <mingo@kernel.org> - 2015-09-25 09:20 +0200
Re: [PATCH 26/26] x86, pkeys: Documentation Dave Hansen <dave@sr71.net> - 2015-09-24 21:20 +0200
Re: [PATCH 26/26] x86, pkeys: Documentation Ingo Molnar <mingo@kernel.org> - 2015-09-25 08:20 +0200
Re: [PATCH 26/26] x86, pkeys: Documentation Ingo Molnar <mingo@kernel.org> - 2015-10-01 13:20 +0200
Re: [PATCH 26/26] x86, pkeys: Documentation Kees Cook <keescook@google.com> - 2015-10-01 22:40 +0200
Re: [PATCH 26/26] x86, pkeys: Documentation Andy Lutomirski <luto@amacapital.net> - 2015-10-01 22:50 +0200
Re: [PATCH 26/26] x86, pkeys: Documentation Ingo Molnar <mingo@kernel.org> - 2015-10-02 08:30 +0200
Re: [PATCH 26/26] x86, pkeys: Documentation Dave Hansen <dave@sr71.net> - 2015-10-02 20:00 +0200
Re: [PATCH 26/26] x86, pkeys: Documentation Ingo Molnar <mingo@kernel.org> - 2015-10-03 09:30 +0200
Re: [PATCH 26/26] x86, pkeys: Documentation Dave Hansen <dave@sr71.net> - 2015-10-01 23:00 +0200
Re: [PATCH 26/26] x86, pkeys: Documentation Dave Hansen <dave@sr71.net> - 2015-10-02 00:40 +0200
Re: [PATCH 26/26] x86, pkeys: Documentation Dave Hansen <dave@sr71.net> - 2015-10-02 00:40 +0200
Re: [PATCH 26/26] x86, pkeys: Documentation Kees Cook <keescook@google.com> - 2015-10-02 00:40 +0200
Re: [PATCH 26/26] x86, pkeys: Documentation Linus Torvalds <torvalds@linux-foundation.org> - 2015-10-02 00:50 +0200
Re: [PATCH 26/26] x86, pkeys: Documentation Dave Hansen <dave@sr71.net> - 2015-10-02 01:00 +0200
Re: [PATCH 26/26] x86, pkeys: Documentation Linus Torvalds <torvalds@linux-foundation.org> - 2015-10-02 03:40 +0200
Re: [PATCH 26/26] x86, pkeys: Documentation Dave Hansen <dave@sr71.net> - 2015-10-02 20:10 +0200
Re: [PATCH 26/26] x86, pkeys: Documentation Ingo Molnar <mingo@kernel.org> - 2015-10-02 09:10 +0200
Re: [PATCH 26/26] x86, pkeys: Documentation Ingo Molnar <mingo@kernel.org> - 2015-10-03 09:00 +0200
Re: [PATCH 26/26] x86, pkeys: Documentation Paolo Bonzini <pbonzini@redhat.com> - 2015-10-02 13:50 +0200
Re: [PATCH 26/26] x86, pkeys: Documentation Linus Torvalds <torvalds@linux-foundation.org> - 2015-10-02 14:00 +0200
Re: [PATCH 26/26] x86, pkeys: Documentation Paolo Bonzini <pbonzini@redhat.com> - 2015-10-02 14:20 +0200
Re: [PATCH 26/26] x86, pkeys: Documentation Ingo Molnar <mingo@kernel.org> - 2015-10-03 08:50 +0200
Re: [PATCH 26/26] x86, pkeys: Documentation Andy Lutomirski <luto@amacapital.net> - 2015-10-02 01:00 +0200
Re: [PATCH 26/26] x86, pkeys: Documentation Ingo Molnar <mingo@kernel.org> - 2015-10-02 08:10 +0200
Re: [PATCH 26/26] x86, pkeys: Documentation Ingo Molnar <mingo@kernel.org> - 2015-10-03 10:20 +0200
Page 2 of 2 — ← Prev page 1 [2]
| From | Ingo Molnar <mingo@kernel.org> |
|---|---|
| Date | 2015-10-03 09:00 +0200 |
| Message-ID | <qfoXw-2Gd-3@gated-at.bofh.it> |
| In reply to | #1237992 |
* Ingo Molnar <mingo@kernel.org> wrote: > > It's quite likely that you will find that compilers put read-only constants in > > the text section, knowing that executable means readable. > > At least with pkeys enabling true --x mappings, that compiler practice becomes a > (mild) security problem: it provides a readable and executable return target for > stack/buffer overflow attacks - FWIIW. (It's a limited concern because the true > code areas are executable already.) Btw., it's not just security, there will also a robustness advantage to creating true PROT_EXEC mappings: right now if buggy user-space code accidentally references into an executable section: say uses a negative index in a table put into .rodata, the code will not crash, it will happily read from the .text area. But if we mapped .text with true PROT_EXEC (and the CPU enforced that) then we'd get a nice segfault. This has additional security benefits as well, beyond not providing readable ROP sites - which in fact look more significant than the ROP readability angle I mentioned initially. So to sum it up, if we use true --x (non-readable PROT_EXEC) mappings using pkeys, we get the following benefits: - Overflows and other out of bounds accesses from .rodata (and other data sections near .text) will be caught by the CPU instead of silent data flow corruption. This has robustness (and thus security) advantages. - True --x code is not readable, thus not 'soft-discoverable' via information leaks for ROP purposes. - The version fingerprinting of unknown remote target binaries via information leaks becomes harder as well. - The local (and remote) guessing of ASLR offsets via information leaks gets harder as well. - We get to test pkeys much more seriously than the opt-in special uses! :-) Intel sent me pkeys test hardware, so I can give it a go in practice as well and see how well it works. Thanks, Ingo -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Paolo Bonzini <pbonzini@redhat.com> |
|---|---|
| Date | 2015-10-02 13:50 +0200 |
| Message-ID | <qf70B-2hB-17@gated-at.bofh.it> |
| In reply to | #1237809 |
On 02/10/2015 00:48, Linus Torvalds wrote: > It's quite likely that you will find that compilers put read-only > constants in the text section, knowing that executable means readable. Not on x86 (because it has large immediates; RISC machines and s390 do put large constants in the text section). But at the very least jump tables reside in the .text seection. Paolo -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Linus Torvalds <torvalds@linux-foundation.org> |
|---|---|
| Date | 2015-10-02 14:00 +0200 |
| Message-ID | <qf7ai-2sW-13@gated-at.bofh.it> |
| In reply to | #1238140 |
On Fri, Oct 2, 2015 at 7:49 AM, Paolo Bonzini <pbonzini@redhat.com> wrote:
> On 02/10/2015 00:48, Linus Torvalds wrote:
>> It's quite likely that you will find that compilers put read-only
>> constants in the text section, knowing that executable means readable.
>
> Not on x86 (because it has large immediates; RISC machines and s390 do
> put large constants in the text section).
>
> But at the very least jump tables reside in the .text seection.
Yes, at least traditionally gcc put things like the jump tables for
switch() statements immediately next to the code. That caused lots of
pain on the P4, where the L1 I$ and D$ were exclusive. I think that
caused gcc to then put the jump tables further away, and it might be
in a separate section these days - but it might also just be
"sufficiently aligned" that the L1 cache issue isn't in play any more.
Anyway, because of the P4 exclusive L1 I/D$ issue we can pretty much
rest easy knowing that the data accesses and text accesses should be
separated by at least one cacheline (maybe even 128 bytes - I think
the L4 used 64-byte line size, but it was sub-sections of a 128-byte
bigger line - but that might have been in the L2 only).
But I could easily see the compiler/linker still putting them in the
same ELF segment.
Linus
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Paolo Bonzini <pbonzini@redhat.com> |
|---|---|
| Date | 2015-10-02 14:20 +0200 |
| Message-ID | <qf7tE-351-19@gated-at.bofh.it> |
| In reply to | #1238143 |
On 02/10/2015 13:58, Linus Torvalds wrote:
> On Fri, Oct 2, 2015 at 7:49 AM, Paolo Bonzini <pbonzini@redhat.com> wrote:
>> On 02/10/2015 00:48, Linus Torvalds wrote:
>>> It's quite likely that you will find that compilers put read-only
>>> constants in the text section, knowing that executable means readable.
>>
>> Not on x86 (because it has large immediates; RISC machines and s390 do
>> put large constants in the text section).
>>
>> But at the very least jump tables reside in the .text seection.
>
> Yes, at least traditionally gcc put things like the jump tables for
> switch() statements immediately next to the code. That caused lots of
> pain on the P4, where the L1 I$ and D$ were exclusive. I think that
> caused gcc to then put the jump tables further away, and it might be
> in a separate section these days - but it might also just be
> "sufficiently aligned" that the L1 cache issue isn't in play any more.
>
> Anyway, because of the P4 exclusive L1 I/D$ issue we can pretty much
> rest easy knowing that the data accesses and text accesses should be
> separated by at least one cacheline (maybe even 128 bytes - I think
> the L4 used 64-byte line size, but it was sub-sections of a 128-byte
> bigger line - but that might have been in the L2 only).
>
> But I could easily see the compiler/linker still putting them in the
> same ELF segment.
You're entirely right, it puts them in .rodata actually. But .rodata is
in the same segment as .text:
$ readelf --segments /bin/true
...
Section to Segment mapping:
Segment Sections...
00
01 .interp
02 .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym
.dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init
.plt .text .fini .rodata .eh_frame_hdr .eh_frame
03 .init_array .fini_array .jcr .data.rel.ro .dynamic .got .data .bss
04 .dynamic
05 .note.ABI-tag .note.gnu.build-id
06 .eh_frame_hdr
07
08 .init_array .fini_array .jcr .data.rel.ro .dynamic .got
Paolo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Ingo Molnar <mingo@kernel.org> |
|---|---|
| Date | 2015-10-03 08:50 +0200 |
| Message-ID | <qfoNQ-2uQ-5@gated-at.bofh.it> |
| In reply to | #1238156 |
* Paolo Bonzini <pbonzini@redhat.com> wrote:
>
>
> On 02/10/2015 13:58, Linus Torvalds wrote:
> > On Fri, Oct 2, 2015 at 7:49 AM, Paolo Bonzini <pbonzini@redhat.com> wrote:
> >> On 02/10/2015 00:48, Linus Torvalds wrote:
> >>> It's quite likely that you will find that compilers put read-only
> >>> constants in the text section, knowing that executable means readable.
> >>
> >> Not on x86 (because it has large immediates; RISC machines and s390 do
> >> put large constants in the text section).
> >>
> >> But at the very least jump tables reside in the .text seection.
> >
> > Yes, at least traditionally gcc put things like the jump tables for
> > switch() statements immediately next to the code. That caused lots of
> > pain on the P4, where the L1 I$ and D$ were exclusive. I think that
> > caused gcc to then put the jump tables further away, and it might be
> > in a separate section these days - but it might also just be
> > "sufficiently aligned" that the L1 cache issue isn't in play any more.
> >
> > Anyway, because of the P4 exclusive L1 I/D$ issue we can pretty much
> > rest easy knowing that the data accesses and text accesses should be
> > separated by at least one cacheline (maybe even 128 bytes - I think
> > the L4 used 64-byte line size, but it was sub-sections of a 128-byte
> > bigger line - but that might have been in the L2 only).
> >
> > But I could easily see the compiler/linker still putting them in the
> > same ELF segment.
>
> You're entirely right, it puts them in .rodata actually. But .rodata is
> in the same segment as .text:
>
> $ readelf --segments /bin/true
> ...
> Section to Segment mapping:
> Segment Sections...
> 00
> 01 .interp
> 02 .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym
> .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init
> .plt .text .fini .rodata .eh_frame_hdr .eh_frame
> 03 .init_array .fini_array .jcr .data.rel.ro .dynamic .got .data .bss
> 04 .dynamic
> 05 .note.ABI-tag .note.gnu.build-id
> 06 .eh_frame_hdr
> 07
> 08 .init_array .fini_array .jcr .data.rel.ro .dynamic .got
Is there an easy(-ish) way (i.e. using compiler/linker flags, not linker scripts)
to build the ELF binary in such a way so that non-code data:
.rodata .eh_frame_hdr .eh_frame
... gets put into a separate (readonly and non-executable) segment? That would
enable things from the distro side AFAICS, right?
(assuming I'm reading the ELF dump right.)
Or does this need binutils surgery?
Thanks,
Ingo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Andy Lutomirski <luto@amacapital.net> |
|---|---|
| Date | 2015-10-02 01:00 +0200 |
| Message-ID | <qeUZs-1Mq-17@gated-at.bofh.it> |
| In reply to | #1237804 |
On Thu, Oct 1, 2015 at 3:33 PM, Dave Hansen <dave@sr71.net> wrote: > On 10/01/2015 01:39 PM, Kees Cook wrote: >> On Thu, Oct 1, 2015 at 4:17 AM, Ingo Molnar <mingo@kernel.org> wrote: >>> So could we try to add an (opt-in) kernel option that enables this transparently >>> and automatically for all PROT_EXEC && !PROT_WRITE mappings, without any >>> user-space changes and syscalls necessary? >> >> I would like this very much. :) > > Here it is in a quite fugly form (well, it's not opt-in). Init crashes > if I boot with this, though. Somebody really ought to rework things so that a crash in init prints out a normal indication of the unhandled signal and optionally leaves everything else running. Also... EPT seems to have separate R, W, and X flags. I wonder if it would make sense to add a KVM paravirt feature that maps the entire guest physical space an extra time at a monstrous offset with R cleared in the EPT and passes through a #PF or other notification (KVM-specific thing? #VE?) on a read fault. This wouldn't even need a whole duplicate paging hierarchy -- it would just duplicate the EPT PML4 entries, so it would add exactly zero runtime memory usage. The guest would use it by treating the high bit of the physical address as a "may read" bit. This reminds me -- we should probably wire up X86_TRAP_VE with a stub that OOPSes until someone figures out some more useful thing to do. We're probably not doing anyone any favors by unconditionally promoting them to double-faults. --Andy -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Ingo Molnar <mingo@kernel.org> |
|---|---|
| Date | 2015-10-02 08:10 +0200 |
| Message-ID | <qf1Hz-3iC-3@gated-at.bofh.it> |
| In reply to | #1237804 |
* Dave Hansen <dave@sr71.net> wrote:
> On 10/01/2015 01:39 PM, Kees Cook wrote:
> > On Thu, Oct 1, 2015 at 4:17 AM, Ingo Molnar <mingo@kernel.org> wrote:
> >> So could we try to add an (opt-in) kernel option that enables this transparently
> >> and automatically for all PROT_EXEC && !PROT_WRITE mappings, without any
> >> user-space changes and syscalls necessary?
> >
> > I would like this very much. :)
>
> Here it is in a quite fugly form (well, it's not opt-in). Init crashes
> if I boot with this, though.
>
> I'll see if I can turn it in to a bit more of an opt-in and see what's
> actually going wrong.
So the reality of modern Linux distros is that, according to some limited
strace-ing around, pure PROT_EXEC usage does not seem to exist: 99% of executable
mappings are mapped via PROT_EXEC|PROT_READ.
So the most usable kernel testing approach would be to enable these types of pkeys
for a child task via some mechanism and inherit it to all children (including
inheriting it over non-suid exec) - but not to any other task.
You could hijack a new personality bit just for debug purposes - see the (totally
untested) patch below.
Depending on user-space's assumptions it might not end up being anything usable we
can apply, but it would be a great testing tool if it worked to a certain degree.
I.e. allow the system to boot in without pkeys set for any task, then set the
personality of a shell process to PER_LINUX_PKEYS and see which binaries (if any!)
will start up without segfaulting.
This way you don't have to debug SystemD, which is extremely fragile and
passive-aggressive towards kernels that don't behave in precisely the fashion
under which SystemD is being developed.
Thanks,
Ingo
========>
Absolutely-Not-Signed-off-by: Ingo Molnar <mingo@kernel.org>
include/uapi/linux/personality.h | 2 ++
1 file changed, 2 insertions(+)
diff --git a/include/uapi/linux/personality.h b/include/uapi/linux/personality.h
index aa169c4339d2..bead47213419 100644
--- a/include/uapi/linux/personality.h
+++ b/include/uapi/linux/personality.h
@@ -8,6 +8,7 @@
* These occupy the top three bytes.
*/
enum {
+ PROT_READ_EXEC_HACK = 0x0010000, /* PROT_READ|PROT_EXEC == PROT_EXEC hack */
UNAME26 = 0x0020000,
ADDR_NO_RANDOMIZE = 0x0040000, /* disable randomization of VA space */
FDPIC_FUNCPTRS = 0x0080000, /* userspace function ptrs point to descriptors
@@ -41,6 +42,7 @@ enum {
enum {
PER_LINUX = 0x0000,
PER_LINUX_32BIT = 0x0000 | ADDR_LIMIT_32BIT,
+ PER_LINUX_PKEYS = 0x0000 | PROT_READ_EXEC_HACK,
PER_LINUX_FDPIC = 0x0000 | FDPIC_FUNCPTRS,
PER_SVR4 = 0x0001 | STICKY_TIMEOUTS | MMAP_PAGE_ZERO,
PER_SVR3 = 0x0002 | STICKY_TIMEOUTS | SHORT_INODE,
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Ingo Molnar <mingo@kernel.org> |
|---|---|
| Date | 2015-10-03 10:20 +0200 |
| Message-ID | <qfqcV-4Ce-5@gated-at.bofh.it> |
| In reply to | #1231993 |
* Ingo Molnar <mingo@kernel.org> wrote: > > * Dave Hansen <dave@sr71.net> wrote: > > > > Another question, related to enumeration as well: I'm wondering whether > > > there's any way for the kernel to allocate a bit or two for its own purposes - > > > such as protecting crypto keys? Or is the facility fundamentally intended for > > > user-space use only? > > > > No, that's not possible with the current setup. > > Ok, then another question, have you considered the following usecase: So, I'm wondering about the following additional usecase: Right now the native x86 PTE format allows two protection related bits for user-space pages: _PAGE_BIT_RW: if 0 the page is read-only, if 1 then it's read-write _PAGE_BIT_NX: if 0 the page is executable, if 1 then it's not executable As discussed previously, pkeys allows 'true execute only (--x)' mappings. Another possibility would be 'true write-only (-w-)' mappings. This too could in theory be introduced 'transparently', via 'pure PROT_WRITE' mappings (i.e. no PROT_READ|PROT_EXEC bits set). Assuming the amount of user-space with implicit 'PROT_WRITE implies PROT_READ' assumptions is not unmanageble for a distro willing to try this. Usage of this would be more limited than of pure PROT_EXEC mappings, but it's a nonzero set: - Write-only log buffers that are normally mmap()-ed from a file. - Write-only write() IO buffers that are only accessed via write(). (kernel-space accesses ignore pkey values.) glibc's buffered IO might possibly make use of this, for write-only fopen()ed files. - Language runtimes could improve their security by eliminating W+X mappings of JIT-ed code, instead they could use two alias mappings: one alias is a true-exec (--x) mapping, the other (separately mapped, separately randomized) mapping is a true write-only (--x) mapping for generated code. In addition to the security advantage, another advantage would be increased robustness: no accidental corruption of IO (or JIT) buffers via read-only codepaths. Another advantage would be that it would utilize pkeys without having to teach applications to use new system calls. Thanks, Ingo -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [standalone]
Page 2 of 2 — ← Prev page 1 [2]
Back to top | Article view | linux.kernel
csiph-web