[#8566] Visions for 2001/1.7.x development? — Robert Feldt <feldt@...>

Hi matz and other Ruby developers,

18 messages 2001/01/03
[#8645] Re: Visions for 2001/1.7.x development? — matz@... (Yukihiro Matsumoto) 2001/01/04

Hi,

[#8580] bug?? — jmichel@... (Jean Michel)

I don't understand the following behaviour:

19 messages 2001/01/03

[#8633] Interesting Language performance comparisons - Ruby, OCAML etc — "g forever" <g24ever@...>

13 messages 2001/01/04

[#8774] No :<, :>, etc. methods for Array — "Brian F. Feldman" <green@...>

So, why not include Comparable in Array by default? It shouldn't have any

28 messages 2001/01/07
[#8779] Re: No :<, :>, etc. methods for Array — matz@... (Yukihiro Matsumoto) 2001/01/07

Hi,

[#8780] Re: No :<, :>, etc. methods for Array — "Brian F. Feldman" <green@...> 2001/01/07

matz@zetabits.com (Yukihiro Matsumoto) wrote:

[#8781] Re: No :<, :>, etc. methods for Array — gotoken@... (GOTO Kentaro) 2001/01/07

In message "[ruby-talk:8780] Re: No :<, :>, etc. methods for Array"

[#8782] Re: No :<, :>, etc. methods for Array — "Brian F. Feldman" <green@...> 2001/01/07

gotoken@math.sci.hokudai.ac.jp (GOTO Kentaro) wrote:

[#8829] Sandbox (again) — wys@... (Clemens Wyss)

Hi,

20 messages 2001/01/08
[#8864] Re: Sandbox (again) — Clemens Hintze <c.hintze@...> 2001/01/08

On 8 Jan, Clemens Wyss wrote:

[#8931] String confusion — Anders Bengtsson <ndrsbngtssn@...>

Hello everyone,

21 messages 2001/01/09
[#8937] Re: String confusion — matz@... (Yukihiro Matsumoto) 2001/01/09

Hi,

[#8953] Please remove account from files — "Thomas Daniels" <westernporter@...>

Please take my e-mail address from your files and "CANCEL" my =

14 messages 2001/01/09
[#8983] Re: Please remove account from files — John Rubinubi <rubinubi@...> 2001/01/10

On Wed, 10 Jan 2001, Thomas Daniels wrote:

[#9020] time to divide -talk? (was: Please remove account from files) — Yasushi Shoji <yashi@...> 2001/01/10

At Wed, 10 Jan 2001 14:23:30 +0900,

[#9047] Re: time to divide -talk? (was: Please remov e account from files) — Aleksi Niemel<aleksi.niemela@...>

Yasushi Shoji:

27 messages 2001/01/10
[#9049] Re: time to divide -talk? — Yasushi Shoji <yashi@...> 2001/01/10

At Thu, 11 Jan 2001 00:20:45 +0900,

[#9153] what about this begin? — Anders Strandl Elkj誡 <ase@...> 2001/01/11

[#9195] Re: Redefining singleton methods — ts <decoux@...>

>>>>> "H" == Horst Duch=EAne?= <iso-8859-1> writes:

10 messages 2001/01/12

[#9242] polymorphism — Maurice Szmurlo <maurice@...>

hello

73 messages 2001/01/13

[#9279] Can ruby replace php? — Jim Freeze <jim@...>

When I read that ruby could be used to replace PHP I got really

15 messages 2001/01/14

[#9411] The Ruby Way — "Conrad Schneiker" <schneiker@...>

As a member of the "Big 8" newsgroups, "The Ruby Way" (of posting) is to

15 messages 2001/01/17

[#9462] Re: reading an entire file as a string — ts <decoux@...>

>>>>> "R" == Raja S <raja@cs.indiana.edu> writes:

35 messages 2001/01/17
[#9465] Re: reading an entire file as a string — Dave Thomas <Dave@...> 2001/01/17

raja@cs.indiana.edu (Raja S.) writes:

[#9521] Larry Wall INterview — ianm74@...

Larry was interviewed at the Perl/Ruby conference in Koyoto:

20 messages 2001/01/18
[#10583] Re: Larry Wall INterview — "greg strockbine" <gstrock@...> 2001/02/08

Larry Wall's interview is how I found out

[#9610] Re: 101 Misconceptions About Dynamic Languages — "Ben Tilly" <ben_tilly@...>

"Christian" <christians@syd.microforte.com.au> wrote:

13 messages 2001/01/20

[#9761] Re: 101 Misconceptions About Dynamic Languages — ts <decoux@...>

>>>>> "C" == Christoph Rippel <crippel@primenet.com> writes:

16 messages 2001/01/23

[#9792] Ruby 162 installer available — Dave Thomas <Dave@...>

15 messages 2001/01/24

[#9958] Re: Vim syntax files again. — "Conrad Schneiker" <schneik@...>

Hugh Sasse wrote:

14 messages 2001/01/26
[#10065] Re: Vim syntax files again. — Hugh Sasse Staff Elec Eng <hgs@...> 2001/01/29

On Sat, 27 Jan 2001, Conrad Schneiker wrote:

[#9975] line continuation — "David Ruby" <ruby_david@...>

can a ruby statement break into multiple lines?

18 messages 2001/01/27
[#9976] Re: line continuation — Michael Neumann <neumann@...> 2001/01/27

On Sat, 27 Jan 2001, David Ruby wrote:

[#9988] Re: line continuation — harryo@... (Harry Ohlsen) 2001/01/28

>A statement break into mutliple lines if it is not complete,

[ruby-talk:9003] Re: Sandbox (again)

From: wys@... (Clemens Wyss)
Date: 2001-01-10 08:10:09 UTC
List: ruby-talk #9003
Sorry it took so long, but I only find time in the evenings to work on
this. Clemens Hintze <c.hintze@gmx.net> wrote in
>
>  sandbox.execute("p %x(ls -l /)")
>  sandbox.execute("exec 'ls -l /'")
>  sandbox.execute("Thread.new { sleep 60000 } while 1")
>  sandbox.execute("def endless; t = Object.clone; endless end; endless")
>

AND

"NAKAMURA, Hiroshi" <nahi@keynauts.com> wrote in
<JIEJKAMAONAMHNNAOOOLGEONCEAA.nahi@keynauts.com>: 
>Though I did not follow this thread(sorry), why don't
>you use $SAFE, ThreadGroup and Thread#priority?
>
>1. Create new aThreadGroup
>2. Create new aThread for sandbox
>3. Set appropriate $SAFE level to aThread
>4. Set low priority to aThread
>5. Add aThread to aThreadGroup
>6. Eval code in aThread
>7. Kill threads in aThreadGroup.list when timeout
>

All true (of course). The following solution handles all the /cle
vulnerabilities and checks for overly Thread- and Object-creation. Also
the execution time is checked. Here we go:
--> BEGIN
class Thread
  def Thread.inherited(sub)
    raise (SecurityError, "You may not subclass Thread")
  end
end

class SandboxExecutionContext
  def system(cmd)
    raise (SecurityError, "You may not use system")
  end

  def exec(*cmd)
    raise (SecurityError, "You may not use 'exec'")
  end

  def require(modName)  
    raise (SecurityError, "You may not use 'require'")
  end

  def playground
    return binding     
  end

  def `(cmd) # `
    raise (SecurityError, "You may not issue  ``-commands")
  end

  class File
    def File.open(*args)
      raise (SecurityError, "You may not open a File")
    end
  end
end

class Sandbox
  def initialize(level = 2, maxRunTime = 15, maxThreadCount = 10,
  maxNewObjects = 10000) 
    @level = level
    @maxRunTime = maxRunTime
    @maxThreadCount = maxThreadCount
    @maxNewObjects = maxNewObjects
    @sandboxThreadGroup = ThreadGroup.new
    Thread.abort_on_exception= true
    @context = SandboxExecutionContext.new.playground
  end  

  def threadCount
    return ObjectSpace.each_object (Thread) {}    
  end

  def startWatchDogThread
    @watchdogThread = Thread.new {
    ObjectSpace.garbage_collect
    objectsBeforeLaunch = ObjectSpace.each_object {}
    runningForSecs = 0
    begin
      while true do
        if (runningForSecs > @maxRunTime) then
          raise (SecurityError, "Your script may only run for
          #{@maxRunTime}sec") 
        end
        ObjectSpace.garbage_collect
        if ((ObjectSpace.each_object {} - objectsBeforeLaunch) >
        @maxNewObjects) then 
          raise (SecurityError, "You may only create #{@maxNewObjects}
          objects") 
        end
        if (threadCount() > @maxThreadCount) then
          raise (SecurityError, "You may only use #{@maxThreadCount}
          Threads") 
        end
        sleep 1
        runningForSecs += 1
      end # while
    rescue SecurityError => detail
      myMatch = /.*:.*:.*':(.*)/.match(detail) # '
      if not(myMatch.nil?) then
        print "\nThere has been a security violation: " + myMatch[1] +
        "\n" 
      else
        print "\nThere has been a security violation: " + detail + "\n"
      end
      @sandboxThreadGroup.list.each { | th |      
        th.kill
      }
    end
    } # end_of_thread
  end

  def execute(exeCmd)
    exeCmd.untaint
    startWatchDogThread()
    @sandboxThread = Thread.new {
      $SAFE = @level
      begin
        eval(exeCmd, @context)
      rescue SecurityError => detail
        myMatch = /.*:.*:.*':(.*)/.match(detail) # '
        if not(myMatch.nil?) then
          print "\nThere has been a security violation: " + myMatch[1] +
          "\n" 
        else
          print "\nThere has been a security violation: " + detail + "\n"
        end
      rescue Exception => detail
        myMatch = /.*:(.*):.*':(.*)/.match(detail) # '
        if not(myMatch.nil?) then
	  lineNr = myMatch[1]
          errorTxt = myMatch[2].gsub(/Sandbox::/,'')
          print "\nError on line " + lineNr + ":" + errorTxt  + "\n"
        else
          print "\nError :" + detail  + "\n"
        end
      end
    }
    @sandboxThread.priority= -5 # very low
    @sandboxThreadGroup.add(@sandboxThread)
    @sandboxThread.join() # wait for completion
    sleep .1 # give watchThread a chance to terminate neatly
    if (@watchdogThread.alive?) then @watchdogThread.kill end
  end
end
---> END

There is some "noise" in the code because I try to provide exact error
output. 

matz@zetabits.com (Yukihiro Matsumoto) wrote in
<978962552.785938.1519.nullmailer@ev.netlab.zetabits.com>: 
>
>The level 3 of $SAFE is just designed for your purpose.  If hole
>remains, it's my fault, not yours. ;-)
>

I prefer 2, in order to also give users the eval-command!

Now, I am pretty sure this is still not THE solution ;-)
Please give me some more HACKS on this Sandbox! I will build-up a
RubyUnit testsuite to check all the HACKS/vulnerabilities. 

Clemens

In This Thread