From: Josh Poimboeuf <jpoimboe@redhat.com>
To: live-patching@vger.kernel.org
Cc: linux-kernel@vger.kernel.org,
Peter Zijlstra <peterz@infradead.org>,
Jessica Yu <jeyu@kernel.org>,
Joe Lawrence <joe.lawrence@redhat.com>
Subject: [PATCH v3 04/10] livepatch: Prevent module-specific KLP rela sections from referencing vmlinux symbols
Date: Sat, 25 Apr 2020 06:07:24 -0500 [thread overview]
Message-ID: <4cf2d81338cade08ca4fcd1654f3512415a88481.1587812518.git.jpoimboe@redhat.com> (raw)
In-Reply-To: <cover.1587812518.git.jpoimboe@redhat.com>
Prevent module-specific KLP rela sections from referencing vmlinux
symbols. This helps prevent ordering issues with module special section
initializations. Presumably such symbols are exported and normal relas
can be used instead.
Suggested-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
kernel/livepatch/core.c | 38 +++++++++++++++++++++++++++-----------
1 file changed, 27 insertions(+), 11 deletions(-)
diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c
index 16632e75112a..f9ebb54affab 100644
--- a/kernel/livepatch/core.c
+++ b/kernel/livepatch/core.c
@@ -192,17 +192,20 @@ static int klp_find_object_symbol(const char *objname, const char *name,
}
static int klp_resolve_symbols(Elf64_Shdr *sechdrs, const char *strtab,
- unsigned int symndx, Elf_Shdr *relasec)
+ unsigned int symndx, Elf_Shdr *relasec,
+ const char *sec_objname)
{
- int i, cnt, vmlinux, ret;
- char objname[MODULE_NAME_LEN];
- char symname[KSYM_NAME_LEN];
+ int i, cnt, ret;
+ char sym_objname[MODULE_NAME_LEN];
+ char sym_name[KSYM_NAME_LEN];
Elf_Rela *relas;
Elf_Sym *sym;
unsigned long sympos, addr;
+ bool sym_vmlinux;
+ bool sec_vmlinux = !strcmp(sec_objname, "vmlinux");
/*
- * Since the field widths for objname and symname in the sscanf()
+ * Since the field widths for sym_objname and sym_name in the sscanf()
* call are hard-coded and correspond to MODULE_NAME_LEN and
* KSYM_NAME_LEN respectively, we must make sure that MODULE_NAME_LEN
* and KSYM_NAME_LEN have the values we expect them to have.
@@ -223,20 +226,33 @@ static int klp_resolve_symbols(Elf64_Shdr *sechdrs, const char *strtab,
return -EINVAL;
}
- /* Format: .klp.sym.objname.symname,sympos */
+ /* Format: .klp.sym.sym_objname.sym_name,sympos */
cnt = sscanf(strtab + sym->st_name,
".klp.sym.%55[^.].%127[^,],%lu",
- objname, symname, &sympos);
+ sym_objname, sym_name, &sympos);
if (cnt != 3) {
pr_err("symbol %s has an incorrectly formatted name\n",
strtab + sym->st_name);
return -EINVAL;
}
+ sym_vmlinux = !strcmp(sym_objname, "vmlinux");
+
+ /*
+ * Prevent module-specific KLP rela sections from referencing
+ * vmlinux symbols. This helps prevent ordering issues with
+ * module special section initializations. Presumably such
+ * symbols are exported and normal relas can be used instead.
+ */
+ if (!sec_vmlinux && sym_vmlinux) {
+ pr_err("invalid access to vmlinux symbol '%s' from module-specific livepatch relocation section",
+ sym_name);
+ return -EINVAL;
+ }
+
/* klp_find_object_symbol() treats a NULL objname as vmlinux */
- vmlinux = !strcmp(objname, "vmlinux");
- ret = klp_find_object_symbol(vmlinux ? NULL : objname,
- symname, sympos, &addr);
+ ret = klp_find_object_symbol(sym_vmlinux ? NULL : sym_objname,
+ sym_name, sympos, &addr);
if (ret)
return ret;
@@ -294,7 +310,7 @@ int klp_apply_section_relocs(struct module *pmod, Elf_Shdr *sechdrs,
if (strcmp(objname ? objname : "vmlinux", sec_objname))
return 0;
- ret = klp_resolve_symbols(sechdrs, strtab, symndx, sec);
+ ret = klp_resolve_symbols(sechdrs, strtab, symndx, sec, sec_objname);
if (ret)
return ret;
--
2.21.1
next prev parent reply other threads:[~2020-04-25 11:09 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-25 11:07 [PATCH v3 00/10] livepatch,module: Remove .klp.arch and module_disable_ro() Josh Poimboeuf
2020-04-25 11:07 ` [PATCH v3 01/10] livepatch: Disallow vmlinux.ko Josh Poimboeuf
2020-04-25 11:07 ` [PATCH v3 02/10] livepatch: Apply vmlinux-specific KLP relocations early Josh Poimboeuf
2020-04-28 9:20 ` Miroslav Benes
2020-04-25 11:07 ` [PATCH v3 03/10] livepatch: Remove .klp.arch Josh Poimboeuf
2020-04-25 11:07 ` Josh Poimboeuf [this message]
2020-04-25 11:07 ` [PATCH v3 05/10] s390: Change s390_kernel_write() return type to match memcpy() Josh Poimboeuf
2020-04-25 11:07 ` [PATCH v3 06/10] s390/module: Use s390_kernel_write() for late relocations Josh Poimboeuf
2020-04-25 11:14 ` Josh Poimboeuf
2020-04-25 11:07 ` [PATCH v3 07/10] x86/module: Use text_poke() " Josh Poimboeuf
2020-04-25 11:07 ` [PATCH v3 08/10] livepatch: Remove module_disable_ro() usage Josh Poimboeuf
2020-04-25 11:07 ` [PATCH v3 09/10] module: Remove module_disable_ro() Josh Poimboeuf
2020-04-28 16:25 ` Jessica Yu
2020-04-28 16:36 ` Josh Poimboeuf
2020-04-28 16:41 ` Jessica Yu
2020-04-28 17:03 ` Josh Poimboeuf
2020-04-28 18:56 ` Jessica Yu
2020-04-25 11:07 ` [PATCH v3 10/10] x86/module: Use text_mutex in apply_relocate_add() Josh Poimboeuf
2020-04-27 12:22 ` [PATCH v3 00/10] livepatch,module: Remove .klp.arch and module_disable_ro() Joe Lawrence
2020-04-27 12:32 ` Miroslav Benes
2020-04-27 16:52 ` Joe Lawrence
2020-04-28 13:48 ` Miroslav Benes
2020-04-28 14:35 ` Josh Poimboeuf
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=4cf2d81338cade08ca4fcd1654f3512415a88481.1587812518.git.jpoimboe@redhat.com \
--to=jpoimboe@redhat.com \
--cc=jeyu@kernel.org \
--cc=joe.lawrence@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=live-patching@vger.kernel.org \
--cc=peterz@infradead.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).