|
|
||
|---|---|---|
| .vscode | ||
| build | ||
| data/MNIST/raw | ||
| src | ||
| tests | ||
| Makefile | ||
| README.md | ||
| output.txt | ||
| test_bash.sh | ||
README.md
execve 拦截器
简介
本项目是一个通过动态链接库预加载 (LD_PRELOAD) 方式实现的 execve 系统调用拦截器。它可以根据预定义的规则,在程序执行指定的命令时进行警告、阻止或记录操作。
主要功能:
- 命令拦截与告警: 当执行配置中指定的命令时,可以显示警告信息并询问用户是否继续执行。
- 命令阻止: 可以完全阻止执行配置中指定的命令。
- 参数匹配: 支持基于命令参数进行更细粒度的规则匹配。
- 配置热加载: 能够检测到配置文件修改并自动重新加载规则。
- 日志记录: 记录所有通过
execve执行的命令及其参数。 - 输出重定向与错误检测: 将执行命令的标准输出和错误输出记录到日志文件,并能在检测到错误时发出提示。
- 仅拦截终端 Shell: 默认只在终端 Shell (如 bash, zsh, fish, sh) 中拦截
execve调用,避免影响其他程序。 - 功能开关: 可以通过配置文件中的
enabled字段全局启用或禁用拦截功能。
安装
-
前提条件:
- 安装
gcc等编译工具。 - 安装
json-c库 (开发版本)。在 Debian/Ubuntu 上可以使用sudo apt-get install libjson-c-dev安装,在 CentOS/RHEL 上可以使用sudo yum install json-c-devel安装。
- 安装
-
编译:
gcc -shared -fPIC execve_interceptor.c -o execve_interceptor.so -ldl -ljson-c- 确保你的代码文件名为
execve_interceptor.c。
- 确保你的代码文件名为
-
创建配置和日志目录 (如果不存在):
mkdir -p config logs -
创建配置文件:
-
在
config目录下创建execve_rules.json文件,并按照以下格式配置规则:{ "enabled": true, "rules": [ { "cmd": "nvidia-smi", "type": "warn", "msg": "在沐曦环境下请执行mx-smi" }, { "cmd": "rm", "type": "error", "msg": "Error: rm command is forbidden" }, { "cmd": "pip", "type": "warn", "msg": "使用pip安装torch时,请注意使用厂家支持版本", "args": ["install", "torch"] } ] }enabled: 布尔值,用于启用或禁用整个拦截器功能。rules: 一个 JSON 数组,包含多个规则对象。cmd: 要拦截的命令名称。type: 拦截类型,可以是"warn"(警告) 或"error"(阻止)。msg: 当规则匹配时显示的消息。args(可选): 一个字符串数组,指定需要匹配的命令参数。只有当所有指定的参数都存在时,规则才匹配。
-
配置
config/execve_rules.json: 这是主要的配置文件,用于定义拦截规则。你可以根据需要添加、修改或删除规则。logs/execve.log: 记录所有通过execve执行的命令及其参数。logs/execve_out.log: 记录被拦截命令的标准输出和错误输出。
使用
要使用该拦截器,你需要通过 LD_PRELOAD 环境变量在执行命令前加载编译好的动态链接库。
示例:
export LD_PRELOAD=$(pwd)/execve_interceptor.so
nvidia-smi
rm test.txt
pip install torch
前置依赖:
- jsonc:
# Ubuntu/Debian
sudo apt-get install libjson-c-dev
# CentOS/RHEL
sudo yum install json-c-devel
编译:
- cd execve_hook && make
测试:
- ./test_bash.sh
配置文件格式:
[
{
"cmd": "nvidia-smi", // 将匹配的命令
"type": "warn", // 如果为warn,则会提示是否继续执行
"msg": "在沐曦环境下请执行mx-smi" // 提示信息
},
{
"cmd": "rm", // 匹配的命令
"type": "error", // 如果为error,则会拦截命令执行
"msg": "Error: rm command is forbidden" // 提示信息
},
{
"cmd": "pip", // 匹配的命令
"type": "warn",
"msg": "使用pip安装torch时,请注意使用厂家支持版本",
"args": ["install", "torch"] //当存在args,则这里的参数必须全部存在
}
]