Linux上的进程忽略资源限制
我曾经在stackoverflow上问了一些关于开发网上裁判的问题,我发现了很多好的答案。 我开始着手开发一个,我似乎遇到了我的代码中的一个主要缺陷。
用户提交的源代码将在服务器上编译。 这由exec()在分叉进程中执行gcc完成。 现在我设置了CPU时间的资源限制,并且超过了这个限制,SIGXCPU信号被发送到进程。 一切都很好,直到现在。 但假设有人编写处理SIGXCPU代码本身的恶意代码,然后它将继续在服务器上运行,并可能为某人开启远程控制服务器的方式。
那么我在这里错过了什么? 这一定是可以预防的。
编译模块的基本原型如下所示:
int main() { int pid; int rv; if (!( pid=fork() )) { struct rlimit limit; getrlimit(RLIMIT_CPU, &limit); limit.rlim_cur = 1; setrlimit(RLIMIT_CPU, &limit); //execl() with gcc and source file name } else if(pid) { wait(&rv); } else printf("Error forkingn"); return 0; }
如果源文件包含类似的东西
void handler(int signum) { if (signum == SIGXCPU) printf("Caught SIGXCPU signaln"); } int main() { signal(SIGXCPU, handler); while(1); return 0; }
这是很大的麻烦
在linux上,具体来说,用户可以做你说的话。 但是如果达到硬限制(相对于你设置的软限制),linux会发送sigkill到进程,并且这将终止进程。
(但请记住,你真的需要在chrooted环境中运行你的东西)
哇。 考虑到这个令人望而生畏的工作大约7分钟,我会提前道歉,因为我将要说的任何愚蠢的事情。
这是否会像UVA法官一样?
如果目标是允许相对简单的程序在不允许恶意用户破坏系统的情况下运行,那么似乎您需要比这更积极主动,否则您将修补漏洞直到时间结束。
至少我认为你需要去除用户头文件并用你自己的包含最小功能的一个代替。 禁止汇编。 使用修改过的stdlib和/或内核,该操作不会在任何尝试的系统调用()等操作或杀死该进程。
这里有很多需要考虑的事情。
链接地址: http://www.djcxy.com/p/80293.html上一篇: Process on linux ignoring resource limits
下一篇: How can we know the minimum stack size needed by a program launched with exec()?