Vakuum开发笔记02 核心与安全问题
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 核心与安全问题的更多相关文章
- Vakuum开发笔记01 开天辟地
1.缘起 先驱--COGS 早在2008年,我自学PHP后开发了COGS,并成功用于学校内部的OJ,ruvtex.也曾经对外开放过,但是由于学校网络不稳定,后来一直连不上了.我还把COGS推荐给了OO ...
- TERSUS无代码开发(笔记02)-简单实例加法
简单实例加法 1.用户端元件(显示元件)(40个) 图标 英文名称 元件名称 使用说明 服务器端 客户端 Pane 显示块 是一个显示块,是HTML的div标签 √ Row 行 行元件中的显示元件 ...
- 【IOS开发笔记02】学生管理系统
端到端的机会 虽然现在身处大公司,但是因为是内部创业团队,产品.native.前端.服务器端全部坐在一起开发,大家很容易做零距离交流,也因为最近内部有一个前端要转岗过来,于是手里的前端任务好像可以抛一 ...
- 微信小程序开发笔记02
今天学习了微信小程序开发用到的语言,wxml与wxss语言基本语法与html和css基本语法相似,学习起来相对简单.在小程序主要的语言是js(javascript,跟准确的说是jqery) ,由于这种 ...
- 夜色的 cocos2d-x 开发笔记 02
本章我们让飞机发射子弹,因此我们要写这样一个方法 子弹资源:欢迎下载 很详细的注释吧,现在有几个地方报错,.h文件里面一定要先声明 这里是本章所有的新方法,你可以一次声明全部,嗯,还有个报错应该是我们 ...
- TERSUS无代码开发(笔记03)-常用快捷键
常用快捷键 1.a 普通行为元件调用 2.b 判断输入的值是什么值 3.c 有条件的传值处理 4.e 输出元件 5.f 传值或流程 6.t 输入元件 7.p 调用元件查询 8.x 判断是否有输入值 图 ...
- TERSUS无代码开发(笔记01)-按装下载和基础语法
1.中国官网 https://tersus.cn/ 2.下载:https://tersus.cn/download/ 3.开发文档:https://tersus.cn/docs/ 4.基本元件说明 图 ...
- 《30天自制操作系统》笔记(02)——导入C语言
<30天自制操作系统>笔记(02)——导入C语言 进度回顾 在上一篇,记录了计算机开机时加载IPL程序(initial program loader,一个nas汇编程序)的情况,包括IPL ...
- [Openwrt 项目开发笔记]:Openwrt平台搭建(一)
[Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 最近开始着手进行Openwrt平台的物联网网关设 ...
随机推荐
- spring boot 分布式事务实现(XA方式)
关于spring boot 支持分布式事务,XA是常用的一种方式. 这里把相关的配置记下,方便以后使用. 首先配置两个不同的数据源 : 订单库.持仓库. /** * Created by zhangj ...
- SQL记录-PLSQL游标
PL/SQL游标 Oracle会创建一个存储区域,被称为上下文区域,用于处理SQL语句,其中包含需要处理的语句,例如所有的信息,行数处理,等等. 游标是指向这一上下文的区域. PL/SQL通过控制光标 ...
- bzoj千题计划267:bzoj3129: [Sdoi2013]方程
http://www.lydsy.com/JudgeOnline/problem.php?id=3129 如果没有Ai的限制,就是隔板法,C(m-1,n-1) >=Ai 的限制:m减去Ai &l ...
- [原]Android开发优化-Adapter优化
ListView作为Android开发中使用频率最高的一个控件,保证ListView的流畅运行,对用户体验的提高至关重要.Adapter是ListView和数据源之间的中间人,当每条数据进入可见区时, ...
- Integer中1000==1000为false而100==100为true
查看Integer.java类,会发现有一个内部私有类,IntegerCache.java,它缓存了从-128到127之间的所有的整数对象.如果在这个区间内,他就会把变量当做一个变量,放到内存中:但如 ...
- ZYNQ. Interrupt(1)Private Timer
Interrupt zynq的中断. The PS is based on ARM architecture, utilizing two Cortex-A9 processors(CPUs) and ...
- linux内存管理-内核用户空间 【转】
转自:http://blog.chinaunix.net/uid-25909619-id-4491362.html 1,linux内存管理中几个重要的结构体和数组 page unsigned long ...
- 使用eclipse构建Maven项目及发布一个Maven项目
开发环境: Eclipse Jee Mars(截止2015年12月1日目前的最新版eclipse4.5),下载地址:http://www.eclipse.org/downloads/ 因为此版本已经集 ...
- Ubuntu 12.04 安装Tomcat7
1.下载Tomcat7 打开Tomcat官网 http://tomcat.apache.org,在左边的导航栏的“Download"中找到Tomcat7.0目录,点击后进入Tomcat7的页 ...
- POJ 3281 Dining(最大流+拆点)
题目链接:http://poj.org/problem?id=3281 题目大意:农夫为他的 N (1 ≤ N ≤ 100) 牛准备了 F (1 ≤ F ≤ 100)种食物和 D (1 ≤ D ≤ 1 ...