From: Peter Zijlstra <peterz@infradead.org>
To: x86@kernel.org, alyssa.milburn@linux.intel.com
Cc: linux-kernel@vger.kernel.org, peterz@infradead.org,
samitolvanen@google.com, keescook@chromium.org,
jpoimboe@kernel.org, joao@overdrivepizza.com, brgerst@gmail.com
Subject: [PATCH v2 3/6] x86/cfi: Extend ENDBR sealing to kCFI
Date: Thu, 22 Jun 2023 16:42:21 +0200 [thread overview]
Message-ID: <20230622144321.494426891@infradead.org> (raw)
In-Reply-To: <20230622144218.860926475@infradead.org>
Kees noted that IBT sealing could be extended to kCFI.
Fundamentally it is the list of functions that do not have their
address taken and are thus never called indirectly. It doesn't matter
that objtool uses IBT infrastructure to determine this list, once we
have it it can also be used to clobber kCFI hashes and seal kCFI
indirect calls.
Suggested-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
arch/x86/kernel/alternative.c | 44 +++++++++++++++++++++++++++++++++++++++++-
1 file changed, 43 insertions(+), 1 deletion(-)
--- a/arch/x86/kernel/alternative.c
+++ b/arch/x86/kernel/alternative.c
@@ -778,6 +778,8 @@ void __init_or_module noinline apply_ret
#ifdef CONFIG_X86_KERNEL_IBT
+static void poison_cfi(void *addr);
+
static void __init_or_module poison_endbr(void *addr, bool warn)
{
u32 endbr, poison = gen_endbr_poison();
@@ -802,6 +804,9 @@ static void __init_or_module poison_endb
/*
* Generated by: objtool --ibt
+ *
+ * Seal the functions for indirect calls by clobbering the ENDBR instructions
+ * and the kCFI hash value.
*/
void __init_or_module noinline apply_seal_endbr(s32 *start, s32 *end)
{
@@ -812,7 +817,7 @@ void __init_or_module noinline apply_sea
poison_endbr(addr, true);
if (IS_ENABLED(CONFIG_FINEIBT))
- poison_endbr(addr - 16, false);
+ poison_cfi(addr - 16);
}
}
@@ -1177,6 +1182,41 @@ static void __apply_fineibt(s32 *start_r
pr_err("Something went horribly wrong trying to rewrite the CFI implementation.\n");
}
+static inline void poison_hash(void *addr)
+{
+ *(u32 *)addr = 0;
+}
+
+static void poison_cfi(void *addr)
+{
+ switch (cfi_mode) {
+ case CFI_FINEIBT:
+ /*
+ * __cfi_\func:
+ * osp nopl (%rax)
+ * subl $0, %r10d
+ * jz 1f
+ * ud2
+ * 1: nop
+ */
+ poison_endbr(addr, false);
+ poison_hash(addr + fineibt_preamble_hash);
+ break;
+
+ case CFI_KCFI:
+ /*
+ * __cfi_\func:
+ * movl $0, %eax
+ * .skip 11, 0x90
+ */
+ poison_hash(addr + 1);
+ break;
+
+ default:
+ break;
+ }
+}
+
#else
static void __apply_fineibt(s32 *start_retpoline, s32 *end_retpoline,
@@ -1184,6 +1224,8 @@ static void __apply_fineibt(s32 *start_r
{
}
+static void poison_cfi(void *addr) { }
+
#endif
void apply_fineibt(s32 *start_retpoline, s32 *end_retpoline,
next prev parent reply other threads:[~2023-06-22 14:51 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-22 14:42 [PATCH v2 0/6] x86/cfi: Fix FineIBT Peter Zijlstra
2023-06-22 14:42 ` [PATCH v2 1/6] x86/cfi: Extend {JMP,CAKK}_NOSPEC comment Peter Zijlstra
2023-06-22 14:42 ` [PATCH v2 2/6] x86/alternative: Rename apply_ibt_endbr() Peter Zijlstra
2023-06-22 14:42 ` Peter Zijlstra [this message]
2023-06-22 14:42 ` [PATCH v2 4/6] x86/32: Remove schedule_tail_wrapper() Peter Zijlstra
2023-06-22 14:42 ` [PATCH v2 5/6] x86: Rewrite ret_from_fork() in C Peter Zijlstra
2023-06-22 14:42 ` [PATCH v2 6/6] x86/fineibt: Poison ENDBR at +0 Peter Zijlstra
2023-06-22 16:14 ` [PATCH v2 0/6] x86/cfi: Fix FineIBT Kees Cook
2023-06-23 0:20 ` Sami Tolvanen
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=20230622144321.494426891@infradead.org \
--to=peterz@infradead.org \
--cc=alyssa.milburn@linux.intel.com \
--cc=brgerst@gmail.com \
--cc=joao@overdrivepizza.com \
--cc=jpoimboe@kernel.org \
--cc=keescook@chromium.org \
--cc=linux-kernel@vger.kernel.org \
--cc=samitolvanen@google.com \
--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
all inboxes | Powered by JetHome®