[WEB SECURITY] JSReg: Javascript based RegExp sandbox

Terri Oda terri at zone12.com
Fri Jul 3 16:52:34 EDT 2009


I've been talking with some colleagues about doing something similar 
using those JS closures, but it'd be even easier if I could just use 
what you've got as a starting place, so.. Thank you!  I look forwards to 
poking around with it.

Have you taken a look at Microsoft's Web Sandbox?

http://websandbox.livelabs.com/

It sounds superficially similar, but I haven't looked at it deeply yet.

  Terri

gaz Heyes wrote:
> Hi all
> 
> Over the last few months I've been developing and rewriting (a lot) 
> JSReg but now hopefully I'm finally getting somewhere. The goal was to 
> produce a sandboxed version of Javascript within Javascript itself 
> because I need a sandbox for some projects I'm working on and I don't 
> want the overhead of another language.
> 
> My sandbox works with prefixes and suffixes so "x" becomes "$x$" and any 
> reference to objects becomes $obj[$+'yourref'+$]. In addition I only 
> allow certain functions/properties based on a whitelist (so stuff like 
> constructor isn't supported). I also create safe functions which run 
> some checks to prevent window leakage, for example take 
> (1,[].sort)().alert(1) here we leak to window. I protect against this 
> sort of attack by whitelisting native functions to disallow no or null 
> arguments with the option to override per function (then an additional 
> check is performed on the object).
> 
> JSReg contains a special object called "globals", I use this to rewrite 
> your javascript code so for example 'test' becomes 
> globals.string('test') this produces a special prototyped version of the 
> string which can be used later. Native functions are also supported this 
> way by calling their name e.g. globals.alert(1)
> 
> So how does the code look once it's been JSReg'd well here is a code 
> sample:-
> function x(){ var m=1; this.getM=function(){ return m; } }; y=new x; 
> y.getM()
> 
> Which gets rewritten to:-
> function $x$(){ var $m$=globals.number(1);this.$getM$=function(){ return 
> $m$; } };$y$=new $x$;$y$.$getM$()
> 
> As you may have noticed I allow "this" to be used in this way but I will 
> disallow assignment or return the value of "this", I may improve this in 
> future once I'm certain that it is safe to use.
> At the moment I allow JSReg globals to be overwritten but I might 
> prevent this at the regexp level or with setters and there are a few 
> problems when not finishing a statement with a ";". Finally there's a 
> limitation regarding the scope, at the moment the prefixes and suffixes 
> are in the global scope so $x$ is actually window.$x$, I plan to get 
> round this somehow so that $x$ is assigned to a object I'm still working 
> that out.
> 
> Any comments or suggestions are of course welcome but specifically I'm 
> looking for hacks to window or glaring errors in my RegExps. If you can 
> hack JSReg so that it returns window please let me know
> 
> Once I'm confident that it is a secure sandbox, I shall release it as 
> open source. You can have a go here:-
> <http://www.businessinfo.co.uk/labs/jsreg/jsreg.html>
> 
> Cheers
> 
> Gareth


----------------------------------------------------------------------------
Join us on IRC: irc.freenode.net #webappsec

Have a question? Search The Web Security Mailing List Archives: 
http://www.webappsec.org/lists/websecurity/archive/

Subscribe via RSS: 
http://www.webappsec.org/rss/websecurity.rss [RSS Feed]

Join WASC on LinkedIn
http://www.linkedin.com/e/gis/83336/4B20E4374DBA



More information about the websecurity mailing list