3.judger核心设计

评测系统最重要部分就是评测核心了(judger)。核心judger负责了编译、执行、检查三大部分,也就是评测系统的灵魂所在,因此judger设计的好坏,直接影响到整个评测系统的整体水准。judger的设计要考虑到几个方面,首先是对安全性要求很高。别忘了,这是一个在线评测系统,任何人都可以提交任何代码,并在服务器上执行,这意味着给骇客们提供了方便之门。骇客们(注意,不是黑客)总是希望得到一个Shell,并在上面执行想要的命令。而评测系统直接允许了源码的提交,如果我是骇客的话简直乐坏了。当然,只有傻瓜才会对用户提交的代码直接编译、运行,就像编译自己的程序一样,限制是必不可少的。

不当的方法

一个愚蠢的方案是直接对代码进行扫描,然后过滤掉某些字符串,如"system"。当然这个过滤列表可能长得匪夷所思,就像某墙,然而绕过它却是很容易的,例如以下代码:

#include <stdlib.h>
#define dosomething sys##tem
int main()
{
dosomething("shutdown");
return 0;
}

怎么办呢?有人会继续想到,我可以用g++的-E命令,将预处理以后的代码输入到一个文件中,然后再检查关键字。这样的话上面的方法就不行了,不过更厉害的骇客还有办法。什么办法呢?直接按地址调用函数,代码如下:

#include <stdlib.h>
int main()
{
int (*func)(char *);
func = (int (*)(char*))134513676;
func("ls");
return 0;
}

上述代码中的数值就是 system函数的绝对地址,在不同的环境中不一样,不过获取这个数值并不困难的。由此可见,依靠过滤源代码的方式几乎是行不通的安全性解决方案。如果不依赖检查源代码,就要监控程序的“行为”,这就需要比较复杂的调试器技术了。在Linux下,有一个ptrace函数,可以在程序运行时监测程序的行为,捕获接收到的信号。

解决方案

vakuum的执行器executor,就是用的ptrace的原理。主程序为两个进程,子进程用来执行用户程序,父进程用来监视子进程。子进程每进行系统调用的时候,运行就被中断,由父进程检查子进程的行为是否合法,如果不合法就杀掉子进程。对于open调用,还要检查用户打开的文件是否被允许。有了这个程序,监控程序的用户时间和内存也就不难了,用户时间的监测需要在每个系统调用后检查,对于内存,在任何一个与内存分配相关的系统调用后检查一下/proc/{pid}/statm即可。

如此还有一个问题容易被忽略,就是如果用户程序中长时间不进行系统调用,只是在做一些运算的时候,如何让程序暂停下来判断是否超时呢?设置CPU_Limit为时间限制显然是不行的,因为在监控下的用户程序可能会运行时间更久。不知道大家在用Cena的时候是否发现过一个现象,例如某个程序本来运行0.8秒,设为1秒时限以后显示超时,设为2秒时间反而显示成了0.8秒。这是怎么回事呢?很可能就是设定了不合适的CPU_Limit。稳妥的方法是设置为时间限制的若干倍,但是到底是几倍不好估计,而且很多时候还会浪费时间。思考问题的根源还在于长时间没有被暂停,我的解决方法是给父进程设置一个alarm,每秒向子进程发送一个信号,设置子进程接收到信号以后也会暂停,并检查时间是否超时。这样的话,超时的程序最多会在不超过时限1秒的情况下被终止。

在这种严密的监控下,很难找到突破的方法,至少我至今还没有想到如何攻破executor的监控。其代价就是降低执行效率了,不过由于我监视的是用户时间,用户程序不会被误判超时,尽管感觉实际执行时间多了不少。如果你有什么攻破监控想法,欢迎与我联系做安全性测试。

潜在的缺陷

虽然我并不了解,但是我还是担心,如果用户程序中有汇编代码嵌入,是否可以获得底层的权限。如果真的可以,我还没有想到应对的方法。

