用户态热补丁

Posted rtoax

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用户态热补丁相关的知识,希望对你有一定的参考价值。

用户态热补丁

荣涛
2021年9月14日

1. 相关链接

  1. 上游项目 libcare:https://github.com/paboldin/libcare
  2. openEuler中的项目LibcarePlus:https://docs.openeuler.org/zh/docs/20.03_LTS_SP2/docs/Virtualization/LibcarePlus.html
    Markdown版:https://gitee.com/openeuler/docs/blob/stable2-20.03_LTS_SP2/docs/zh/docs/Virtualization/LibcarePlus.md
  3. LibcarePlus项目:https://gitee.com/src-openeuler/libcareplus/
  4. 【漏洞通告】Qemu虚拟机逃逸漏洞(CVE-2020-14364)通告:https://cloud.tencent.com/developer/article/1689087
  5. No.62 - QEMU 用户态进程热补丁框架:https://gitee.com/openeuler/marketing/issues/I1IG8E
  6. openEuler 虚拟化技术分享 - 2021 - 第1期 -QEMU 用户态热补丁(2021-03-26华为工程师的演讲)https://www.bilibili.com/video/av332259939

2. CVE-2015-0235 GHOST:glibc 漏洞

  1. https://security.paloaltonetworks.com/CVE-2015-0235
  2. GHOST: glibc vulnerability (CVE-2015-0235):https://access.redhat.com/articles/1332213

2.1. 描述

红帽产品安全部已发现glibc 库中的一个严重漏洞,该漏洞已被指定为CVE-2015-0235,通常称为“GHOST”。Red Hat Enterprise Linux 的所有变体附带的所有 glibc 版本都会受到影响。
开源库“glibc”被发现包含一个最近发现的漏洞(CVE-2015-0235,通常称为“GHOST”),该漏洞已被证明可以在某些软件中实现远程代码执行。GHOST 是影响glibc 库中的gethostbyname()gethostbyname2()函数调用的“缓冲区溢出”错误。此漏洞允许远程攻击者通过应用程序调用这些函数中的任何一个来执行具有运行应用程序用户权限的任意代码。

gethostbyname()函数调用用于域名解析,这是一个非常常见的事件。要利用此漏洞,攻击者必须通过向执行 DNS 解析的应用程序提供无效的主机名参数来触发缓冲区溢出。
GHOST (CVE-2015-0235) - gethostbyname 检测器:https://access.redhat.com/labs/ghost/

CVE-2015-0235 在易受攻击的系统上的可利用性高度依赖于围绕系统内易受攻击功能使用的架构和设计,迄今为止,在各种开源软件库中发现的可利用条件极为罕见。

2.2. 弱点类型

CWE-119 内存缓冲区范围内的操作限制不当。

3. CVE-2017-2615 越界访问问题

http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-2615

3.1. 描述

使用 Cirrus CLGD 54xx VGA 仿真器支持构建的快速仿真器 (QEMU) 容易受到越界访问问题的影响。在向后模式下通过 bitblt 复制复制 VGA 数据时可能会发生这种情况。来宾中的特权用户可以使用此缺陷使 QEMU 进程崩溃,从而导致 DoS 或可能在主机上以 QEMU 进程的特权在主机上执行任意代码。

4. libcare

4.1. live patches 如何生成

详情见 libcare/README.rst

  • 原始的和补丁都被编译成汇编语言
  • 相关的汇编文件比较,并且新的汇编会在补丁存放的特定的ELF section区域生成
  • 汇编指令使用目标系统编译成目标文件
  • 二进制补丁文件是从ELF section中提取出来的

4.2. live patches 如何应用

更像将共享库加载到另一个可执行文件中:

  • 二进制libcare-ctl(医生),通过调用ptrace(2)添加病人
  • 医生检查病人的物品,
  • 医生伪装病人在原始对象附近分配补丁内存,
  • 补丁中的引用由医生解析,补丁代码现在可以执行了,
  • 医生通过无条件跳转到适当的补丁版本来重写目标原始函数,确保没有患者线程首先执行它们。

现在,病人就可以执行patch的代码版本了。

ptrace(2):http://man7.org/linux/man-pages/man2/ptrace.2.html


Copyright (C) **CESTC** Com.

以上是关于用户态热补丁的主要内容,如果未能解决你的问题,请参考以下文章

续:纠正:ubuntu7.04可以安装,而且完美的安装 ! for《Oracle-10.2.0.1,打补丁10.2.0.5:在 debian 版本4不含4以上,及 ubuntu 7.04不含(代码片段

VS code自定义用户代码片段snippet

通过 Java 正则表达式提取 semver 版本字符串的片段

VSCode自定义代码片段——声明函数

VSCode自定义代码片段——CSS选择器

VSCode自定义代码片段8——声明函数