type
status
slug
summary
tags
category
icon
password
new update day
Property
Oct 22, 2023 01:31 PM
created days
Last edited time
Oct 22, 2023 01:31 PM

0 前言

今天我们基于 Linux 6.4 内核,添加一个系统监控的系统调用,但是单纯添加一个系统调用会显得有些单调,所以我们把系统调用,修改内核,内核编译,还有内核模块的编写插入,用户态测试函数等等结合起来,做一个全面的讲解。

简介

我们要添加的是一个系统调用日志收集系统,系统调用是用户程序与系统打交道的入口,系统调用的安全直接关系到系统的安全,假设一个用户他恶意的不断调用fork,将会导致系统负载增加,所以如果能收集到是谁,调用了一些有危险的系统调用,以及系统调用的时间和其他信息,将有助于系统管理员进行事后的追踪,从而提高系统的安全性,我们看到的这张图就是本次要添加的系统调用日志收集系统示意图。
notion image
我们可以看到当用户进程进行系统调用的时候,当执行到do_syscall_64,我们判断是否是我们需要记录的系统调用,如果是则拦截需要记录的系统调用,通过my_audit这一函数将相关信息写入到内核中的buffer里,同时我们编写用户测试程序,在用户测试程序中我们通过本次添加的335号系统调用,执行my_sysaudit这一函数,该函数把内核buffer里的信息,拿到我们的用户buffer当中。
其中 my_auditmy_sysaudit 这两个函数是钩子函数,在我们的 my_audit 内核模块当中进行具体的实现。

下载对应的内核源码

可以使用wget命令进行下载,解压下载好的压缩包。

1 添加系统调用

第一步

打开系统调用表表项文件,增加系统调用表表项,
notion image

第二步 添加系统调用函数

第三步 修改 Makefile

myaudit.c 添加到内核编译中去。
notion image

第四步 增加函数声明

notion image

第五步 拦截相关系统调用

  • 找到 do_syscall_x64 函数,将对应的想要拦截的系统调用添加到函数中。如果捕捉到对应的要监控的系统函数,调用 my_audit 内核函数进行处理。
notion image
notion image

第六步 添加实现钩子函数的内核模块

  • my_audit.c

第七步 编写 Makefile

2 编译修改后的内核

2.1 开启 ccache 加速编译

因为内核数据量很大,所以在编译的时候每次都需要非常多的时间,基本上就是修改两分钟,编译两小时,一点都没有夸张。可以跟据我下面的文章开启 ccache 。

2.2 拷贝原系统 .config 文件

2.3 配置内核

  • 打开内核配置页,加载 .config 文件

2.4 配置内核编译关闭证书

如果出现 debian/canonical-certs.pem error 等错误,参考下面的文章与下面的操作。

2.5 编译内核

2.6 安装内核

2.7 重启查看修改

  • 重启之后查看内核
  • 查看 dmseg

2.8 编译内核模块

2.9 加载内核模块

  • sudo insmod my_audit.ko

2.10 编写用户态测试函数

  • test_syscall.c

2.11 编译并运行

  • 运行结果
 
使用 ccache 加速内核编译QEMU 调试 Linux 内核环境搭建