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平台的物联网网关设 ...
随机推荐
- 文件通过svn updata更新不到,并且svn st显示被删除的解决办法
不知道什么原因导致某些文件丢失,svn updata更新后仍然没有找到,采用svn st 显示这些文件被删除,svn reslove 也解决不了,头疼了很久,最近突然解决了,具体步骤如下(已经过验证) ...
- Extending Markov to Hidden Markov
Extending Markov to Hidden Markov a tutorial on hidden markov models, Hidden Markov Models, hidden m ...
- CSS那些事!这个篇幅是我特意开的,不是因为帮助小菜之类的,而是在多人的团队配合中各种命名冲突的规范让人蛋疼
CSS那些事!这个篇幅是我特意开的,不是因为帮助小菜之类的,而是在多人的团队配合中各种命名冲突的规范让人蛋疼. css这个东西只要不是新的离谱都会写,但是每个人的命名风格,方法,都不同 有人喜欢驼峰, ...
- [转载]必须Mark!最佳HTML5应用开发工具推荐
http://www.csdn.net/article/2014-04-25/2819503-10-html5-tools-worth-checking-out/2 摘要:HTML5自诞生以来,作为新 ...
- 封装JSON数据转自定义HTML方法parseHTML
开发过程中经常使用字符串拼接,这样做工作效率低,可维护性和易读性也比较差,且对于后台程序员对html不熟悉,经常出错. 如下面例子json转字符串: var json = [{ href:'http: ...
- CentOS7 关闭防火墙和selinux
本文将简单介绍在CentOS7上如何临时和永久关闭防火墙和selinux. 关闭防火墙 # 查看防火墙状态 [root@localhost ~]# systemctl status firewalld ...
- Jmeter如何保持cookie,让所有请求都能用同一个cookie,免去提取JSESSIONID
近期有柠檬班的学生找到华华,问了一个问题,就是利用Jmeter做接口测试的时候,如何提取头部的JSESSIONID然后传递到下一个请求,继续完成当前用户的请求. 其实,关于这个问题有三种种解决方法: ...
- org.hibernate.TransientObjectException异常
代码如下: /** * 测试4:新增一个秘书角色,并赋给张三该角色 */ @Test public void test4(){ Session session = HibernateUtils.ope ...
- BAT修改文本内容
@echo off (for /f "delims=" %%a in (文件名) do ( set "str=%%a" setlocal enabledelay ...
- centos:SSH登录时间很慢
vi /etc/ssh/sshd_config GSSAPIAuthentication 改为 no 开启UseDNS,值改为 no service sshd restart