我想在服务器中运行用户提供的ruby代码,可能会发生哪些可能令人讨厌的事情?我的意思是删除文件等等。你能给我更多例子吗?
提前致谢!
答案 0 :(得分:8)
Ruby允许您设置一个$SAFE
全局变量,该变量将准确确定允许的污染代码。请在Locking Ruby in the Safe中了解详情。
换句话说,这是关于$SAFE
:
$ SAFE约束
0不检查是否使用了外部提供的(污染的)数据。这是Ruby的默认模式。
> = 1 Ruby不允许通过潜在的危险操作使用受污染的数据。
> = 2 Ruby禁止从全局可写位置加载程序文件。
> = 3所有新创建的对象都被视为污染。
> = 4 Ruby有效地将正在运行的程序分为两部分。未着色的对象可能无法修改。通常,这将用于创建沙箱:程序使用较低的
$SAFE
级别设置环境,然后将$SAFE
重置为4以防止对该环境进行后续更改。
这是链接页面底部表格中的内容,它解释了每个$SAFE
级别允许的受污染对象。由此,您可以轻松地推断Ruby代码可以执行哪些不良操作。
安全级别的定义
$ SAFE> = 1
- 未处理环境变量RUBYLIB和RUBYOPT,并且当前目录未添加到路径中。
- 不允许使用命令行选项-e,-i,-I,-r,-s,-S和-x。
- 如果其中的任何目录是全局可写的,则无法从$ PATH启动进程。
- 无法操作或chroot到名称为受污染字符串的目录。
- 不能全球污染字符串。
- 无法评估受污染的字符串。
- 无法加载或要求名称为受污染字符串的文件。
- 无法操纵或查询名称为受污染字符串的文件或管道的状态。
- 无法执行系统命令或从受污染的字符串执行程序。
- 无法通过捕获受污染的字符串。
$ SAFE> = 2
- 无法更改,制作或删除目录,或使用chroot。
- 无法从世界可写目录加载文件。
- 无法从以〜。
开头的受污染文件名加载文件- 无法使用File#chmod,File#chown,File#lstat,File.stat,File#truncate,File.umask,File#flock,IO#ioctl,IO#stat,Kernel#fork,Kernel #syscall ,Kernel #track。 Process :: setpgid,Process :: setsid,Process :: setpriority或Process :: egid =。
- 无法使用陷阱处理信号。
$ SAFE> = 3
- 所有对象都被污染了。
- 无法取消对象。
$ SAFE> = 4
- 无法修改未着色的数组,散列或字符串。
- 无法修改全局变量。
- 无法访问未着色对象的实例变量。
- 无法更改环境变量。
- 无法关闭或重新打开未着色的文件。
- 无法冻结未着色的物体。
- 无法更改方法的可见性(私人/公共/受保护)。
- 无法在未打印的类或模块中创建别名。
- 无法获取元信息(例如方法或变量列表)。
- 无法定义,重新定义,删除或取消未打印的类或模块中的方法。
- 无法修改对象。
- 无法从非着色对象中删除实例变量或常量。
- 无法操纵线程,终止当前线程以外的线程,或设置abort_on_exception。
- 不能有线程局部变量。
- 无法在$ SAFE值较低的线程中引发异常。
- 无法在ThreadGroup之间移动线程。
- 无法调用exit,exit!或abort。
- 只能加载包装的文件,并且不能在非打印的类和模块中包含模块。
- 无法将符号标识符转换为对象引用。
- 无法写入文件或管道。
- 无法使用自动加载。
- 无法玷污物品。
答案 1 :(得分:1)
您所有的基地都属于用户。
答案 2 :(得分:1)
如果你在普通的Ruby下运行,那么你现在的用户权限几乎可以做任何事情 - 所以写,删除和覆盖大多数文件等等。