Hi Tobias,

Unfortunately, even Thread.stop is not fool-proof. For example, if you try this 
script, it will 
not terminate:

var x = 0;
while (true) {
        try {
                x++;
        } catch (e) {
        }
}

The problem in this case is that Thread.stop causes a ThreadDeath to be thrown 
inside the 
thread. This Error is caught by the catch-statement, ignored and the script 
will keep 
running.

I don't think there is a way to protect against all kinds of mallicious 
scripts. There are 
simply too many ways to break a running VM. To be able to run scripts from 
untrusted 
sources, you will have to run these scripts in some kind of sandbox. You could, 
for example, 
spawn a new VM with limited resources.

In one of our applications, users are able to write scripts in Groovy, which 
are used to 
generate reports. We use a very strict class and method whitelist, to prevent 
scripts from 
breaking out of its environment. We also inject code in all loops to abort a 
script when 
needed. However, this still does not protect us against things like claiming 
large amounts 
or memory. Also, a script can still catch the Exception we use to abort it and 
continue 
running. We simply have to trust our users to not write scripts that would harm 
our server. 
Therefore, we only allow a select group of users to write scripts and we can 
always see 
who wrote it.

Best regards,
Emond

On Thursday, January 07, 2016 07:57:36 PM Tobias Soloschenko wrote:
> Hi Emond,
> 
> ok the last thing left is the memory consumption. Hope that I am able to
> find a way to make this also save.
> 
> Any suggestions here?
> 
> kind regards
> 
> Tobias
> 
> Am 07.01.16 um 15:43 schrieb Emond Papegaaij:
> > Hi Tobias,
> > 
> > You have to modify the code with the snippet below. This will wait for
> > termination with a timeout of 1 minute, after which the VM still
> > terminates. However, in a normal webapplication, the VM will not
> > terminate, so threads will stay active until you terminate your entire
> > application.
> > 
> > The code to trigger an out-of-memory is:
> > 
> > var i = 0, o = {};
> > while(true) {
> > 
> >          o[i++] = new Array(1000000);
> > 
> > }
> > 
> > Also, you can try to run the same testcase multiple times in 1 go. After
> > about 100 executions of the script, I suspect your system will start to
> > die on you.

Reply via email to