On Mon, Nov 17, 2014 at 02:33:02PM +0900, Masami Hiramatsu wrote:
> Hi Seth,
> 
> (2014/11/17 10:29), Seth Jennings wrote:
> > Changelog:
> > 
> > Thanks for all the feedback!
> > 
> > changes in v2:
> > - rebase to next-20141113
> > - add copyright/license block to livepatch.h
> > - add _LINUX prefix to header defines
> > - replace semaphore with mutex
> > - add LPC_ prefix to state enum
> > - convert BUGs to WARNs and handle properly
> > - change Kconfig default to n
> > - remove [old|new] attrs from function sysfs dir (KASLR leak, no use)
> > - disregard user provided old_addr if kernel uses KASLR
> > - s/out/err for error path labels
> > - s/unregister/disable for uniform terminology
> > - s/lp/lpc for module notifier elements
> 
> Hmm, btw, "LP" and "LPC" remind me line-printer and LPC bus :(
> Can we use LKP (Live Kernel Patching) or KLP (Kernel Live Patching) instead ?

Jiri S also mentioned this so I guess it is a common sentiment :)  He
suggested "lip" but I think I like "klp" better?  Jiri S sound good?

> 
> > - replace module ref'ing with unload notifier + mutex protection
> > - adjust notifier priority to run before ftrace
> > - make LIVE_PATCHING boolean (about to depend on arch stuff)
> 
> For better handling x86-32, we'd better introduce ARCH_HAVE_LIVE_PATCHING and
> avoid enabling LIVE_PATCHING on x86_32, then we can simplify 
> arch/x86/kernel/livepatch.c.

Will do.

Thanks for the review!

Seth

> 
> Thank you,
> 
> > - move x86-specific reloc code to arch/x86
> > - s/dynrela/reloc/
> > - add live patching sysfs documentation
> > - add API function kernel-doc
> > - TODO: kernel-doc for API structs once agreed upon
> > 
> > Summary:
> > 
> > This patchset implements an ftrace-based mechanism and kernel interface for
> > doing live patching of kernel and kernel module functions.  It represents 
> > the
> > greatest common functionality set between kpatch [1] and kGraft [2] and can
> > accept patches built using either method.  This solution was discussed in 
> > the
> > Live Patching Mini-conference at LPC 2014 [3].
> > 
> > The model consists of a live patching "core" that provides an interface for
> > other "patch" kernel modules to register patches with the core.
> > 
> > Patch modules contain the new function code and create an lp_patch structure
> > containing the required data about what functions to patch, where the new 
> > code
> > for each patched function resides, and in which kernel object (vmlinux or
> > module) the function to be patch resides.  The patch module then invokes the
> > lp_register_patch() function to register with the core, then 
> > lp_enable_patch()
> > to have the core redirect the execution paths using ftrace.
> > 
> > An example patch module can be found here:
> > https://github.com/spartacus06/livepatch/blob/master/patch/patch.c
> > 
> > The live patching core creates a sysfs hierarchy for user-level access to 
> > live
> > patching information.  The hierarchy is structured like this:
> > 
> > /sys/kernel/livepatch
> > /sys/kernel/livepatch/<patch>
> > /sys/kernel/livepatch/<patch>/enabled
> > /sys/kernel/livepatch/<patch>/<object>
> > /sys/kernel/livepatch/<patch>/<object>/<func>
> > 
> > The old function is located using one of two methods: it is either provided 
> > by
> > the patch module (only possible for a function in vmlinux) or kallsyms 
> > lookup.
> > Symbol ambiguity results in a failure.
> > 
> > The core takes a reference on the patch module itself to keep it from
> > unloading.  This is because, without a mechanism to ensure that no thread is
> > currently executing in the patched function, we can not determine whether 
> > it is
> > safe to unload the patch module.  For this reason, unloading patch modules 
> > is
> > currently not allowed.
> > 
> > Disabling patches can be done using the "enabled" attribute of the patch:
> > 
> > echo 0 > /sys/kernel/livepatch/<patch>/enabled
> > 
> > If a patch module contains a patch for a module that is not currently 
> > loaded,
> > there is nothing to patch so the core does nothing for that patch object.
> > However, the core registers a module notifier that looks for COMING events 
> > so
> > that if the module is ever loaded, it is immediately patched.  If a module 
> > with
> > patch code is removed, the notifier looks for GOING events and disables any
> > patched functions for that object before it unloads.  The notifier has a 
> > higher
> > priority than that of the ftrace notifier so that it runs before the ftrace
> > notifier for GOING events and we can cleanly unregister from ftrace.
> > 
> > kpatch and kGraft each have their own mechanisms for ensuring system
> > consistency during the patching process. This first version does not 
> > implement
> > any consistency mechanism that ensures that old and new code do not run
> > together.  In practice, ~90% of CVEs are safe to apply in this way, since 
> > they
> > simply add a conditional check.  However, any function change that can not
> > execute safely with the old version of the function can _not_ be safely 
> > applied
> > for now.
> > 
> > [1] https://github.com/dynup/kpatch
> > [2] https://git.kernel.org/cgit/linux/kernel/git/jirislaby/kgraft.git/
> > [3] https://etherpad.fr/p/LPC2014_LivePatching
> > 
> > Seth Jennings (3):
> >   kernel: add TAINT_LIVEPATCH
> >   kernel: add support for live patching
> >   kernel: add sysfs documentation for live patching
> > 
> >  Documentation/ABI/testing/sysfs-kernel-livepatch |  44 +
> >  Documentation/oops-tracing.txt                   |   2 +
> >  Documentation/sysctl/kernel.txt                  |   1 +
> >  MAINTAINERS                                      |  13 +
> >  arch/x86/Kconfig                                 |   2 +
> >  arch/x86/include/asm/livepatch.h                 |  38 +
> >  arch/x86/kernel/Makefile                         |   1 +
> >  arch/x86/kernel/livepatch.c                      |  83 ++
> >  include/linux/kernel.h                           |   1 +
> >  include/linux/livepatch.h                        |  68 ++
> >  kernel/Makefile                                  |   1 +
> >  kernel/livepatch/Kconfig                         |   9 +
> >  kernel/livepatch/Makefile                        |   3 +
> >  kernel/livepatch/core.c                          | 999 
> > +++++++++++++++++++++++
> >  kernel/panic.c                                   |   2 +
> >  15 files changed, 1267 insertions(+)
> >  create mode 100644 Documentation/ABI/testing/sysfs-kernel-livepatch
> >  create mode 100644 arch/x86/include/asm/livepatch.h
> >  create mode 100644 arch/x86/kernel/livepatch.c
> >  create mode 100644 include/linux/livepatch.h
> >  create mode 100644 kernel/livepatch/Kconfig
> >  create mode 100644 kernel/livepatch/Makefile
> >  create mode 100644 kernel/livepatch/core.c
> > 
> 
> 
> -- 
> Masami HIRAMATSU
> Software Platform Research Dept. Linux Technology Research Center
> Hitachi, Ltd., Yokohama Research Laboratory
> E-mail: masami.hiramatsu...@hitachi.com
> 
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to