132 lines
4.3 KiB
Markdown
132 lines
4.3 KiB
Markdown
# execve 拦截器
|
||
|
||
## 简介
|
||
|
||
本项目是一个通过动态链接库预加载 (LD\_PRELOAD) 方式实现的 `execve` 系统调用拦截器。它可以根据预定义的规则,在程序执行指定的命令时进行警告、阻止或记录操作。
|
||
|
||
**主要功能:**
|
||
|
||
* **命令拦截与告警:** 当执行配置中指定的命令时,可以显示警告信息并询问用户是否继续执行。
|
||
* **命令阻止:** 可以完全阻止执行配置中指定的命令。
|
||
* **参数匹配:** 支持基于命令参数进行更细粒度的规则匹配。
|
||
* **配置热加载:** 能够检测到配置文件修改并自动重新加载规则。
|
||
* **日志记录:** 记录所有通过 `execve` 执行的命令及其参数。
|
||
* **输出重定向与错误检测:** 将执行命令的标准输出和错误输出记录到日志文件,并能在检测到错误时发出提示。
|
||
* **仅拦截终端 Shell:** 默认只在终端 Shell (如 bash, zsh, fish, sh) 中拦截 `execve` 调用,避免影响其他程序。
|
||
* **功能开关:** 可以通过配置文件中的 `enabled` 字段全局启用或禁用拦截功能。
|
||
|
||
## 安装
|
||
|
||
1. **前提条件:**
|
||
* 安装 `gcc` 等编译工具。
|
||
* 安装 `json-c` 库 (开发版本)。在 Debian/Ubuntu 上可以使用 `sudo apt-get install libjson-c-dev` 安装,在 CentOS/RHEL 上可以使用 `sudo yum install json-c-devel` 安装。
|
||
|
||
2. **编译:**
|
||
```bash
|
||
gcc -shared -fPIC execve_interceptor.c -o execve_interceptor.so -ldl -ljson-c
|
||
```
|
||
* 确保你的代码文件名为 `execve_interceptor.c`。
|
||
|
||
3. **创建配置和日志目录 (如果不存在):**
|
||
```bash
|
||
mkdir -p config logs
|
||
```
|
||
|
||
4. **创建配置文件:**
|
||
* 在 `config` 目录下创建 `execve_rules.json` 文件,并按照以下格式配置规则:
|
||
|
||
```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` 环境变量在执行命令前加载编译好的动态链接库。
|
||
|
||
**示例:**
|
||
|
||
```bash
|
||
export LD_PRELOAD=$(pwd)/execve_interceptor.so
|
||
nvidia-smi
|
||
rm test.txt
|
||
pip install torch
|
||
```
|
||
|
||
## 前置依赖:
|
||
|
||
- jsonc:
|
||
|
||
```bash
|
||
# Ubuntu/Debian
|
||
sudo apt-get install libjson-c-dev
|
||
|
||
# CentOS/RHEL
|
||
sudo yum install json-c-devel
|
||
|
||
```
|
||
|
||
## 编译:
|
||
|
||
- cd execve_hook && make
|
||
|
||
## 测试:
|
||
|
||
- ./test_bash.sh
|
||
|
||
## 配置文件格式:
|
||
|
||
```json
|
||
[
|
||
{
|
||
"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,则这里的参数必须全部存在
|
||
}
|
||
]
|
||
|
||
```
|