1

我想为一个在线评委项目执行代码。

我找不到libsandbox的 Python 包装器的文档, 我找到了 sample2.py 和一些测试用例,但没有解释。

创建沙盒时的默认设置是什么?默认情况下是否安全?

我想执行不受信任的代码 - 限制 CPU - 限制内存 - 限制执行时间 - 只允许对特定文件夹进行读/写访问并限制此文件夹的大小。- 阻止网络 IO。- 阻止执行其他程序。

这段代码结合了我发现的两个例子:

cookbook = {
'args': args[1:],               # targeted program
'stdin': sys.stdin,             # input to targeted program
'stdout': sys.stdout,           # output from targeted program
'stderr': sys.stderr,           # error from targeted program
    'jail': './foo',
    'owner': 'nobody',
'quota': dict(wallclock = 30000,# 30 sec
              cpu = 2000,       #  2 sec
              memory = 8388608, #  8 MB
              disk = 1048576)}  #  1 MB
# create a sandbox instance and execute till end
s = Sandbox(**cookbook)
s.run()
s.result == S_RESULT_OK

磁盘配额限制是什么?它是否限制了脚本在此运行中可以写入的总字节数或文件夹的大小?将所有者设置为没人有什么作用?我的示例中的代码会阻止执行任意代码、阻止网络 IO 并阻止访问被监禁文件夹之外的文件吗?

谢谢

4

1 回答 1

4

创建沙盒时的默认设置是什么?默认情况下是否安全?

  • 默认情况下,Sandbox实例是允许的。除非您指定,否则它会授予无限配额quota;它允许所有系统调用,除非您使用自定义策略过滤系统调用事件,否则会导致多处理(即,,,... fork())和进程间通信(即, ...)。vfork()clone()waitid()ptrace()
  • 随附的示例代码 ( sample2.py)libsandbox是限制性白名单沙盒的最小工作示例。将其用作看门狗程序的框架。

磁盘配额限制是什么?它是否限制了脚本在此运行中可以写入的总字节数或文件夹的大小?

  • disk配额限制目标程序可以写入所有符合条件的文件系统(即支持配额限制并能够生成SIGXFSZ信号的文件系统)的总字节数。
  • ext3如果程序在文件系统或文件系统上写入常规文件ext4,这通常很重要;但写入标准输出流或/dev/null不计入配额。不过,您可以在自定义策略中实施基于文件夹的配额。

设置ownernobody什么?

  • 代表用户执行目标程序nobody。该owner参数包装了操作系统级别的服务setuid()。之后setuid()nobody目标程序拥有操作系统授予用户的所有权限nobody,除此之外没有其他权限。
  • 请注意,您必须是超级用户才能指定您owner以外的其他用户。

我的示例中的代码会阻止执行任意代码、阻止网络 IO 并阻止访问被监禁文件夹之外的文件吗?

  • 不完全是。程序进行的所有系统调用都会报告给沙箱,但您必须插入一个策略模块,明确阻止与网络 IO 相关的系统调用。或者,您可以像示例代码一样,根据白名单过滤所有系统调用sample2.py
  • 另请注意,您必须是超级用户才能指定jail根目录以外的目录/

免责声明:我是libsandbox.

于 2013-02-28T18:37:32.553 回答