在线评测(OJ)系统的沙盒开发

在线评测(OJ)系统的沙盒开发

历程

因为要帮助社团开发一个OJ系统, 考虑到安全问题, 所以想要开发一个沙盒. 基本需求是可以限制进程可使用的资源, 限制进程可使用系统调用.

起初看了一些博客, 大部分是说使用cgroup的, 但是cgroup使用起来实在是太费力, 而且我的项目很小需求也不复杂, 遂抛弃cgroup.

之后在广泛的查找资料的过程中发现了ptrace, 但是ptrace的原理使得程序执行频繁中断, 很慢, 遂抛弃ptrace.

后来看一篇论文, 发现了libseccomp这个库, 配合Linux的setrlimit调用, 编译成了动态链接库供Python调用. 使用这个思路首先实现了第一版沙盒, 基本满足了我的需求. 但用到libseccomp一直给我一种大炮打蚊子的感觉. 而且python调用C动态链接库也总感觉有些复杂.

最新一般使用了Linux的一种链接技术: LD_PRELOAD. 使用这个环境变量可以使得程序在执行时优先加载它指定的动态链接库. 我编写了一套假的什么都不做的系统调用, 将它们整合编译为一个动态链接库, 使用LD_PRELOAD提高此假库的加载优先级, 成功实现了系统调用的限制. 后又发现python已经整合setrlimit, 最终实现了无C代码, 全python的结果, 而且评测效率较ptrace, libseccomp有所提高. 细节可查看我的github和gitee

github

gitee

上一篇:通过ptrace跟踪进程2


下一篇:【Android 逆向】代码调试器开发 ( ptrace 函数 | 向进程内存写出数据 )