jewelthapa/Malware_analysis_sandbox
GitHub: jewelthapa/Malware_analysis_sandbox
一个基于 Linux 用户空间的恶意软件分析沙箱,通过进程隔离与外部资源监控实现对不受信任二进制文件的墙上时间、CPU 和内存限制。
Stars: 0 | Forks: 0
# 用户空间恶意软件分析沙箱
**进程控制、资源隔离与并发**
作者:Jewel Thapa (250143)
一个用户空间沙箱,用于在严格的外部监督下运行**不受信任的二进制文件**。
监督进程使用 `fork()` + `execve()` 启动目标,通过 `/proc` 和 `wait4()`
从外部测量其行为,使用操作系统**信号**强制执行时间和资源限制,并使用
**pthreads** 并发运行其监视器。不受信任的二进制文件**不参与**自身的监视
或终止——每一项控制决策均由父进程或内核做出。
## 构建与运行
需要 `gcc` (C11)、`make`、POSIX 线程和 Linux `/proc` 文件系统。
```
make # builds sandbox + all test binaries + race_demo
bash run_demo.sh # runs all five scenarios, writes logs/*.log
./tests/race_demo # concurrency evidence
```
手动运行单个目标:
```
# wall_secs cpu_secs mem_mb binary
./sandbox 3 2 128 ./tests/test_cpu
```
* `wall_secs` — 最大墙上时间(wall-clock)生存期(0 = 无限制)
* `cpu_secs` — 最大消耗 CPU 时间(0 = 无限制)
* `mem_mb` — 最大驻留内存(resident memory,单位为 MB)(0 = 无限制)
如果目标在策略内完成,沙箱以 `0` 退出;如果因违反策略被终止,则以 `1` 退出。
## 如何解读日志
每条日志行的格式为 `[墙上时间] [+流逝时间] [组件] 消息`:
| 组件 | 含义 |
|------------|---------|
| `SANDBOX` | 生命周期:运行开始/结束、fork、最终判定 |
| `WATCHDOG` | 墙上时间截止期限线程 |
| `SAMPLER` | `/proc` CPU 时间和 RSS 读数,以及超限违规 |
| `ENFORCE` | 终止决策 + SIGTERM/SIGKILL 升级 |
| `REAPER` | `wait4()` 结果:`rusage` 及子进程的死因 |
**各场景演示的内容**(参见 `logs/`):
1. **`test_good`** → `判定:在策略内完成`。基线:沙箱不会干扰合规代码。
2. **`test_cpu`** → 达到 CPU 上限(约 2.2 秒)→ 发送 `SIGTERM` → **被忽略** → 宽限期耗尽 → `SIGKILL` → `被信号 9 杀死 [沙箱强制执行]`。演示了对不配合代码的**强制终止**。
3. **`test_sleep`** → CPU 保持在 `0.000s`,在`超过墙上时间限制`时被杀死。演示了**独立于目标 CPU 使用率和配合度**的时间强制执行。
4. **`test_mem`** → RSS 在每次采样时攀升,在`超过内存限制`时被杀死。演示了通过 `/proc` 采样实现的外部资源上限。
5. **`test_fork`** → 受 `RLIMIT_NPROC` 限制;整个**进程组**被拆除。演示了子树拆除和进程数限制。
6. **`race_demo`** → 一个 `volatile` 计数器在竞争下会丢失更新(偶尔会“走运”),而 C11 `atomic` 计数器始终精确。演示了为什么共享的强制执行状态使用原子操作(atomics),而不是 `volatile`。
## 设计摘要
`fork()` 为目标提供自己的地址空间;`execve()` 在那里加载不受信任的二进制文件,因此监督者和目标不共享任何可访问的内存。父进程——唯一比子进程寿命更长的受信任方——从 `/proc//stat` 外部测量 CPU 和 RSS,使用看门狗线程中的单调时钟(monotonic clock)对运行进行计时,并通过 `wait4()` 回收子进程。终止过程会升级为 `SIGTERM → SIGKILL`,并被发送到进程**组**,以便任何生成的子进程也会死亡。监视线程之间的所有共享状态都保存在 `` 类型中,终止决策由原子比较并交换(compare-and-swap)操作控制,因此它只会运行一次。`setrlimit()`(NPROC / AS / CPU / CORE)作为持续的**内核后盾**在子进程中应用,以防止实验损害宿主机。
## 安全说明
这里的“不受信任”测试二进制文件是为本课程作业编写的**良性压力测试程序**——无限循环、有界内存分配和有界 fork。它们不包含任何恶意 payload。沙箱设置的 `RLIMIT_NPROC`、`RLIMIT_AS` 和 `RLIMIT_CPU` 后盾确保即使是在 fork 和内存测试中也不会影响宿主机。此沙箱控制的是资源滥用(CPU、内存、时间);它**不**限制网络或文件系统访问,因此真正不受信任的样本应仅在一次性的、网络隔离的 VM 中运行。
## 参考文献
完整的学术参考文献列在随附的书面报告中
(Kerrisk 2010; Stevens & Rago 2013; Love 2013; Silberschatz et al. 2018;
Boehm 2005; Egele et al. 2012; Garfinkel 2003; Provos 2003; ISO/IEC 9899:2011;
Linux man-pages)。
标签:客户端加密, 并发控制, 恶意软件分析沙箱, 系统编程, 资源限制, 进程隔离与监控