Oct 29

闲谈 Restricted Function 不指定

felix021 @ 2010-10-29 21:02 [IT » 软件] 评论(4) , 引用(0) , 阅读(18720) | Via 本站原创 | |
这个词组在ACM/ICPC的各大OJ出现频率还是很高的,意思是使用了“受限制的函数”。

而且几乎没有准确的文档可以定义什么是"Restricted Function"(RF,非彼“RF”)。因为开发者也很郁闷。一个大致可以接受的解释是,任何可能威胁到系统安全的代码都不应该被执行。更严格一点,任何解题所不需要用到的函数都不应该调用。但是这两个解释都不够准确。

作为一个需要编译并运行用户任意代码的系统,必然需要对用户的代码/程序进行额外的处理,过滤可能对服务器产生危险的操作。在woj-land ( http://code.google.com/p/woj-land ) 的实现中,是采用运行时监控程序的执行,通过ptrace来拦截并检查每一个系统调用,如果发现系统调用不在白名单中,即出现RF。具体的代码可参见:http://code.google.com/p/woj-land/source/browse/trunk/code/judge/rf_table.h

白名单机制是最安全的了,但是有缺陷。

首先是很难考虑到所有的情况。举例来说,你用C语言写的A+B来测试的话,需要的系统调用只有几个。大多数情况下能够满足要求,但是有时候却发现不对。比如说SYS_futex这个系统调用,如果不被允许,glibc写的程序在执行时可能会出问题。

其次是过于严格,导致部分常用且不影响系统安全的函数被限制死。比如说fflush,只需要用到SYS_lseek调用即可。

再次是有些异常情况。一个典型的情况是使用 qsort(arr, N, sizeof(arr), cmp); 这样的代码。实际上应当是sizeof(int),不小心写错了,访问出错。典型的情况是某些非法内存访问,Glibc会open("/dev/tty",...),write()一些错误信息,然后open("/proc/self/maps", ...)把进程的内存映射表输出。还有一个更常见的情况,那就是用qsort。GCC的qsort实现,会主动open(/proc/meminfo),获取一些信息,通过这些信息来最优化排序时的内存管理。于是本来应该是运行时错误(段访问异常),即Runtime Error(SIGSEGV)的情况也被误判为Restricted Function了。

終り.

闲谈 Restricted Function #2



欢迎扫码关注:




转载请注明出自 ,如是转载文则注明原出处,谢谢:)
RSS订阅地址: https://www.felix021.com/blog/feed.php
digiter
2010-11-4 09:48
哦,就是自己提供函数原型就可以了吧?收益匪浅阿~~
话说你和GCCFeli为什么都有feli这个名字呢?
felix021 回复于 2010-11-4 10:09
碰巧而已~
digiter
2010-11-1 22:29
你的代码是什么意思?
felix021 回复于 2010-11-2 09:14
不需要string.h,同样可以用strlen。
digiter
2010-11-1 09:14
说个土方法,因为使用函数都是要include的,所以我把相应头文件里的危险函数直接注释掉,比如把system函数注释掉,这样的解决方案你觉得怎么样呢?
felix021 回复于 2010-11-1 09:23
只是设置一个小门槛而已。系统调用可以通过asm指令来完成。另外,这个代码也是可以编译运行的:#include <stdio.h>_CRTIMP size_t __cdecl  strlen (const char*)  __MINGW_ATTRIB_PURE; int main() {    printf("%d", strlen("123"));    return 0;}
Dumbear Email Homepage
2010-10-29 21:22
一直很好奇RF是怎么检测的说……想当年VIJOS上是直接在代码中找关键字- -||然后我定义个换行的宏就绕过去了……汗……
felix021 回复于 2010-10-30 09:01
看看源码吧~源码之前,了无秘密。当年WOJ-Noah/Oak是在编译后的代码中提取Symbol,并用黑名单机制来排除。但是可以用汇编代码来执行系统调用。
分页: 1/1 第一页 1 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   *非必须
网址   电邮   [注册]