Thread (12 messages) 12 messages, 5 authors, 2021-12-06

Re: CET/IBT support and live-patches

From: Miroslav Benes <mbenes@suse.cz>
Date: 2021-11-23 09:58:59

[ adding more CCs ]

On Mon, 22 Nov 2021, joao@overdrivepizza.com wrote:
Hi Miroslav, Petr and Nicolai,

Long time no talk, I hope you are all still doing great :)
Everything great here :)
So, we have been cooking a few patches for enabling Intel CET/IBT support in
the kernel. The way IBT works is -- whenever you have an indirect branch, the
control-flow must land in an endbr instruction. The idea is to constrain
control-flow in a way to make it harder for attackers to achieve meaningful
computation through pointer/memory corruption (as in, an attacker that can
corrupt a function pointer by exploiting a memory corruption bug won't be able
to execute whatever piece of code, being restricted to jump into endbr
instructions). To make the allowed control-flow graph more restrict, we are
looking into how to minimize the number of endbrs in the final kernel binary
-- meaning that if a function is never called indirectly, it shouldn't have an
endbr instruction, thus increasing the security guarantees of the hardware
feature.

Some ref about what is going on --
https://lore.kernel.org/lkml/20211122170805.149482391@infradead.org/T/ (local)
Yes, I noticed something was happening again. There was a thread on this 
in February https://lore.kernel.org/all/20210207104022.GA32127@zn.tnic/ (local) 
and some concerns were raised back then around fentry and int3 patching if 
I remember correctly. Is this still an issue?
IIRC, live-patching used kallsyms/kallsyms_lookup_name for grabbing pointers
to the symbols in the running kernel and then used these pointers to invoke
the functions which reside outside of the live-patch (ie. previously existing
functions). With the above IBT support, if these functions were considered
non-indirectly-reachable, and were suppressed of an endbr, this would lead
into a crash. I remember we were working on klp-convert to fix this through
special relocations and that there were other proposals... but I'm not sure
where it went.

So, would you mind giving a quick update on the general state of this? If the
IBT support would break this (and anything else) regarding live-patching...
and so on?
Right. So, this really depends on how downstream consumers approach this. 
kpatch-build should be fine if I am not mistaken, because it uses the 
.klp.rela support we have in the kernel. We (at SUSE) have a problem, 
because we still exploit kallsyms/kallsyms_lookup_name to cope with this.

Joe, what is the current state of klp-convert? Do we still want to follow 
that way?

There was an idea a long time ago to actually rewrite all the relocations 
in a live patch module, so that they are relative to a well defined symbol 
(both in vmlinux and in modules. It would have to be created, I guess.). 
It would be easier tooling-wise and kernel module loader would process it 
like everything else. However, FGKASLR with all its reshuffling would 
render it useless. So something like klp-convert is needed.

Thanks

Miroslav
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help