上周的 LinuxCon North America 2014 上 kpatch 算是赚足了眼球,有两个 talk 分别来自红帽的开发者和来自日立 Linux 技术研究中心的研究员(提出了一个不用 stop_machine() 的新实现)。而 SUSE 的 kGraft 则都未出现。

从项目的进度和社区参与度来看,基本可以认为红帽在 dynamic kernel patching 工具之战中胜出(个人观点),非常有望被并入上游 Linux 内核。代码 100% self-contained (自给)。

下面是一些来自 Josh Poimboeuf 的 kpatch - Have your security and eat it too! 这个 slide 的一些亮点。

kpatch 起初是红帽的内部项目,2014年2月开源 host 在 GitHub 上。其目标是并入上游 Linux 内核。目前已经稳定且可用。

目前已确认 kpatch 可以在以下发行版上正常工作

  • Fedora 20

  • Ubuntu 14.04

  • RHEL 7

  • Oracle Linux 7 (RHCK only)

  • CentOS 7

  • Debian 7 Wheezy (测试可用,不过 3.14 内核升级后有问题,尚未修复)

  • Arch Linux (只是据说,未有确认)

kpatch 专注于安全(具有灵活性和可预见性),服务器 uptime (还是安全),给内核打安全补丁和重启不再挂钩。

利用 ftrace 来实现 patching / 替换旧方法(代码)的新方法是一等公民 、 和 oops ftrace kprobes kdump perf 等兼容 / 支持 taint flag

特性

  • patch rollback

  • patch on reboot

  • Atomic patch upgrade

  • Module patching (and deferred)

  • User load/unload hook functions

  • Skip backtrace safety check

注意:包含数据结构和数据语义(Data Semantic)变化的补丁被认为是不安全的。

局限性

  • 需要人肉分析和评估补丁的安全性(改变的方法是做什么的,这个补丁做什么,补丁如何改变数据交互,按需修改补丁,最好是有个内核方面的专家)

  • kpatch 并不是一个通用升级工具,用发行版的包管理工具来升级内核(或自己编译分发)

  • 目前支持约80%的 CVE 补丁,受限于数据结构的变化和边缘情况。目标是达到99%。

  • stop_machine() 延迟 1ms-40ms (有个日本人已经给出了改进,实际上是弃用该方法的建议,见 issue #138

  • 目前只支持 x86_64 架构

下面附上来自7月中旬 LKML 的 kpatch VS kGraft 优缺点比较(完整信息请看原文)

kpatch advantages compared to kGraft:

  • 100% self-contained in its own module.

  • Doesn’t rely on changing all the kthreads.

  • Patch is applied atomically using stop_machine(), so it’s safer with respect to data semantic changes.

  • Patching atomically also makes it much easier to understand and analyze a patch to determine whether it’s safe for live patching.

Already supports many advanced features which kGraft is lacking:

  • patched functions can access non-exported symbols, e.g. static variables and functions

  • safe unpatching

  • module patching (and deferred module patching)

  • atomic patch replacement

  • supports atomic load/unload user hook functions

  • proper duplicate symbol handling

  • address verification sanity checks

  • sophisticated user space tools for analyzing and converting source patches to binary patch modules

  • ability to properly deal with many special sections (__bug_table,.data..percpu, etc)

kpatch disadvantages compared to kGraft:

  • There is some stop_machine() latency. But we’ve found that stop_machine() is still pretty fast. We measured ~1ms on an idle system and ~40ms on a heavily loaded 16 CPU system.

LinuxCon NA 2014 Slides: http://events.linuxfoundation.org/events/linuxcon-north-america/program/slides