SysCare是一个系统级热修复软件,为操作系统提供单机级与集群级安全补丁和系统错误热修复,主机无需重新启动即可修复该系统问题。 当前仅融合统一内核态/用户态热补丁技术,用户需聚焦在自己核心业务中,系统修复问题交予SysCare进行处理。后期计划根据修复组件的不同,提供系统热升级技术,进一步解放运维用户提升运维效率。
可以利用系统组件源代码与相应的patch问题,制作出相应组件补丁的RPM(包含补丁文件、依赖信息与配置信息等). 制作的补丁RPM,可以上传到相应的补丁仓库中,集群的系统daemon定时去查询补丁仓库, 对系统中运行的CVE与软件错误进行热修复,保证系统安全、稳定、高效运行。
- 正确配置dnf/yum仓库文件
dnf update & dnf install syscare
- enjoy the tool
-
安装编译依赖
$ kernel-version=$(uname -r) $ dnf install -y kernel-source-$kernel-version kernel-debuginfo-$kernel-version kernel-devel-$kernel-version $ dnf install -y elfutils-libelf-devel openssl-devel dwarves python3-devel rpm-build bison cmake make gcc g++
-
编译并安装
PS: 直接编译在应用补丁的时候会显示缺少依赖,建议通过rpm包安装
git clone https://gitee.com/openeuler/syscare.git cd syscare mkdir tmp cd tmp cmake -DCMAKE_INSTALL_PREFIX=/usr -DKERNEL_VERSION=$(uname -r) .. make make install mkdir -p /usr/lib/syscare/patches systemctl daemon-reload systemctl enable syscare systemctl start syscare
-
离线编译 首先在网络的环境上执行cargo vendor下载所有依赖到./vendor目录下
cd syscare cargo vendor
源码目录创建.cargo/config.toml,并写入以下设置,下次编译就不需要联网了
[source.crates-io] replace-with = "vendored-sources" [source.vendored-sources] directory = "vendor"
rpm -ivh syscare-*.rpm
或者
dnf install syscare-*.rpm
$ syscare build \
--patch-name "HP001" \
--patch-description "CVE-2021-32675" \
--source ./redis-6.2.5-1.src.rpm \
--debuginfo ./redis-debuginfo-6.2.5-1.x86_64.rpm \
--output ./output \
--patch ./0001-Prevent-unauthenticated-client-from-easily-consuming.patch
$ syscare build \
--patch-name HP001 \
--source ./kernel-5.10.0-60.91.0.115.src.rpm \
--source ./testmod-1-1.src.rpm \
--debuginfo ./kernel-debuginfo-5.10.0-60.91.0.115.aarch64.rpm \
--output ./output \
--verbose \
--skip-cleanup \
--patch ./0001-test.patch
补丁制作详细使用说明请见builder/README.md
- 补丁安装
$ sudo syscare apply redis-6.2.5-1/HP001
- 补丁激活
$ sudo syscare active redis-6.2.5-1/HP001
- 补丁去激活
$ sudo syscare deactive redis-6.2.5-1/HP001
- 补丁卸载/移除
$ sudo syscare remove redis-6.2.5-1/HP001
- 确认补丁
$ sudo syscare accept redis-6.2.5-1/HP001
- 查询补丁状态
$ syscare status redis-6.2.5-1/HP001
- 查询补丁信息
$ syscare info redis-6.2.5-1/HP001
- 查询补丁目标软件信息
$ syscare target redis-6.2.5-1/HP001
- 查询所有补丁
$ syscare list
- 快速重启系统
$ syscare reboot
命令行详细使用说明请见cli/README.md
- 当前仅支持64位系统;
- 当前仅支持ELF格式的热修复,暂不支持解释型语言;
- 当前仅支持gcc / g++编译器;
- 编译器需要支持
-gdwarf
-ffunction-sections
-fdata-sections
参数; - 仅支持DWARF格式的调试信息,且不支持g3等级;
- 不支持修改全局变量;
- 暂不支持交叉编译;
- 暂不支持汇编修改;
- 暂不支持新增外部符号(动态库依赖);
- 暂不支持对同一个二进制打多个补丁;
- 暂不支持补丁文件名相同,Bind为Local并且Type为
STT_FUNC
或STT_OBJECT
完全相同的符号修改: 存在同名文件,并且局部变量和函数名称完全一致,实现可能不一致; - 暂不支持C & C++ 混合编译;
- 暂不支持C++ exception修改;
- 暂不支持group section:
-g3
编译选项,特定编译优化选项,特定gcc plugin等; - 暂不支持新增ifunc:
__attribute__((ifunc("foo")))
; - 暂不支持新增TLS变量:
__thread int foo
; - 暂不支持编译开启LTO选项。
- Fork 本仓库
$ git clone https://gitee.com/openeuler/syscare.git
- 建立自己分支
$ cd syscare & git branch -b Feature_XXXX
- 完善特性代码
$ vim src/upatch/xxxx & git commit -m ""
- 提交代码
$ git push origin
- 新建 Pull Request
- 可添加微信号: syscare, 申请加入syscare讨论群
- 可在openEuler论坛发帖或相应帖子中回复: https://forum.openeuler.org/