【问题标题】:How do you use ptrace to sandbox an untrusted code ran in Rails?您如何使用 ptrace 对在 Rails 中运行的不受信任的代码进行沙箱处理?
【发布时间】:2015-07-07 01:49:09
【问题描述】:

假设我有这个糟糕的控制器代码:

class MovesController < ApplicationController
  def create
    eval(params[:input])
  end
end

一段时间以来,我一直在寻找一种对不受信任的代码执行沙箱的最佳方法,并偶然发现了这个 ruby​​-lang 功能的讨论:https://bugs.ruby-lang.org/issues/8468

这个问题的真正解决方案是在 Ruby 之上运行一个沙箱。我在基于 ptrace 的沙箱内的 http://eval.in 上运行不受信任的代码。 查理萨默维尔

对该主题的进一步研究仅获得纯粹的 ptrace 文档。是否有在 Ruby 和 Rails 中使用 ptrace 的已知实践/库,或者是否需要设置自己的解决方案?

【问题讨论】:

  • 恐怕对这个过程的完整描述超出了我为 StackOverflow 总结的微薄能力。核心思想是您使用 ptrace(2) 来通知所有系统调用,并将您认为“安全”的那些显式列入白名单,并且对于参数可能使其不安全的任何系统调用,您验证参数。 a useful paper 关于使用跟踪机制的监禁进程。您可以寻找 sandboxs4g 作为示例实现。

标签: ruby ruby-on-rails-4 ptrace


【解决方案1】:

有一个名为 trusted-sandbox 的 gem 可以做到这一点。但要小心,因为Docker 实际上并不是防黑客的。

还有GeordiCodePad使用。

ruby 1.8 有一个(错误的?)沙盒实现,但不再受支持。

但实际上,你的问题就像一个老笑话,病人说 “医生,我这样做时很痛。” 医生回答 “好吧,不要那样做。”

你可以做一百万件事:

  • 使用具有一流沙盒功能的语言(如 Lua)。
  • 使用模板语言(如 Liquid 或 Mustache)。为实际需要完成的事情编写自己的解析器。
  • 运行在客户端运行的“程序”(在 javascript 或 hotruby 中),仅将处理后的数据发送回您的服务器。

【讨论】:

  • 谢谢,我提供的赏金是关于如何实现一个使用 ptrace 和 Ruby 的服务器端解决方案(而不是 Docker、Lua、Liquid、javascript——所有这些都是我目前的好解决方案使用)
猜你喜欢
  • 2021-06-06
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多