讨厌的事情用户在服务器中提供的ruby代码可以做到

use*_*362 2 ruby security

我想在服务器中运行用户提供的ruby代码,可能会发生哪些可能令人讨厌的事情?我的意思是删除文件等等.你能给我更多例子吗?

提前致谢!

Mar*_*off 8

Ruby允许您设置一个$SAFE全局变量,该变量将准确确定允许的污染代码.在Locks 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#陷阱.Process :: setpgid,Process :: setsid,Process :: setpriority或Process :: egid =.
  • 无法使用陷阱处理信号.

$ SAFE> = 3

  • 所有对象都被创建了污点.
  • 无法解开对象.

$ SAFE> = 4

  • 无法修改未着色的数组,哈希或字符串.
  • 无法修改全局变量.
  • 无法访问未着色对象的实例变量.
  • 无法更改环境变量.
  • 无法关闭或重新打开未着色的文件.
  • 无法冻结未着色的对象.
  • 无法更改方法的可见性(私人/公共/受保护).
  • 无法在非着色类或模块中创建别名.
  • 无法获取元信息(例如方法或变量列表).
  • 无法在未着色的类或模块中定义,重新定义,删除或取消方法.
  • 无法修改Object.
  • 无法从非着色对象中删除实例变量或常量.
  • 无法操纵线程,终止当前线程以外的线程,或者设置abort_on_exception.
  • 不能有线程局部变量.
  • 无法在具有较低$ SAFE值的线程中引发异常.
  • 无法在ThreadGroup之间移动线程.
  • 无法调用exit,exit!或abort.
  • 只能加载包装的文件,并且不能包含未打印的类和模块中的模块.
  • 无法将符号标识符转换为对象引用.
  • 无法写入文件或管道.
  • 不能使用自动加载.
  • 无法污染物体.