Vakuum开发笔记02 核心与安全问题的更多相关文章

  1. Vakuum开发笔记01 开天辟地

    1.缘起 先驱--COGS 早在2008年,我自学PHP后开发了COGS,并成功用于学校内部的OJ,ruvtex.也曾经对外开放过,但是由于学校网络不稳定,后来一直连不上了.我还把COGS推荐给了OO ...

  2. TERSUS无代码开发(笔记02)-简单实例加法

    简单实例加法 1.用户端元件(显示元件)(40个) 图标 英文名称 元件名称 使用说明 服务器端 客户端 Pane 显示块 是一个显示块,是HTML的div标签   √ Row 行 行元件中的显示元件 ...

  3. 【IOS开发笔记02】学生管理系统

    端到端的机会 虽然现在身处大公司,但是因为是内部创业团队,产品.native.前端.服务器端全部坐在一起开发,大家很容易做零距离交流,也因为最近内部有一个前端要转岗过来,于是手里的前端任务好像可以抛一 ...

  4. 微信小程序开发笔记02

    今天学习了微信小程序开发用到的语言,wxml与wxss语言基本语法与html和css基本语法相似,学习起来相对简单.在小程序主要的语言是js(javascript,跟准确的说是jqery) ,由于这种 ...

  5. 夜色的 cocos2d-x 开发笔记 02

    本章我们让飞机发射子弹,因此我们要写这样一个方法 子弹资源:欢迎下载 很详细的注释吧,现在有几个地方报错,.h文件里面一定要先声明 这里是本章所有的新方法,你可以一次声明全部,嗯,还有个报错应该是我们 ...

  6. TERSUS无代码开发(笔记03)-常用快捷键

    常用快捷键 1.a 普通行为元件调用 2.b 判断输入的值是什么值 3.c 有条件的传值处理 4.e 输出元件 5.f 传值或流程 6.t 输入元件 7.p 调用元件查询 8.x 判断是否有输入值 图 ...

  7. TERSUS无代码开发(笔记01)-按装下载和基础语法

    1.中国官网 https://tersus.cn/ 2.下载:https://tersus.cn/download/ 3.开发文档:https://tersus.cn/docs/ 4.基本元件说明 图 ...

  8. 《30天自制操作系统》笔记(02)——导入C语言

    <30天自制操作系统>笔记(02)——导入C语言 进度回顾 在上一篇,记录了计算机开机时加载IPL程序(initial program loader,一个nas汇编程序)的情况,包括IPL ...

  9. [Openwrt 项目开发笔记]:Openwrt平台搭建(一)

    [Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 最近开始着手进行Openwrt平台的物联网网关设 ...

随机推荐

  1. bzoj千题计划247:bzoj4903: [Ctsc2017]吉夫特

    http://uoj.ac/problem/300 预备知识: C(n,m)是奇数的充要条件是 n&m==m 由卢卡斯定理可以推出 选出的任意相邻两个数a,b 的组合数计算C(a,b)必须是奇 ...

  2. bzoj千题计划181:bzoj1878: [SDOI2009]HH的项链

    http://www.lydsy.com/JudgeOnline/problem.php?id=1878 之前用莫队做的,现在用树状数组 把每种数的第一个出现位置在树状数组中+1 nxt[i] 记录i ...

  3. 前三章 man手册 查看文件

    1 – 3章 1.1 man手册: 分1 - 9个区域,可以认为是一个一个小节 把man手册理解为一本书 第一节:可执行程序或shell命令 第二节:系统调用 第三节:库调用 第四节:特殊文件 第五节 ...

  4. javascript设计模式开篇:Javascript 接口的实现

    javascript语言不像java. c#. c++等面向对象语言那样有完备的接口支持,在javascript中,接口的实现有三种方式,分别为注释描述.属性检查.鸭式变形.注释描述实现起来最为简单, ...

  5. spring Mvc Web 编码相关 [model 到 视图传递数据] (九)

    在某种编码环境,由bean注解的参数可能会发生乱码问题. 即可页面web.xml或其他地方都设备UTF-8, 但还是会有这样的问题. 首先不要使用model传到视图的数据. 第二,不要request. ...

  6. 第6月第19天 lua动态链接库(luaopen_*函数的使用) skynet

    1. 给这个测试库取名为dylib,它包含一个函数add.lua中这样使用: local dylib = require "dylib.test"    local c = dyl ...

  7. Nginx使用笔记

    本篇记录使用Nginx的一些tricks. 一.更改默认Web根目录 修改配置文件 Nginx默认的Web根目录是:/usr/share/nginx/html/,一般我们都是习惯的是:/var/www ...

  8. 数链剖分(Tree)

    题目链接:https://cn.vjudge.net/contest/279350#problem/D 题目大意:操作,单点查询,区间取反,询问区间最大值. AC代码: #include<ios ...

  9. Hacking Using Beef-Xss

    1.环境 hacker:192.168.133.128 os:Kali victims:192.168.133.1    os:win8 2.前期配置 首先进入beef-xss主目录,编辑配置文件,将 ...

  10. Dream------hive on spark

    一.Hive on Spark是Hive跑在Spark上,用的是Spark执行引擎,而不是MapReduce,和Hive on Tez的道理一样. 并且用的是$HIVE_HOME/bin/hive,l ...