CC's

Back

内容有复制和参考。

这篇文章主要用于记录在探索评测系统Reef期间我所学的东西,以便之后查阅.

Reef预计主要支持远程评测

加一点本地评测…

结果主要的东西都特么是本地评测的.

总体架构#

Reef预计将采用seccomp作为第一道安全关卡,使用多线程检测程序耗时/内存等信息.

在外层使用docker封装并再次限制资源,接入队列以能够方便的横向扩展.

seccomp#

seccomp为linux系统上才有的安全技术,因此必须使用linux.在安装必要的安装包后

$ sudo apt install libseccomp2 libseccomp-dev seccomp
bash

即可使用.

当然,在windows下的Jobs似乎也可以利用,但是我不太懂,微软文档写得也奇怪,而且还得是服务器版本的windows才能用.

基本使用#

seccomp需要由程序主动加载.其使用方法基本为下

seccomp_init是初始化的过滤状态,这里用的是SCMP_ACT_ALLOW,表示默认允许所有的syscacll.如果初始化状态为SCMP_ACT_KILL,则表示默认不允许所有的syscall.

规则添加

seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(execve), 0);,arg_cnt为0,表示直接限制execve,不管他什么参数.

如果arg_cnt不为0,那arg_cnt表示后面限制的参数的个数,也就是只有调用execve,且参数满足要求时,才会拦截syscall.

seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(write),1,SCMP_A2(SCMP_CMP_EQ,0x10));//第2(从0)个参数等于0x10
plaintext

ctx的内容可以使用函数dump出来,之后可以直接使用prctl命令相关直接载入,方便使用?

seccomp调试#

使用如下命令导出所有可能的命令

file=syscall-names.h
echo "static const char *syscall_names[] = {" > $file
echo "#include <sys/syscall.h>" | cpp -dM | grep &#039;^#define __NR_&#039; | LC_ALL=C sed -r -n -e &#039;s/^\#define[ \t]+__NR_([a-z0-9_]+)[ \t]+([0-9]+)(.*)/ [\2] = "\1",/p&#039; >> $file
echo "};" >> $file
bash

使用如下代码导出一段代码所需要的权限.遵循最小权限原则,试验代码运行所需要的最少权限.

注入程序#

刚刚提到了seccomp必须由程序主动加载,因此需要有一个办法将代码注入到用户的代码中.

等待完成

其他语言#

这玩意貌似至少能方便的用在c系语言,java和python上.

Docker#

准备使用Docker重构整个OJ

多阶段构建#

使用Docker,将OJ分解为多个阶段来构建.

  1. 前端构建
  2. 后端构建
  3. 运行环境构建与代码整合
  4. nginx构建

命令#

容器协调#

使用Docker-compose来协调各个容器的关系.

  • 数据库容器
  • redis容器
  • 网站后端容器
  • 评测器容器
  • 评测代理容器
  • nginx容器

限制评测器容器的资源消耗的例子

deploy:
  resources:
    limits:
      cpus: &#039;0.50&#039;
      memory: 1024M
yml

网络#

…学校网关的登录状态根本没法维持,卡死.

OJ的后端
https://astro-pure.js.org/blog/backend-of-oj
Author Cheng Chen
Published at 2019年8月22日
Comment seems to stuck. Try to refresh?✨