SlideShare a Scribd company logo
1 of 142
Download to read offline
On Contracts and Sandboxes for JavaScript
Matthias Keil, Peter Thiemann
University of Freiburg, Germany
August 6, 2015
Darmstadt, Germany
Motivation
89.8 %
of all web sites use JavaScript1
1
according to http://w3techs.com/, status of July 2015
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 2 / 43
Motivation
89.8 %
of all web sites use JavaScript1
Most important client-side language for web sites
Web-developers rely on third-party libraries
e.g. for calendars, maps, social networks
1
according to http://w3techs.com/, status of July 2015
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 2 / 43
Situation of a Web-developer
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 3 / 43
Situation of a Web-developer
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 3 / 43
Situation of a Web-developer
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 3 / 43
Situation of a Web-developer
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 3 / 43
Situation of a Web-developer
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 3 / 43
Situation of a Web-developer
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 3 / 43
JavaScript issues
Dynamic programming language
Code is accumulated by dynamic loading
e.g. eval, mashups
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 4 / 43
JavaScript issues
Dynamic programming language
Code is accumulated by dynamic loading
e.g. eval, mashups
JavaScript has no security awareness
No namespace or encapsulation management
Global scope for variables/ functions
All scripts have the same authority
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 4 / 43
JavaScript issues
Dynamic programming language
Code is accumulated by dynamic loading
e.g. eval, mashups
JavaScript has no security awareness
No namespace or encapsulation management
Global scope for variables/ functions
All scripts have the same authority
Problems
1 Side effects may cause unexpected behavior
2 Program understanding and maintenance is difficult
3 Libraries may get access to sensitive data
4 User code may be prone to injection attacks
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 4 / 43
Key challenges of present research
All-or-nothing choice when including code
Isolation guarantees noninterference
Some scripts must have access the application state or are
allowed to change it
Goals
1 Manage untrusted JavaScript Code
2 Control the use of data by included scripts
3 Reason about effects of included scripts
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 5 / 43
Language-embedded Systems
Shortcomings
Static verifiers are imprecise because of JavaScript’s dynamic
features or need to restrict JavaScript’s dynamic features
Interpreter modifications guarantee full observability but
need to be implemented in all existing engines
Implemented as a library in JavaScript
Library can easily be included in existing projects
All aspects are accessible thought an API
No source code transformation or change in the JavaScript
run-time system is required
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 6 / 43
Timeline
2011
JSConTest
Access Permission
Contracts for Scripting
Languages
2013
JSConTest2
Efficient Access
Analysis Using
JavaScript Proxies
2015
TreatJS
Higher-Order Contracts
for JavaScript
TreatJS-Sandbox
Transaction-based
Sandboxing of
JavaScript
?
Ongoing Work
Temporal Contracts,
Lemma Contracts,
Invariants
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 7 / 43
JSConTest
JSConTest
Access Permission Contracts for Scripting
Languages
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 8 / 43
JSConTest
Investigate effects of unfamiliar function
Type and effect contracts with run-time checking
Summarizes observed access traces to a concise description
Effect contracts specifying allowed access paths
Type and effect contracts
/∗c (obj, obj) −> any with [x.b,y.a] ∗/
function f(x, y) {
y.a = 1;
y.b = 2;  violation
}
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 9 / 43
Shortcomings of JSConTest
Implemented by an offline code transformation
Partial interposition (dynamic code, eval, with, . . . )
Tied to a particular version of JavaScript
Transformation hard to maintain
Special contract syntax
Requires a special JavaScript parser
Efficiency issues
Naive representation of access paths
Wastes memory and impedes scalability
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 10 / 43
JSConTest2
JSConTest2
Efficient Access Analysis Using JavaScript Proxies
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 11 / 43
JSConTest2
Redesign and reimplementation of JSConTest based on
JavaScript proxies
Advantages
Full interposition for the full language
Including dynamically loaded code and eval
Safe for future language extensions
No transformation to maintain
Runs faster in less memory
Efficient representation of access paths
Incremental path matching
Maintenance is simplified
No custom syntax for contracts
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 12 / 43
JSConTest2
Contracts on Objects
var obj = APC.permit(’(a.?+b∗)’, {a:{b:5},b:{b:11}});
a = obj.a; // APC.permit(’?’, {b:5});
a.b = 3;
APC encapsulates JSConTest2
permit wraps an object with a permission. Arguments:
1 Permission encoded in a string
2 Object that is protected by the permission
Contract specifies permitted access paths
Last property is readable/ writeable
Prefix is read-only
Not addressed properties are neither readable nor writeable
Read-only paths possible (@ denotes a non-existing property)
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 13 / 43
Proxy Membrane
ProxyA
ProxyB
ProxyC
TargetA
TargetB
TargetC
Contract: C
Path: P
Contract: ∂x C
Path: P.x
Contract: ∂y C
Path: P.y
Contract: (∂z∂x C)(∂y C)
Path: P.(x.z|y)
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 14 / 43
Proxy Membrane
ProxyA
ProxyB
ProxyC
TargetA
TargetB
TargetC
x x
Contract: C
Path: P
Contract: ∂x C
Path: P.x
Contract: ∂y C
Path: P.y
Contract: (∂z∂x C)(∂y C)
Path: P.(x.z|y)
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 14 / 43
Proxy Membrane
ProxyA
ProxyB
ProxyC
TargetA
TargetB
TargetC
x
y
x
y
Contract: C
Path: P
Contract: ∂x C
Path: P.x
Contract: ∂y C
Path: P.y
Contract: (∂z∂x C)(∂y C)
Path: P.(x.z|y)
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 14 / 43
Proxy Membrane
ProxyA
ProxyB
ProxyC
TargetA
TargetB
TargetC
x
y
z
x
y
z
Contract: C
Path: P
Contract: ∂x C
Path: P.x
Contract: ∂y C
Path: P.y
Contract: (∂z∂x C)(∂y C)
Path: P.(x.z|y)
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 14 / 43
The JSConTest2 Approach
Implementation based on the JavaScript Proxy API
Shortcomings of previous, translation-based implementation
avoided
Full interposition of contracted objects
Proxy intercepts all operations
Proxy-handler contains a contract and a path set
Forwards the operation or signals a violation
Returned object contains the remaining contract
(Membrane)
Access contracts are regular expressions on literals
Each literal defines a property access
The language defines a set of permitted access paths
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
TreatJS
TreatJS
Higher-Order Contracts for JavaScript
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 16 / 43
Introduction
Language embedded contract system for JavaScript
Enforced by run-time monitoring
Specifies the interface of a software component
Pre- and postconditions
Standard abstractions for higher-order-contracts (base,
function, and dependent contracts) [Findler,Felleisen’02]
Systematic blame calculation
Side-effect free contract execution
Contract constructors generalize dependent contracts
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 17 / 43
Base Contract [Findler,Felleisen’02]
Base Contracts are built from predicates
Specified by a plain JavaScript function
function isNumber (arg) {
return (typeof arg) === ’number’;
};
var Number = Contract.Base(isNumber);
assert(1, Number ); 
assert(’a’, Number );  blame the subject
Subject v gets blamed for Base Contract B iff:
B(v) = true
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 18 / 43
Function Contract [Findler,Felleisen’02]
// Number × Number → Number
function plus (x, y) {
return (x + y);
}
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 19 / 43
Function Contract [Findler,Felleisen’02]
// Number × Number → Number
function plus (x, y) {
return (x + y);
}
var plus = assert(plus, Contract.Function([ Number ,
Number ], Number ));
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 19 / 43
Function Contract [Findler,Felleisen’02]
// Number × Number → Number
function plus (x, y) {
return (x + y);
}
plus(’a’, ’a’);  blame the context
Context gets blamed for C → C iff:
Argument x gets blamed for C (as subject)
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 19 / 43
Function Contract [Findler,Felleisen’02]
// Number × Number → Number
function plusBroken (x, y) {
return (x0  y0) ? (x + y) : ’Error’;
}
plusBroken(0, 1);  blame the subject
Subject f gets blamed for C → C iff:
¬ (Context gets blamed C) ∧ (f (x) gets blamed C )
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 19 / 43
TreatJS
New!
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 20 / 43
Overloaded Operator
Function plus works for strings, too
Requires to model overloading and multiple inheritances
// Number × Number → Number
function plus (x, y) {
return (x + y);
}
plus(’a’, ’a’);  blame the context
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 21 / 43
Combinations of Contracts
No support for arbitrary combination of contracts
Racket supports and/c and or/c
Attempt to extend conjunction and disjunction to
higher-oder contracts
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 22 / 43
Combinations of Contracts
and/c
and/c tests any contract
no value fulfills Number and String at the same time
(and/c (Number × Number → Number) (String × String → String))
function plus (x, y) {
return (x + y);
}
plus(’a’, ’a’);  blame the context
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 23 / 43
Combinations of Contracts
or/c
or/c checks first-order parts and fails unless exactly one
(range) contract remains
Work for disjoint base contracts
No combination of higher-oder contracts
No support for arbitrary combinations of contracts
(or/c (Number × Number → Number) (String × String → String))
function plus (x, y) {
return (x + y);
}
plus(’a’, ’a’); 
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 24 / 43
Combinations of Contracts
TreatJS
Support for arbitrary combination of contracts
Combination of base and function contracts
Combination of function contracts with a different arity
Intersection and union contracts
Boolean combination of contracts
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 25 / 43
Intersection Contract
// (Number × Number → Number) ∩ (String × String → String)
function plus (x, y) {
return (x + y);
}
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 26 / 43
Intersection Contract
// (Number × Number → Number) ∩ (String × String → String)
function plus (x, y) {
return (x + y);
}
var plus = assert(plus, Contract.Intersection(
Contract.Function([ Number , Number ], Number )
Contract.Function([ String , String ], String ));
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 26 / 43
Intersection Contract
// (Number × Number → Number) ∩ (String × String → String)
function plus (x, y) {
return (x + y);
}
plus(true, true);  blame the context
Context gets blamed for C ∩ C iff:
(Context gets blamed for C) ∧ (Context gets blamed for C )
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 26 / 43
Intersection Contract
// (Number × Number → Number) ∩ (String × String → String)
function plusBroken (x, y) {
return (x0  y0) ? (x + y) : ’Error’;
}
plusBroken(0, 1);  blame the subject
Subject f gets blamed for C ∩ C iff:
(f gets blamed for C) ∨ (f gets blamed for C )
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 26 / 43
Contract Assertion
A failing contract must not signal a violation immediately
Violation depends on combinations of failures in different
sub-contracts
// (Number → Number) ∩ (String → String)
function addOne (x) {
return (x + 1);
}
addOne(’a’);
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 27 / 43
Contract Assertion
A failing contract must not signal a violation immediately
Violation depends on combinations of failures in different
sub-contracts
// (Number → Number) ∩ (String → String)
function addOne (x) {
return (x + 1);
}
addOne(’a’);
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 27 / 43
Contract Assertion
A failing contract must not signal a violation immediately
Violation depends on combinations of failures in different
sub-contracts
// (Number → Number) ∩ (String → String)
function addOne (x) {
return (x + 1);
}
addOne(’a’); 
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 27 / 43
Blame Calculation
Contract assertion must connect each contract with the
enclosing operations
Callback implements a constraint and links each contracts to
its next enclosing operation
Reports a record containing two fields, context and subject
Fields range over B4 = {⊥, f, t, } [Belnap’1977]
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 28 / 43
Non-Interference
No syntactic restrictions on predicates
Problem: Contract may interfere with program execution
Solution: Predicate evaluation takes place in a sandbox
function isNumber (arg) {
type = (typeof arg);
return type === ’number’;
};
var Number = Contract.Base(isNumber);
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 29 / 43
Non-Interference
No syntactic restrictions on predicates
Problem: Contract may interfere with program execution
Solution: Predicate evaluation takes place in a sandbox
function isNumber (arg) {
type = (typeof arg);  access forbidden
return type === ’number’;
};
var Number = Contract.Base(isNumber);
assert(1, Number );
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 29 / 43
Sandbox
All contracts guarantee noninterference
Read-only access is safe
var Array = Contract.Base(function (arg) {
return (arg instanceof Array);  access forbidden
});
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 30 / 43
Sandbox
All contracts guarantee noninterference
Read-only access is safe
var Array = Contract.Base(function (arg) {
return (arg instanceof OutsideArray); 
});
var Array = Contract.With({OutsideArray:Array}, Array );
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 30 / 43
Contract Constructor
Building block for dependent, parameterized, abstract, and
recursive contracts
Constructor gets evaluated in a sandbox, like a predicate
Returns a contract
No further sandboxing for predicates
var Type = Contract.Constructor(function (type) {
return Contract.Base(function (arg) {
return (typeof arg) === type;
});
});
var Number = Type (’number’);
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 31 / 43
TreatJS-Sandbox
TreatJS-Sandbox
Transaction-based Sandboxing of JavaScript
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 32 / 43
TreatJS-Sandbox
Language-embedded sandbox for full JavaScript
Inspired by JSConTest2 and Revocable References
Adapts SpiderMonkey’s compartment concept to run code in
isolation to the application state
Provides features known from transaction processing in
database systems and transactional memory
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 33 / 43
Sandbox Encapsulation
A reference is the right to access an object
Requires to control property read and property write
Sandbox Encapsulation
1 Place a write protection on objects
2 Remove external bindings of functions
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 34 / 43
Identity Preserving Membrane
ProxyA
ProxyB
ProxyC
TargetA
TargetB
TargetC
x
y
z
x
y
z
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 35 / 43
JavaScript Proxies
Handler
Proxy Target Shadow
proxy.x;
proxy.y=1;
proxy.y;
handler.get(target, ’x’, proxy);
handler.set(target, ’y’, 1, proxy);
handler.get(target, ’y’, proxy);
target[’x’];
target[’y’]=1;
target[’y’];
Meta-Level
Base-Level
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 36 / 43
Shadow Objects
Handler
Proxy Target Shadow
proxy.x;
proxy.y=1;
proxy.y;
handler.get(target, ’x’, proxy);
handler.set(target, ’y’, 1, proxy);
handler.get(target, ’y’, proxy);
target[’x’]; shadow[’y’]=1;
shadow[’y’];
Meta-Level
Base-Level
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 37 / 43
Function Recompilation
Function decompilation uses the
Function.prototype.toString method to return a string that
contains the source code of that function
Applying eval to the string creates a fresh variant
A with statement places a proxy in top of the scope chain
The hasOwnProperty trap always returns true
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 38 / 43
JavaScript Scope Chain
var x = 1;
function f (y){
function g () {
var z = 1;
return x+y+z;
}
}
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 39 / 43
Sandbox Scope Chain
var x = 1;
with(sbxglobal){
function g () {
var z = 1;
return x+y+z;
}
}
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 40 / 43
Conclusion
JSConTest/ JSConTest2: Effect monitoring for JavaScript
Enables to specify effects using access permission contracts
TreatJS: Language embedded, dynamic, higher-order
contract system for full JavaScript
Support for intersection and union contracts
Contract constructors with local scope
Sandbox: Language embedded sandbox for full JavaScript
Runs code in a configurable degree of isolation
Provides a transactional scope
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 41 / 43
Ongoing Work
Temporal/ Computation Contracts
Lemma Contracts
Invariants
Different blaming semantics (Lax, Picky, Indy)
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 42 / 43
Further Challenges
Limitations
Dynamic contract checking impacts the execution time
Arbitrary combinations of contracts lead to unprecise error
messages
1 Hybrid contract checking
2 Static pre-checking of contracts
3 Optimization, contract rewriting
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 43 / 43
Appendix
Appendix
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 1 / 43
JSConTest
JSConTest
Access Permission Contracts for Scripting
Languages
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 2 / 43
JSConTest2
JSConTest2
Efficient Access Analysis Using JavaScript Proxies
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 3 / 43
JSConTest2
Redesign and reimplementation of JSConTest based on
JavaScript proxies
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 4 / 43
JSConTest2
Redesign and reimplementation of JSConTest based on
JavaScript proxies
Advantages
Full interposition for the full language
Including dynamically loaded code and eval
Safe for future language extensions
No transformation to maintain
Runs faster in less memory
Efficient representation of access paths
Incremental path matching
Maintenance is simplified
No custom syntax for contracts
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 4 / 43
Contracts on Functions
Contracts on Functions
var func = APC.permitArgs(’arguments.0.(a.?+b∗)’,
function(arg0) {
// do something
});
permitArg wraps a function with permissions
1 contract applied to function arguments
2 function
Arguments accessed by position arguments.0
No reliable way to access parameter names
Function may use unlisted parameters
Parameter names may not be unique
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 5 / 43
Interaction of Contracts
Interaction of Contracts
var obj = APC.permit(’((a+a.b)+b.b.@)’, {a:{b:3}, b:{b:5}});
obj.a = obj.b; // APC.permit(’b.@’, {b:5});
y = obj.a; // APC.permit(’b  b.@’, {b:5});
y.b = 7;  violation
Line 2 reads obj.b and writes obj.a
Afterwards, obj.b and obj.a are aliases
JSConTest2 enforces both contracts reaching obj.b and obj.a
obj.a carries contract !’( +b)b.@’! = !’b.@’!
Thus, writing to obj.a.b is not permitted
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 6 / 43
Limitations
1 Cannot directly protect DOM objects because of the
browser’s sandbox
2 Proxies are not transparent with respect to equality, i.e. for
distinct proxies == and === returns false, even if the target
object is the same
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 7 / 43
TreatJS
TreatJS
Higher-Order Contracts for JavaScript
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 8 / 43
Object Contract
Defined by a mapping from property names to contracts
Represented as a pair of a getter and a setter function
Getter and Setter apply the property’s contract
var arraySpec = Contract.AObject({length: Number });
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 9 / 43
Object Contract
Defined by a mapping from property names to contracts
Represented as a pair of a getter and a setter function
Getter and Setter apply the property’s contract
var arraySpec = Contract.AObject({length: Number });
var faultyObj = assert({length:’1’}, arraySpec);
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 9 / 43
Object Contract
Defined by a mapping from property names to contracts
Represented as a pair of a getter and a setter function
Getter and Setter apply the property’s contract
var arraySpec = Contract.AObject({length: Number });
var faultyObj = assert({length:’1’}, arraySpec);
var faultyObj.length;  blame the subject
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 9 / 43
Object Contract
Defined by a mapping from property names to contracts
Represented as a pair of a getter and a setter function
Getter and Setter apply the property’s contract
var arraySpec = Contract.AObject({length: Number });
var faultyObj = assert({length:’1’}, arraySpec);
var faultyObj.length = ’2’;  blame the context
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 9 / 43
Function Contract
Function Contract is build from one contract for the domain
and one contract for the range of a function
An Object Contract serves as the domain portion of a
Function Contract with zero or more arguments
AFunction defines an Object Contract from the array
Contract.AFunction([ Number , Number ], Number ));
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 10 / 43
Function Contract
Function Contract is build from one contract for the domain
and one contract for the range of a function
An Object Contract serves as the domain portion of a
Function Contract with zero or more arguments
AFunction defines an Object Contract from the array
Contract.AFunction([ Number , Number ], Number ));
Contract.Function(
Contract.AObject([ Number , Number ]), Number ));
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 10 / 43
Recursive Contract
Similar to Constructors
Unrolls the constructor when asserted
Contract is given as argument to the constructor
var LinkedList = Contract.Recursive(
Contract.Constructor(function( LinkedList ) {
return Contract.AObject({
value: Number ,
next: LinkedList });
}));
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 11 / 43
Union Contract
// (Number × Number → Number) ∪ (Number × Number → String)
function plusBroken (x, y) {
return (x0  y0) ? (x + y) : ’Error’;
}
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 12 / 43
Union Contract
// (Number × Number → Number) ∪ (Number × Number → String)
function plusBroken (x, y) {
return (x0  y0) ? (x + y) : ’Error’;
}
var plusBroken = assert(plusBroken, Contract.Union(
Contract.Function([ Number , Number ], Number )
Contract.Function([ Number , Number ], String ));
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 12 / 43
Union Contract
// (Number × Number → Number) ∪ (Number × Number → String)
function plusBroken (x, y) {
return (x0  y0) ? (x + y) : ’Error’;
}
plusBroken(’a’, ’a’);  blame the context
Context gets blamed for C ∪ C iff:
(Context gets blamed for C) ∨ (Context gets blamed for C )
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 12 / 43
Union Contract
// (Number × Number → Number) ∪ (Number × Number → String)
function plusBroken (x, y) {
return (x0  y0) ? (x + y) : ’Error’;
}
plusBroken(1, 1); 
plusBroken(0, 1);  blame the subject
Subject f gets blamed for C ∪ C iff:
(f gets blamed for C) ∧ (f gets blamed for C )
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 12 / 43
Contract Abstraction
// T × T → T
function plus (x, y) {
return (x + y);
}
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 13 / 43
Contract Abstraction
// T × T → T
function plus (x, y) {
return (x + y);
}
var Plus = Contract.Constructor(function ( Type ) {
return Contract.Function([Type, Type], Type);
});
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 13 / 43
Contract Abstraction
// T × T → T
function plus (x, y) {
return (x + y);
}
var Plus = Contract.Constructor(function ( Type ) {
return Contract.Function([Type, Type], Type);
});
var Plus = assert(plus, Plus );
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 13 / 43
Contract Abstraction
// T × T → T
function plus (x, y) {
return (x + y);
}
var Plus = Contract.Constructor(function ( Type ) {
return Contract.Function([Type, Type], Type);
});
var Plus = assert(plus, Plus );
Plus( Number )(1, 2); 
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 13 / 43
Dependent Contract
// T × T → T
function plus (x, y) {
return (x + y);
}
var Type = Contract.Constructor(function(x, y) {
return Contract.Base(function (arg) {
return ((typeof x) === (typeof y)) 
((typeof x) === (typeof arg));
});
});
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 14 / 43
Dependent Contract
// T × T → T
function plus (x, y) {
return (x + y);
}
var Type = Contract.Constructor(function(x, y) {
return Contract.Base(function (arg) {
return ((typeof x) === (typeof y)) 
((typeof x) === (typeof arg));
});
});
var plus = assert(plus, Contract.Dependent( Type ));
plus(1, 2); 
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 14 / 43
Callback Graph
// (Number → Number) ∩ (String → String)
function addOneBroken (x) {
return (x + ’1’);
}
addOneBroken(’a’); 
addOneBroken(1);  blame the subject
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
Callback Graph
•
∩
→
Number Number
→
String String
∩
→
Number Number
→
String String
(⊥,⊥)
// (Number → Number) ∩ (String → String)
addOneBroken(’a’);
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
Callback Graph
•
∩
→
Number Number
→
String String
∩
→
Number Number
→
String String
(⊥,⊥)
(⊥,⊥)
// (Number → Number) ∩ (String → String)
addOneBroken(’a’);
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
Callback Graph
•
∩
→
Number Number
→
String String
∩
→
Number Number
→
String String
(⊥,⊥)
(⊥,⊥)
(⊥,⊥)
// (Number → Number) ∩ (String → String)
addOneBroken(’a’);
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
Callback Graph
•
∩
→
Number Number
→
String String
∩
→
Number Number
→
String String
(⊥,⊥) (⊥,⊥)
(⊥,⊥)
(⊥,⊥)
// (Number → Number) ∩ (String → String)
addOneBroken(’a’);
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
Callback Graph
•
∩
→
Number Number
→
String String
∩
→
Number Number
→
String String
(t,t)
(⊥,⊥) (⊥,⊥)
(⊥,⊥)
(⊥,⊥)
// (Number → Number) ∩ (String → String)
addOneBroken(’a’);
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
Callback Graph
•
∩
→
Number Number
→
String String
∩
→
Number Number
→
String String
(t,f) (t,t)
(f,t) (⊥,⊥)
(⊥,⊥)
(⊥,⊥)
// (Number → Number) ∩ (String → String)
addOneBroken(’a’);
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
Callback Graph
•
∩
→
Number Number
→
String String
∩
→
Number Number
→
String String
(t,f) (t,f) (t,t)
(f,t) (⊥,⊥)
(⊥,⊥)
(⊥,⊥)
// (Number → Number) ∩ (String → String)
addOneBroken(’a’);
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
Callback Graph
•
∩
→
Number Number
→
String String
∩
→
Number Number
→
String String
(t,f) (t,f) (t,t) (t,t)
(f,t) (t,t)
(t,t)
(t,t)(t,t)
// (Number → Number) ∩ (String → String)
addOneBroken(’a’); 
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
Callback Graph
•
∩
→
Number Number
→
String String
∩
→
Number Number
→
String String
(t,t)
(⊥,⊥) (⊥,⊥)
(⊥,⊥)
// (Number → Number) ∩ (String → String)
addOneBroken(1);
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
Callback Graph
•
∩
→
Number Number
→
String String
∩
→
Number Number
→
String String
(t,t)
(t,f)
(⊥,⊥) (f,t)
(⊥,⊥)
// (Number → Number) ∩ (String → String)
addOneBroken(1);
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
Callback Graph
•
∩
→
Number Number
→
String String
∩
→
Number Number
→
String String
(t,t)
(t,t) (t,f)
(⊥,⊥) (f,t)
(⊥,⊥)
// (Number → Number) ∩ (String → String)
addOneBroken(1);
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
Callback Graph
•
∩
→
Number Number
→
String String
∩
→
Number Number
→
String String
(t,t) (t,f) (t,f)
(t,f) (f,t)
(t,f)
(t, )
// (Number → Number) ∩ (String → String)
addOneBroken(1); blame the subject
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
Scores
Benchmark Full System Baseline
Richards 0.391 0.519 11142
DeltaBlue 0.276 0.360 17462
Crypto 11888 12010 11879
RayTrace 1.09 1.45 23896
EarleyBoyer 5135 5292 5370
RegExp 1208 1181 1207
Splay 20.6 27.8 9555
SplayLatency 73.1 99.7 6289
NavierStokes 6234 7159 12612
pdf.js 9191 9257 9236
Mandreel 12555 12542 12580
MandreelLatency 18741 18883 19398
Gameboy Emulator 6.80 9.07 23801
Code loading 6245 6785 9324
Box2DWeb 3.57 4.67 12528
zlib 29108 28708 29185
TypeScript 187 248 11958
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 16 / 43
Scores
Benchmark Full w/o C w/o D w/o M w/o P
Richards 0.391 0.582 0.782 0.781 0.903
DeltaBlue 0.276 0.409 0.544 0.544 0.625
Crypto 11888 11912 11914 11986 11979
RayTrace 1.09 1.82 2.51 2.51 3.02
EarleyBoyer 5135 5126 5205 5233 5242
RegExp 1208 1205 1199 1212 1178
Splay 20.6 31.2 42.5 42.5 49.7
SplayLatency 73.1 109 151 151 177
NavierStokes 6234 7924 9176 8943 9456
pdf.js 9191 9548 9156 9222 9152
Mandreel 12555 12586 12549 12346 12431
MandreelLatency 18741 18741 18883 19027 18955
Gameboy Emulator 6.80 10.8 14.9 14.9 17.7
Code loading 6245 6937 7372 7335 7533
Box2DWeb 3.57 5.72 7.80 7.82 9.19
zlib 29108 29025 29047 28926 29063
TypeScript 187 290 400 396 463
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 16 / 43
Statistic
Benchmark Contract
A I P
Richards 24 1599377224 935751200
DeltaBlue 54 2319477672 1340451212
Crypto 1 5 3
RayTrace 42 687240082 509234422
EarleyBoyer 3944 89022 68172
RegExp 0 0 0
Splay 10 11620663 7067593
SplayLatency 10 11620663 7067593
NavierStokes 51 48334 39109
pdf.js 3 15 9
Mandreel 7 57 28
MandreelLatency 7 57 28
Gameboy Emulator 3206 141669753 97487985
Code loading 5600 34800 18400
Box2DWeb 20075 172755100 112664947
zlib 0 0 0
TypeScript 4 12673644 8449090
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 17 / 43
Statistic
Benchmark Sandbox
M D
Richards 4678756000 4
DeltaBlue 6702256060 5
Crypto 15 3
RayTrace 2546172110 4
EarleyBoyer 340860 6
RegExp 0 0
Splay 35337965 5
SplayLatency 35337965 5
NavierStokes 195545 5
pdf.js 45 4
Mandreel 140 4
MandreelLatency 140 4
Gameboy Emulator 487439925 5
Code loading 92000 4
Box2DWeb 563324735 5
zlib 0 0
TypeScript 42245450 2
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 17 / 43
Statistic
Benchmark Callback
Richards 3351504000
DeltaBlue 4744203248
Crypto 13
RayTrace 2190186074
EarleyBoyer 309120
RegExp 0
Splay 26231845
SplayLatency 26231845
NavierStokes 177197
pdf.js 39
Mandreel 128
MandreelLatency 128
Gameboy Emulator 399084085
Code loading 70400
Box2DWeb 469141435
zlib 0
TypeScript 33796350
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 17 / 43
Timings
Benchmark Full Baseline
Richards 1 day, 18 hours, 21 min, 20 sec 8 sec
DeltaBlue 2 days, 10 hours, 36 min, 49 sec 4 sec
Crypto 9 sec 8 sec
RayTrace 23 hours, 12 min, 37 sec 4 sec
EarleyBoyer 1 min, 9 sec 53 sec
RegExp 9 sec 8 sec
Splay 19 min, 19 sec 3 sec
SplayLatency 19 min, 19 sec 3 sec
NavierStokes 11 sec 4 sec
pdf.js 6 sec 6 sec
Mandreel 5 sec 5 sec
MandreelLatency 5 sec 5 sec
Gameboy Emulator 4 hours, 28 min, 28 sec 5 sec
Code loading 12 sec 9 sec
Box2DWeb 5 hours, 19 min, 49 sec 6 sec
zlib 11 sec 11 sec
TypeScript 22 min, 46 sec 24 sec
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 18 / 43
Timings
Benchmark Predicate Baseline
Richards 1 day, 6 hours, 59 min, 42 sec 8 sec
DeltaBlue 1 day, 20 hours, 58 min, 17 sec 4 sec
Crypto 8 sec 8 sec
RayTrace 17 hours, 1 min, 25 sec 4 sec
EarleyBoyer 1 min, 3 sec 53 sec
RegExp 8 sec 8 sec
Splay 13 min, 55 sec 3 sec
SplayLatency 13 min, 55 sec 3 sec
NavierStokes 9 sec 4 sec
pdf.js 6 sec 6 sec
Mandreel 5 sec 5 sec
MandreelLatency 5 sec 5 sec
Gameboy Emulator 3 hours, 13 min, 13 sec 5 sec
Code loading 12 sec 9 sec
Box2DWeb 3 hours, 52 min, 34 sec 6 sec
zlib 12 sec 11 sec
TypeScript 17 min, 8 sec 24 sec
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 18 / 43
TreatJS-Sandbox
TreatJS-Sandbox
Transaction-based Sandboxing of JavaScript
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 19 / 43
Motivation
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 20 / 43
Application Scenarios
TreatJS
Non-interfering Contract Execution
var Number = Contract.Base(function (arg) {
type = (typeof arg);
return type === ’number’;
});
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 21 / 43
Application Scenarios
TreatJS
Non-interfering Contract Execution
var Number = Contract.Base(function (arg) {
type = (typeof arg);
return type === ’number’;
});
Read-only access
var Array = Contract.Base(function (arg) {
return (arg instanceof OutsideArray);
});
var Array = Contract.With({OutsideArray:Array}, Array );
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 21 / 43
Application Scenarios
TreatJS Online
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 22 / 43
Running Example
function Node (value, left, right) {
this.value = value;
this.left = left;
this.right = right;
}
function heightOf (node) {
return node ? Math.max(heightOf(node.left)+1), heightOf(
node.right)+1) : −1;
}
function setValue (node) {
node.value=heightOf(node);
if(node.left) setValue(node.left);
if(node.right) setValue(node.right);
}
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 23 / 43
Function Invocation
var root = new Node(0, new Node(0), new Node(0));
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 24 / 43
Function Invocation
var root = new Node(0, new Node(0), new Node(0));
var sbx = new Sandbox(this, {/∗ some parameters ∗/});
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 24 / 43
Function Invocation
var root = new Node(0, new Node(0), new Node(0));
var sbx = new Sandbox(this, {/∗ some parameters ∗/});
sbx.call(heightOf, this, root);
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 24 / 43
Cross-Sandbox Access
Read Access
0
0 0
0
0 0
left right
global sandbox
function heightOf (node) {
return node ? Math.max(heightOf(node.left)+1), heightOf(
node.right)+1) : −1;
}
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 25 / 43
Cross-Sandbox Access
Read Access
0
0 0
0
0 0
left right
global
left
sandbox
function heightOf (node) {
return node ? Math.max(heightOf(node.left)+1), heightOf(
node.right)+1) : −1;
}
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 25 / 43
Cross-Sandbox Access
Read Access
0
0 0
0
0 0
left right
global
left right
sandbox
function heightOf (node) {
return node ? Math.max(heightOf(node.left)+1), heightOf(
node.right)+1) : −1;
}
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 25 / 43
Cross-Sandbox Access
Write Access
0
0 0
01
00 00
left right
global
left right
sandbox
function setValue (node) {
node.value=heightOf(node);
if(node.left) setValue(node.left);
if(node.right) setValue(node.right);
}
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 26 / 43
Cross-Sandbox Access
Write Access
0
0 0
01
00 00
left right
global
left right
sandbox
function setValue (node) {
node.value=heightOf(node);
if(node.left) setValue(node.left);
if(node.right) setValue(node.right);
}
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 26 / 43
Cross-Sandbox Access
Write Access (cont’d)
0
0 0
0
0 a
b c
right
left right
sandbox2
left right
global
var sbx2 = new Sandbox(this, {/∗ some parameters ∗/});
function appendRight (node) {
node.right = Node(’a’, Node(’b’), Node(’c’));
}
sbx2.call(appendRight, this, root);
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 27 / 43
Effect Monitoring
Read Effects
0
0 0
1
0 0
left right
global
left right
sandbox
sbx.effectsOf(this).foreach(function(i, e) {print(e)});
;;; Effects of this
(1425301383541) has [name=heightOf]
(1425301383541) get [name=heightOf]
(1425301383543) has [name=Math]
(1425301383543) get [name=Math]
...
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 28 / 43
Effect Monitoring
Write Effects
0
0 0
1
0 0
left right
global
left right
sandbox
sbx.writeeffectsOf(root).foreach(function(i, e) {print(e)});
;;; Write Effects of root
(1425301634992) set [name=value]
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 29 / 43
Inspecting a Sandbox
Changes
0
0 0
1
0 0
left right
global
left right
sandbox
sbx.hasChanges; // returns true
sbx.changes.foreach(function(i, e) {print(e)});
;;; All Changes
Change: (1425300876577) set [name=value]@SBX001
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 30 / 43
Inspecting a Sandbox
Differences
0
0
0 0
0
12
01
0 0
00
left right
left right
global
left right
sandbox
sbx.hasDifferences; // returns true
sbx.differences.foreach(function(i, e) {print(e)});
;;; Differences of root
Difference: (1425300932388) set [name=value]@SBX001
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 31 / 43
Inspecting a Sandbox
Differences
0
0
0 0
0
12
01
0 0
00
left right
left right
global
left right
left right
sandbox
sbx.hasDifferences; // returns true
sbx.differences.foreach(function(i, e) {print(e)});
;;; Differences of root
Difference: (1425300932388) set [name=value]@SBX001
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 31 / 43
Inspecting a Sandbox
Conflicts
2
1
0 0
0
0
0 a
b c
right
left right
sandbox2
left right
left right
sandbox
sbx.inConflictWith(sbx2); // returns true
sbx.conflictsWith(sbx2).foreach(function(i, e) {print(e)});
Confict: (1425303937853) get [name=right]@SBX001 −
(1425303937855) set [name=right]@SBX002
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 32 / 43
Transaction Processing
Commit
2
1
0 0
1
2
1
0 0
1
left right
left right
global
left right
left right
sandbox
sbx.commit();
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 33 / 43
Transaction Processing
Rollback
2
1
0 0
1
0
0
0 0
0
left right
left right
global
left right
left right
sandbox
sbx.rollback();
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 34 / 43
Transaction Processing
Revert
2
1
0 0
1
2
1
0 0
1
left right
left right
global
left right
left right
sandbox
sbx.revert();
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 35 / 43
Further Features
Fine-graned handling of commit, rollback and revert
Transparent sandboxing
Snapshot Mode
Wrapping of values
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 36 / 43
Sandbox Scope Chain
var node = new Node(/∗some sub−nodes ∗/);
var sbx = new Sandbox(this, /∗some parameters ∗/);
with(sbxglobal){
function setValue (node) {
node.value=heightOf(node);
setValue(node.left);
setValue(node.right);
}
}
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 37 / 43
Policies
A new sandbox starts with a blank environment
Read access by binding values when instantiating a new
sandbox
Fine-grained write access by committing effects
Combination with Access Permission Contracts and
Revocable References possible
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 38 / 43
Features
Enables scripts to run in a configurable degree of isolation
Enables fine-grained access control
Provides a transactional scope that performs effect logging
Effects can be committed to the application state or rolled
back
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 39 / 43
Limitations
Function recompilation needs a string that contains the
source code of that function
Function.prototype.toString did not work for all functions
A native function did not have a string representation
The Function.prototype.bind method creates a new bound
function without a string representation
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 40 / 43
Experimental Evaluation
Scores
Benchmark Sandbox Transparent Baseline
F w/o E F w/o E
Richards 3919 4270 4070 4078 6618
DeltaBlue 177 333 225 333 4778
Crypto 1508 1917 1666 1959 11012
RayTrace 158 211 157 220 3941
EarleyBoyer 624 677 618 663 2648
RegExp 883 900 887 903 1192
Splay 697 774 706 1394 1439
SplayLatency 1986 2567 1983 2276 1234
NavierStokes 915 865 938 934 11835
pdf.js 84 121 85 127 9229
Mandreel 95 122 96 124 8521
MandreelLatency 455 621 437 632 16562
Gameboy Emulator 4413 5081 4577 5027 22307
Code loading 5123 5264 5148 5202 6721
Box2DWeb 84 121 82 120 13853
zlib - - - - 28970
TypeScript 3006 3339 2940 3242 11813
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 41 / 43
Experimental Evaluation
Timings
Benchmark Sandbox Transparent Baseline
Richards 14 sec 16 sec 9 sec
DeltaBlue 263 sec 265 sec 13 sec
Crypto 59 sec 58 sec 9 sec
RayTrace 865 sec 854 sec 23 sec
EarleyBoyer 265 sec 249 sec 75 sec
RegExp 14 sec 16 sec 8 sec
Splay 32 sec 43 sec 17 sec
SplayLatency 32 sec 43 sec 17 sec
NavierStokes 59 sec 61 sec 5 sec
pdf.js 944 sec 872 sec 9 sec
Mandreel 683 sec 683 sec 9 sec
MandreelLatency 683 sec 683 sec 9 sec
Gameboy Emulator 30 sec 27 sec 7 sec
Code loading 14 sec 14 sec 10 sec
Box2DWeb 1156 sec 1140 sec 6 sec
zlib - - 11 sec
TypeScript 86 sec 91 sec 24 sec
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 42 / 43
Experimental Evaluation
Statistic
Benchmark Wrap Cache Effect
Miss Hit
Richards 164021 3 7 328060
DeltaBlue 7348024 3 7 14696066
Crypto 2329634 3 1046550 3629234
RayTrace 25519224 3 12757207 38281266
EarleyBoyer 5465 3 24 4194942
RegExp 115474 3 65923 230966
Splay 466840 3 232019 1397701
SplayLatency 466840 3 232019 1397701
NavierStokes 1839 3 727 2978
pdf.js 18222921 4 37302 37477198
Mandreel 19954116 3 9974959 29934936
MandreelLatency 19954116 3 9974959 29934936
Gameboy Emulator 467585 4 121250 813987
Code loading 23829 5 4208 45064
Box2DWeb 24876419 3 7800731 115579412
zlib - - - -
TypeScript 1114199 3 17 26404297
Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 43 / 43

More Related Content

Viewers also liked

SBS price value & sales productivity (edit) 19.5.15
SBS price value & sales productivity (edit) 19.5.15SBS price value & sales productivity (edit) 19.5.15
SBS price value & sales productivity (edit) 19.5.15
Steve Jessop
 
Top 8 head mechanic resume samples
Top 8 head mechanic resume samplesTop 8 head mechanic resume samples
Top 8 head mechanic resume samples
parrijom
 
TRABAJO COMO REQUISITO PARA EL ÁREA
TRABAJO COMO REQUISITO PARA EL ÁREATRABAJO COMO REQUISITO PARA EL ÁREA
TRABAJO COMO REQUISITO PARA EL ÁREA
sandra Rincon
 
Top 8 accounting support resume samples
Top 8 accounting support resume samplesTop 8 accounting support resume samples
Top 8 accounting support resume samples
kingsmonkey15
 
Chữa Khô Khớp Xương
Chữa Khô Khớp XươngChữa Khô Khớp Xương
Chữa Khô Khớp Xương
milo447
 

Viewers also liked (17)

L.p. the beginning
L.p. the beginningL.p. the beginning
L.p. the beginning
 
SBS price value & sales productivity (edit) 19.5.15
SBS price value & sales productivity (edit) 19.5.15SBS price value & sales productivity (edit) 19.5.15
SBS price value & sales productivity (edit) 19.5.15
 
โครงร่างโครงงานคอมพิวเตอร์ (งานเดี่ยว)
โครงร่างโครงงานคอมพิวเตอร์ (งานเดี่ยว)โครงร่างโครงงานคอมพิวเตอร์ (งานเดี่ยว)
โครงร่างโครงงานคอมพิวเตอร์ (งานเดี่ยว)
 
Sistema electoral chilenopower3
Sistema electoral chilenopower3Sistema electoral chilenopower3
Sistema electoral chilenopower3
 
Trauma Physiology Emotions Behaviour by Laurene Winkler
Trauma Physiology Emotions Behaviour by Laurene WinklerTrauma Physiology Emotions Behaviour by Laurene Winkler
Trauma Physiology Emotions Behaviour by Laurene Winkler
 
Top 8 head mechanic resume samples
Top 8 head mechanic resume samplesTop 8 head mechanic resume samples
Top 8 head mechanic resume samples
 
TRABAJO COMO REQUISITO PARA EL ÁREA
TRABAJO COMO REQUISITO PARA EL ÁREATRABAJO COMO REQUISITO PARA EL ÁREA
TRABAJO COMO REQUISITO PARA EL ÁREA
 
СППР
СППРСППР
СППР
 
Presentación crisol
Presentación crisolPresentación crisol
Presentación crisol
 
Top 8 accounting support resume samples
Top 8 accounting support resume samplesTop 8 accounting support resume samples
Top 8 accounting support resume samples
 
Elasticsearch
ElasticsearchElasticsearch
Elasticsearch
 
Chữa Khô Khớp Xương
Chữa Khô Khớp XươngChữa Khô Khớp Xương
Chữa Khô Khớp Xương
 
профилактика ксенофобии и расизма
профилактика ксенофобии и расизма профилактика ксенофобии и расизма
профилактика ксенофобии и расизма
 
Sufragiopower2
Sufragiopower2Sufragiopower2
Sufragiopower2
 
dipankar cdc-new
dipankar cdc-newdipankar cdc-new
dipankar cdc-new
 
ковалев презентация
ковалев презентацияковалев презентация
ковалев презентация
 
презентация мк в училище
презентация мк в училищепрезентация мк в училище
презентация мк в училище
 

Similar to On Contracts and Sandboxes for JavaScript

Methodologies for Test-Driven Development of OSGi enabled Embedded Devices - ...
Methodologies for Test-Driven Development of OSGi enabled Embedded Devices - ...Methodologies for Test-Driven Development of OSGi enabled Embedded Devices - ...
Methodologies for Test-Driven Development of OSGi enabled Embedded Devices - ...
mfrancis
 

Similar to On Contracts and Sandboxes for JavaScript (20)

Efficient Dynamic Access Analysis Using JavaScript Proxies
Efficient Dynamic Access Analysis Using JavaScript ProxiesEfficient Dynamic Access Analysis Using JavaScript Proxies
Efficient Dynamic Access Analysis Using JavaScript Proxies
 
On Contracts, Sandboxes, and Proxies for JavaScript
On Contracts, Sandboxes, and Proxies for JavaScriptOn Contracts, Sandboxes, and Proxies for JavaScript
On Contracts, Sandboxes, and Proxies for JavaScript
 
Building a (Really) Secure Cloud Product
Building a (Really) Secure Cloud ProductBuilding a (Really) Secure Cloud Product
Building a (Really) Secure Cloud Product
 
Transparent Object Proxies for JavaScript
Transparent Object Proxies for JavaScriptTransparent Object Proxies for JavaScript
Transparent Object Proxies for JavaScript
 
Fullstack Microservices
Fullstack MicroservicesFullstack Microservices
Fullstack Microservices
 
Freenet: The technical part of the solution for Freedom of the Press in the I...
Freenet: The technical part of the solution for Freedom of the Press in the I...Freenet: The technical part of the solution for Freedom of the Press in the I...
Freenet: The technical part of the solution for Freedom of the Press in the I...
 
Security in cloud computing
Security in cloud computingSecurity in cloud computing
Security in cloud computing
 
The MPEG-21 Multimedia Framework for Integrated Management of Environments en...
The MPEG-21 Multimedia Framework for Integrated Management of Environments en...The MPEG-21 Multimedia Framework for Integrated Management of Environments en...
The MPEG-21 Multimedia Framework for Integrated Management of Environments en...
 
Analytic hierarchy process for pif thomas fehlmann
Analytic hierarchy process for pif   thomas fehlmannAnalytic hierarchy process for pif   thomas fehlmann
Analytic hierarchy process for pif thomas fehlmann
 
Comments on Simulations Project Parts I through III.pdf
Comments on Simulations Project Parts I through III.pdfComments on Simulations Project Parts I through III.pdf
Comments on Simulations Project Parts I through III.pdf
 
Comments on Simulations Project.pdf
Comments on Simulations Project.pdfComments on Simulations Project.pdf
Comments on Simulations Project.pdf
 
Methodologies for Test-Driven Development of OSGi enabled Embedded Devices - ...
Methodologies for Test-Driven Development of OSGi enabled Embedded Devices - ...Methodologies for Test-Driven Development of OSGi enabled Embedded Devices - ...
Methodologies for Test-Driven Development of OSGi enabled Embedded Devices - ...
 
Security and Trust in an Industrial Grid Project
Security and Trust in an Industrial Grid ProjectSecurity and Trust in an Industrial Grid Project
Security and Trust in an Industrial Grid Project
 
Aviation Aerospace & Defense industry TRIZ Case Studies - An Overview
Aviation Aerospace & Defense industry TRIZ Case Studies - An Overview Aviation Aerospace & Defense industry TRIZ Case Studies - An Overview
Aviation Aerospace & Defense industry TRIZ Case Studies - An Overview
 
TechEvent DWH Modernization
TechEvent DWH ModernizationTechEvent DWH Modernization
TechEvent DWH Modernization
 
Glasswall Wardley Maps & Services
Glasswall Wardley Maps & ServicesGlasswall Wardley Maps & Services
Glasswall Wardley Maps & Services
 
Butler
ButlerButler
Butler
 
DevOps monitoring: Best Practices using OpenShift combined with Icinga & Big ...
DevOps monitoring: Best Practices using OpenShift combined with Icinga & Big ...DevOps monitoring: Best Practices using OpenShift combined with Icinga & Big ...
DevOps monitoring: Best Practices using OpenShift combined with Icinga & Big ...
 
RuleML2015: Using PSL to Extend and Evaluate Event Ontologies
RuleML2015: Using PSL to Extend and Evaluate Event OntologiesRuleML2015: Using PSL to Extend and Evaluate Event Ontologies
RuleML2015: Using PSL to Extend and Evaluate Event Ontologies
 
Comments on Simulations Project Parts I & II Marking Contingencies.pdf
Comments on Simulations Project Parts I & II Marking Contingencies.pdfComments on Simulations Project Parts I & II Marking Contingencies.pdf
Comments on Simulations Project Parts I & II Marking Contingencies.pdf
 

More from Matthias Keil (6)

Blame Assignment for Higher-Order Contracts with Intersection and Union
Blame Assignment for Higher-Order Contracts with Intersection and UnionBlame Assignment for Higher-Order Contracts with Intersection and Union
Blame Assignment for Higher-Order Contracts with Intersection and Union
 
TreatJS: Higher-Order Contracts for JavaScripts
TreatJS: Higher-Order Contracts for JavaScriptsTreatJS: Higher-Order Contracts for JavaScripts
TreatJS: Higher-Order Contracts for JavaScripts
 
Symbolic Solving of Extended Regular Expression Inequalities
Symbolic Solving of Extended Regular Expression InequalitiesSymbolic Solving of Extended Regular Expression Inequalities
Symbolic Solving of Extended Regular Expression Inequalities
 
TreatJS: Higher-Order Contracts for JavaScript
TreatJS: Higher-Order Contracts for JavaScriptTreatJS: Higher-Order Contracts for JavaScript
TreatJS: Higher-Order Contracts for JavaScript
 
Type-based Dependency Analysis for JavaScript
Type-based Dependency Analysis for JavaScriptType-based Dependency Analysis for JavaScript
Type-based Dependency Analysis for JavaScript
 
Type-based Dependency Analysis
Type-based Dependency AnalysisType-based Dependency Analysis
Type-based Dependency Analysis
 

Recently uploaded

Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Recently uploaded (20)

CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 

On Contracts and Sandboxes for JavaScript

  • 1. On Contracts and Sandboxes for JavaScript Matthias Keil, Peter Thiemann University of Freiburg, Germany August 6, 2015 Darmstadt, Germany
  • 2. Motivation 89.8 % of all web sites use JavaScript1 1 according to http://w3techs.com/, status of July 2015 Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 2 / 43
  • 3. Motivation 89.8 % of all web sites use JavaScript1 Most important client-side language for web sites Web-developers rely on third-party libraries e.g. for calendars, maps, social networks 1 according to http://w3techs.com/, status of July 2015 Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 2 / 43
  • 4. Situation of a Web-developer Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 3 / 43
  • 5. Situation of a Web-developer Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 3 / 43
  • 6. Situation of a Web-developer Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 3 / 43
  • 7. Situation of a Web-developer Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 3 / 43
  • 8. Situation of a Web-developer Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 3 / 43
  • 9. Situation of a Web-developer Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 3 / 43
  • 10. JavaScript issues Dynamic programming language Code is accumulated by dynamic loading e.g. eval, mashups Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 4 / 43
  • 11. JavaScript issues Dynamic programming language Code is accumulated by dynamic loading e.g. eval, mashups JavaScript has no security awareness No namespace or encapsulation management Global scope for variables/ functions All scripts have the same authority Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 4 / 43
  • 12. JavaScript issues Dynamic programming language Code is accumulated by dynamic loading e.g. eval, mashups JavaScript has no security awareness No namespace or encapsulation management Global scope for variables/ functions All scripts have the same authority Problems 1 Side effects may cause unexpected behavior 2 Program understanding and maintenance is difficult 3 Libraries may get access to sensitive data 4 User code may be prone to injection attacks Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 4 / 43
  • 13. Key challenges of present research All-or-nothing choice when including code Isolation guarantees noninterference Some scripts must have access the application state or are allowed to change it Goals 1 Manage untrusted JavaScript Code 2 Control the use of data by included scripts 3 Reason about effects of included scripts Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 5 / 43
  • 14. Language-embedded Systems Shortcomings Static verifiers are imprecise because of JavaScript’s dynamic features or need to restrict JavaScript’s dynamic features Interpreter modifications guarantee full observability but need to be implemented in all existing engines Implemented as a library in JavaScript Library can easily be included in existing projects All aspects are accessible thought an API No source code transformation or change in the JavaScript run-time system is required Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 6 / 43
  • 15. Timeline 2011 JSConTest Access Permission Contracts for Scripting Languages 2013 JSConTest2 Efficient Access Analysis Using JavaScript Proxies 2015 TreatJS Higher-Order Contracts for JavaScript TreatJS-Sandbox Transaction-based Sandboxing of JavaScript ? Ongoing Work Temporal Contracts, Lemma Contracts, Invariants Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 7 / 43
  • 16. JSConTest JSConTest Access Permission Contracts for Scripting Languages Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 8 / 43
  • 17. JSConTest Investigate effects of unfamiliar function Type and effect contracts with run-time checking Summarizes observed access traces to a concise description Effect contracts specifying allowed access paths Type and effect contracts /∗c (obj, obj) −> any with [x.b,y.a] ∗/ function f(x, y) { y.a = 1; y.b = 2; violation } Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 9 / 43
  • 18. Shortcomings of JSConTest Implemented by an offline code transformation Partial interposition (dynamic code, eval, with, . . . ) Tied to a particular version of JavaScript Transformation hard to maintain Special contract syntax Requires a special JavaScript parser Efficiency issues Naive representation of access paths Wastes memory and impedes scalability Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 10 / 43
  • 19. JSConTest2 JSConTest2 Efficient Access Analysis Using JavaScript Proxies Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 11 / 43
  • 20. JSConTest2 Redesign and reimplementation of JSConTest based on JavaScript proxies Advantages Full interposition for the full language Including dynamically loaded code and eval Safe for future language extensions No transformation to maintain Runs faster in less memory Efficient representation of access paths Incremental path matching Maintenance is simplified No custom syntax for contracts Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 12 / 43
  • 21. JSConTest2 Contracts on Objects var obj = APC.permit(’(a.?+b∗)’, {a:{b:5},b:{b:11}}); a = obj.a; // APC.permit(’?’, {b:5}); a.b = 3; APC encapsulates JSConTest2 permit wraps an object with a permission. Arguments: 1 Permission encoded in a string 2 Object that is protected by the permission Contract specifies permitted access paths Last property is readable/ writeable Prefix is read-only Not addressed properties are neither readable nor writeable Read-only paths possible (@ denotes a non-existing property) Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 13 / 43
  • 22. Proxy Membrane ProxyA ProxyB ProxyC TargetA TargetB TargetC Contract: C Path: P Contract: ∂x C Path: P.x Contract: ∂y C Path: P.y Contract: (∂z∂x C)(∂y C) Path: P.(x.z|y) Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 14 / 43
  • 23. Proxy Membrane ProxyA ProxyB ProxyC TargetA TargetB TargetC x x Contract: C Path: P Contract: ∂x C Path: P.x Contract: ∂y C Path: P.y Contract: (∂z∂x C)(∂y C) Path: P.(x.z|y) Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 14 / 43
  • 24. Proxy Membrane ProxyA ProxyB ProxyC TargetA TargetB TargetC x y x y Contract: C Path: P Contract: ∂x C Path: P.x Contract: ∂y C Path: P.y Contract: (∂z∂x C)(∂y C) Path: P.(x.z|y) Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 14 / 43
  • 25. Proxy Membrane ProxyA ProxyB ProxyC TargetA TargetB TargetC x y z x y z Contract: C Path: P Contract: ∂x C Path: P.x Contract: ∂y C Path: P.y Contract: (∂z∂x C)(∂y C) Path: P.(x.z|y) Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 14 / 43
  • 26. The JSConTest2 Approach Implementation based on the JavaScript Proxy API Shortcomings of previous, translation-based implementation avoided Full interposition of contracted objects Proxy intercepts all operations Proxy-handler contains a contract and a path set Forwards the operation or signals a violation Returned object contains the remaining contract (Membrane) Access contracts are regular expressions on literals Each literal defines a property access The language defines a set of permitted access paths Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
  • 27. TreatJS TreatJS Higher-Order Contracts for JavaScript Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 16 / 43
  • 28. Introduction Language embedded contract system for JavaScript Enforced by run-time monitoring Specifies the interface of a software component Pre- and postconditions Standard abstractions for higher-order-contracts (base, function, and dependent contracts) [Findler,Felleisen’02] Systematic blame calculation Side-effect free contract execution Contract constructors generalize dependent contracts Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 17 / 43
  • 29. Base Contract [Findler,Felleisen’02] Base Contracts are built from predicates Specified by a plain JavaScript function function isNumber (arg) { return (typeof arg) === ’number’; }; var Number = Contract.Base(isNumber); assert(1, Number ); assert(’a’, Number ); blame the subject Subject v gets blamed for Base Contract B iff: B(v) = true Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 18 / 43
  • 30. Function Contract [Findler,Felleisen’02] // Number × Number → Number function plus (x, y) { return (x + y); } Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 19 / 43
  • 31. Function Contract [Findler,Felleisen’02] // Number × Number → Number function plus (x, y) { return (x + y); } var plus = assert(plus, Contract.Function([ Number , Number ], Number )); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 19 / 43
  • 32. Function Contract [Findler,Felleisen’02] // Number × Number → Number function plus (x, y) { return (x + y); } plus(’a’, ’a’); blame the context Context gets blamed for C → C iff: Argument x gets blamed for C (as subject) Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 19 / 43
  • 33. Function Contract [Findler,Felleisen’02] // Number × Number → Number function plusBroken (x, y) { return (x0 y0) ? (x + y) : ’Error’; } plusBroken(0, 1); blame the subject Subject f gets blamed for C → C iff: ¬ (Context gets blamed C) ∧ (f (x) gets blamed C ) Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 19 / 43
  • 34. TreatJS New! Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 20 / 43
  • 35. Overloaded Operator Function plus works for strings, too Requires to model overloading and multiple inheritances // Number × Number → Number function plus (x, y) { return (x + y); } plus(’a’, ’a’); blame the context Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 21 / 43
  • 36. Combinations of Contracts No support for arbitrary combination of contracts Racket supports and/c and or/c Attempt to extend conjunction and disjunction to higher-oder contracts Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 22 / 43
  • 37. Combinations of Contracts and/c and/c tests any contract no value fulfills Number and String at the same time (and/c (Number × Number → Number) (String × String → String)) function plus (x, y) { return (x + y); } plus(’a’, ’a’); blame the context Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 23 / 43
  • 38. Combinations of Contracts or/c or/c checks first-order parts and fails unless exactly one (range) contract remains Work for disjoint base contracts No combination of higher-oder contracts No support for arbitrary combinations of contracts (or/c (Number × Number → Number) (String × String → String)) function plus (x, y) { return (x + y); } plus(’a’, ’a’); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 24 / 43
  • 39. Combinations of Contracts TreatJS Support for arbitrary combination of contracts Combination of base and function contracts Combination of function contracts with a different arity Intersection and union contracts Boolean combination of contracts Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 25 / 43
  • 40. Intersection Contract // (Number × Number → Number) ∩ (String × String → String) function plus (x, y) { return (x + y); } Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 26 / 43
  • 41. Intersection Contract // (Number × Number → Number) ∩ (String × String → String) function plus (x, y) { return (x + y); } var plus = assert(plus, Contract.Intersection( Contract.Function([ Number , Number ], Number ) Contract.Function([ String , String ], String )); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 26 / 43
  • 42. Intersection Contract // (Number × Number → Number) ∩ (String × String → String) function plus (x, y) { return (x + y); } plus(true, true); blame the context Context gets blamed for C ∩ C iff: (Context gets blamed for C) ∧ (Context gets blamed for C ) Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 26 / 43
  • 43. Intersection Contract // (Number × Number → Number) ∩ (String × String → String) function plusBroken (x, y) { return (x0 y0) ? (x + y) : ’Error’; } plusBroken(0, 1); blame the subject Subject f gets blamed for C ∩ C iff: (f gets blamed for C) ∨ (f gets blamed for C ) Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 26 / 43
  • 44. Contract Assertion A failing contract must not signal a violation immediately Violation depends on combinations of failures in different sub-contracts // (Number → Number) ∩ (String → String) function addOne (x) { return (x + 1); } addOne(’a’); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 27 / 43
  • 45. Contract Assertion A failing contract must not signal a violation immediately Violation depends on combinations of failures in different sub-contracts // (Number → Number) ∩ (String → String) function addOne (x) { return (x + 1); } addOne(’a’); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 27 / 43
  • 46. Contract Assertion A failing contract must not signal a violation immediately Violation depends on combinations of failures in different sub-contracts // (Number → Number) ∩ (String → String) function addOne (x) { return (x + 1); } addOne(’a’); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 27 / 43
  • 47. Blame Calculation Contract assertion must connect each contract with the enclosing operations Callback implements a constraint and links each contracts to its next enclosing operation Reports a record containing two fields, context and subject Fields range over B4 = {⊥, f, t, } [Belnap’1977] Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 28 / 43
  • 48. Non-Interference No syntactic restrictions on predicates Problem: Contract may interfere with program execution Solution: Predicate evaluation takes place in a sandbox function isNumber (arg) { type = (typeof arg); return type === ’number’; }; var Number = Contract.Base(isNumber); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 29 / 43
  • 49. Non-Interference No syntactic restrictions on predicates Problem: Contract may interfere with program execution Solution: Predicate evaluation takes place in a sandbox function isNumber (arg) { type = (typeof arg); access forbidden return type === ’number’; }; var Number = Contract.Base(isNumber); assert(1, Number ); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 29 / 43
  • 50. Sandbox All contracts guarantee noninterference Read-only access is safe var Array = Contract.Base(function (arg) { return (arg instanceof Array); access forbidden }); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 30 / 43
  • 51. Sandbox All contracts guarantee noninterference Read-only access is safe var Array = Contract.Base(function (arg) { return (arg instanceof OutsideArray); }); var Array = Contract.With({OutsideArray:Array}, Array ); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 30 / 43
  • 52. Contract Constructor Building block for dependent, parameterized, abstract, and recursive contracts Constructor gets evaluated in a sandbox, like a predicate Returns a contract No further sandboxing for predicates var Type = Contract.Constructor(function (type) { return Contract.Base(function (arg) { return (typeof arg) === type; }); }); var Number = Type (’number’); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 31 / 43
  • 53. TreatJS-Sandbox TreatJS-Sandbox Transaction-based Sandboxing of JavaScript Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 32 / 43
  • 54. TreatJS-Sandbox Language-embedded sandbox for full JavaScript Inspired by JSConTest2 and Revocable References Adapts SpiderMonkey’s compartment concept to run code in isolation to the application state Provides features known from transaction processing in database systems and transactional memory Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 33 / 43
  • 55. Sandbox Encapsulation A reference is the right to access an object Requires to control property read and property write Sandbox Encapsulation 1 Place a write protection on objects 2 Remove external bindings of functions Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 34 / 43
  • 56. Identity Preserving Membrane ProxyA ProxyB ProxyC TargetA TargetB TargetC x y z x y z Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 35 / 43
  • 57. JavaScript Proxies Handler Proxy Target Shadow proxy.x; proxy.y=1; proxy.y; handler.get(target, ’x’, proxy); handler.set(target, ’y’, 1, proxy); handler.get(target, ’y’, proxy); target[’x’]; target[’y’]=1; target[’y’]; Meta-Level Base-Level Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 36 / 43
  • 58. Shadow Objects Handler Proxy Target Shadow proxy.x; proxy.y=1; proxy.y; handler.get(target, ’x’, proxy); handler.set(target, ’y’, 1, proxy); handler.get(target, ’y’, proxy); target[’x’]; shadow[’y’]=1; shadow[’y’]; Meta-Level Base-Level Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 37 / 43
  • 59. Function Recompilation Function decompilation uses the Function.prototype.toString method to return a string that contains the source code of that function Applying eval to the string creates a fresh variant A with statement places a proxy in top of the scope chain The hasOwnProperty trap always returns true Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 38 / 43
  • 60. JavaScript Scope Chain var x = 1; function f (y){ function g () { var z = 1; return x+y+z; } } Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 39 / 43
  • 61. Sandbox Scope Chain var x = 1; with(sbxglobal){ function g () { var z = 1; return x+y+z; } } Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 40 / 43
  • 62. Conclusion JSConTest/ JSConTest2: Effect monitoring for JavaScript Enables to specify effects using access permission contracts TreatJS: Language embedded, dynamic, higher-order contract system for full JavaScript Support for intersection and union contracts Contract constructors with local scope Sandbox: Language embedded sandbox for full JavaScript Runs code in a configurable degree of isolation Provides a transactional scope Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 41 / 43
  • 63. Ongoing Work Temporal/ Computation Contracts Lemma Contracts Invariants Different blaming semantics (Lax, Picky, Indy) Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 42 / 43
  • 64. Further Challenges Limitations Dynamic contract checking impacts the execution time Arbitrary combinations of contracts lead to unprecise error messages 1 Hybrid contract checking 2 Static pre-checking of contracts 3 Optimization, contract rewriting Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 43 / 43
  • 65. Appendix Appendix Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 1 / 43
  • 66. JSConTest JSConTest Access Permission Contracts for Scripting Languages Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 2 / 43
  • 67. JSConTest2 JSConTest2 Efficient Access Analysis Using JavaScript Proxies Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 3 / 43
  • 68. JSConTest2 Redesign and reimplementation of JSConTest based on JavaScript proxies Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 4 / 43
  • 69. JSConTest2 Redesign and reimplementation of JSConTest based on JavaScript proxies Advantages Full interposition for the full language Including dynamically loaded code and eval Safe for future language extensions No transformation to maintain Runs faster in less memory Efficient representation of access paths Incremental path matching Maintenance is simplified No custom syntax for contracts Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 4 / 43
  • 70. Contracts on Functions Contracts on Functions var func = APC.permitArgs(’arguments.0.(a.?+b∗)’, function(arg0) { // do something }); permitArg wraps a function with permissions 1 contract applied to function arguments 2 function Arguments accessed by position arguments.0 No reliable way to access parameter names Function may use unlisted parameters Parameter names may not be unique Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 5 / 43
  • 71. Interaction of Contracts Interaction of Contracts var obj = APC.permit(’((a+a.b)+b.b.@)’, {a:{b:3}, b:{b:5}}); obj.a = obj.b; // APC.permit(’b.@’, {b:5}); y = obj.a; // APC.permit(’b b.@’, {b:5}); y.b = 7; violation Line 2 reads obj.b and writes obj.a Afterwards, obj.b and obj.a are aliases JSConTest2 enforces both contracts reaching obj.b and obj.a obj.a carries contract !’( +b)b.@’! = !’b.@’! Thus, writing to obj.a.b is not permitted Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 6 / 43
  • 72. Limitations 1 Cannot directly protect DOM objects because of the browser’s sandbox 2 Proxies are not transparent with respect to equality, i.e. for distinct proxies == and === returns false, even if the target object is the same Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 7 / 43
  • 73. TreatJS TreatJS Higher-Order Contracts for JavaScript Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 8 / 43
  • 74. Object Contract Defined by a mapping from property names to contracts Represented as a pair of a getter and a setter function Getter and Setter apply the property’s contract var arraySpec = Contract.AObject({length: Number }); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 9 / 43
  • 75. Object Contract Defined by a mapping from property names to contracts Represented as a pair of a getter and a setter function Getter and Setter apply the property’s contract var arraySpec = Contract.AObject({length: Number }); var faultyObj = assert({length:’1’}, arraySpec); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 9 / 43
  • 76. Object Contract Defined by a mapping from property names to contracts Represented as a pair of a getter and a setter function Getter and Setter apply the property’s contract var arraySpec = Contract.AObject({length: Number }); var faultyObj = assert({length:’1’}, arraySpec); var faultyObj.length; blame the subject Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 9 / 43
  • 77. Object Contract Defined by a mapping from property names to contracts Represented as a pair of a getter and a setter function Getter and Setter apply the property’s contract var arraySpec = Contract.AObject({length: Number }); var faultyObj = assert({length:’1’}, arraySpec); var faultyObj.length = ’2’; blame the context Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 9 / 43
  • 78. Function Contract Function Contract is build from one contract for the domain and one contract for the range of a function An Object Contract serves as the domain portion of a Function Contract with zero or more arguments AFunction defines an Object Contract from the array Contract.AFunction([ Number , Number ], Number )); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 10 / 43
  • 79. Function Contract Function Contract is build from one contract for the domain and one contract for the range of a function An Object Contract serves as the domain portion of a Function Contract with zero or more arguments AFunction defines an Object Contract from the array Contract.AFunction([ Number , Number ], Number )); Contract.Function( Contract.AObject([ Number , Number ]), Number )); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 10 / 43
  • 80. Recursive Contract Similar to Constructors Unrolls the constructor when asserted Contract is given as argument to the constructor var LinkedList = Contract.Recursive( Contract.Constructor(function( LinkedList ) { return Contract.AObject({ value: Number , next: LinkedList }); })); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 11 / 43
  • 81. Union Contract // (Number × Number → Number) ∪ (Number × Number → String) function plusBroken (x, y) { return (x0 y0) ? (x + y) : ’Error’; } Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 12 / 43
  • 82. Union Contract // (Number × Number → Number) ∪ (Number × Number → String) function plusBroken (x, y) { return (x0 y0) ? (x + y) : ’Error’; } var plusBroken = assert(plusBroken, Contract.Union( Contract.Function([ Number , Number ], Number ) Contract.Function([ Number , Number ], String )); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 12 / 43
  • 83. Union Contract // (Number × Number → Number) ∪ (Number × Number → String) function plusBroken (x, y) { return (x0 y0) ? (x + y) : ’Error’; } plusBroken(’a’, ’a’); blame the context Context gets blamed for C ∪ C iff: (Context gets blamed for C) ∨ (Context gets blamed for C ) Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 12 / 43
  • 84. Union Contract // (Number × Number → Number) ∪ (Number × Number → String) function plusBroken (x, y) { return (x0 y0) ? (x + y) : ’Error’; } plusBroken(1, 1); plusBroken(0, 1); blame the subject Subject f gets blamed for C ∪ C iff: (f gets blamed for C) ∧ (f gets blamed for C ) Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 12 / 43
  • 85. Contract Abstraction // T × T → T function plus (x, y) { return (x + y); } Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 13 / 43
  • 86. Contract Abstraction // T × T → T function plus (x, y) { return (x + y); } var Plus = Contract.Constructor(function ( Type ) { return Contract.Function([Type, Type], Type); }); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 13 / 43
  • 87. Contract Abstraction // T × T → T function plus (x, y) { return (x + y); } var Plus = Contract.Constructor(function ( Type ) { return Contract.Function([Type, Type], Type); }); var Plus = assert(plus, Plus ); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 13 / 43
  • 88. Contract Abstraction // T × T → T function plus (x, y) { return (x + y); } var Plus = Contract.Constructor(function ( Type ) { return Contract.Function([Type, Type], Type); }); var Plus = assert(plus, Plus ); Plus( Number )(1, 2); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 13 / 43
  • 89. Dependent Contract // T × T → T function plus (x, y) { return (x + y); } var Type = Contract.Constructor(function(x, y) { return Contract.Base(function (arg) { return ((typeof x) === (typeof y)) ((typeof x) === (typeof arg)); }); }); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 14 / 43
  • 90. Dependent Contract // T × T → T function plus (x, y) { return (x + y); } var Type = Contract.Constructor(function(x, y) { return Contract.Base(function (arg) { return ((typeof x) === (typeof y)) ((typeof x) === (typeof arg)); }); }); var plus = assert(plus, Contract.Dependent( Type )); plus(1, 2); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 14 / 43
  • 91. Callback Graph // (Number → Number) ∩ (String → String) function addOneBroken (x) { return (x + ’1’); } addOneBroken(’a’); addOneBroken(1); blame the subject Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
  • 92. Callback Graph • ∩ → Number Number → String String ∩ → Number Number → String String (⊥,⊥) // (Number → Number) ∩ (String → String) addOneBroken(’a’); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
  • 93. Callback Graph • ∩ → Number Number → String String ∩ → Number Number → String String (⊥,⊥) (⊥,⊥) // (Number → Number) ∩ (String → String) addOneBroken(’a’); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
  • 94. Callback Graph • ∩ → Number Number → String String ∩ → Number Number → String String (⊥,⊥) (⊥,⊥) (⊥,⊥) // (Number → Number) ∩ (String → String) addOneBroken(’a’); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
  • 95. Callback Graph • ∩ → Number Number → String String ∩ → Number Number → String String (⊥,⊥) (⊥,⊥) (⊥,⊥) (⊥,⊥) // (Number → Number) ∩ (String → String) addOneBroken(’a’); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
  • 96. Callback Graph • ∩ → Number Number → String String ∩ → Number Number → String String (t,t) (⊥,⊥) (⊥,⊥) (⊥,⊥) (⊥,⊥) // (Number → Number) ∩ (String → String) addOneBroken(’a’); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
  • 97. Callback Graph • ∩ → Number Number → String String ∩ → Number Number → String String (t,f) (t,t) (f,t) (⊥,⊥) (⊥,⊥) (⊥,⊥) // (Number → Number) ∩ (String → String) addOneBroken(’a’); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
  • 98. Callback Graph • ∩ → Number Number → String String ∩ → Number Number → String String (t,f) (t,f) (t,t) (f,t) (⊥,⊥) (⊥,⊥) (⊥,⊥) // (Number → Number) ∩ (String → String) addOneBroken(’a’); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
  • 99. Callback Graph • ∩ → Number Number → String String ∩ → Number Number → String String (t,f) (t,f) (t,t) (t,t) (f,t) (t,t) (t,t) (t,t)(t,t) // (Number → Number) ∩ (String → String) addOneBroken(’a’); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
  • 100. Callback Graph • ∩ → Number Number → String String ∩ → Number Number → String String (t,t) (⊥,⊥) (⊥,⊥) (⊥,⊥) // (Number → Number) ∩ (String → String) addOneBroken(1); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
  • 101. Callback Graph • ∩ → Number Number → String String ∩ → Number Number → String String (t,t) (t,f) (⊥,⊥) (f,t) (⊥,⊥) // (Number → Number) ∩ (String → String) addOneBroken(1); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
  • 102. Callback Graph • ∩ → Number Number → String String ∩ → Number Number → String String (t,t) (t,t) (t,f) (⊥,⊥) (f,t) (⊥,⊥) // (Number → Number) ∩ (String → String) addOneBroken(1); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
  • 103. Callback Graph • ∩ → Number Number → String String ∩ → Number Number → String String (t,t) (t,f) (t,f) (t,f) (f,t) (t,f) (t, ) // (Number → Number) ∩ (String → String) addOneBroken(1); blame the subject Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 15 / 43
  • 104. Scores Benchmark Full System Baseline Richards 0.391 0.519 11142 DeltaBlue 0.276 0.360 17462 Crypto 11888 12010 11879 RayTrace 1.09 1.45 23896 EarleyBoyer 5135 5292 5370 RegExp 1208 1181 1207 Splay 20.6 27.8 9555 SplayLatency 73.1 99.7 6289 NavierStokes 6234 7159 12612 pdf.js 9191 9257 9236 Mandreel 12555 12542 12580 MandreelLatency 18741 18883 19398 Gameboy Emulator 6.80 9.07 23801 Code loading 6245 6785 9324 Box2DWeb 3.57 4.67 12528 zlib 29108 28708 29185 TypeScript 187 248 11958 Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 16 / 43
  • 105. Scores Benchmark Full w/o C w/o D w/o M w/o P Richards 0.391 0.582 0.782 0.781 0.903 DeltaBlue 0.276 0.409 0.544 0.544 0.625 Crypto 11888 11912 11914 11986 11979 RayTrace 1.09 1.82 2.51 2.51 3.02 EarleyBoyer 5135 5126 5205 5233 5242 RegExp 1208 1205 1199 1212 1178 Splay 20.6 31.2 42.5 42.5 49.7 SplayLatency 73.1 109 151 151 177 NavierStokes 6234 7924 9176 8943 9456 pdf.js 9191 9548 9156 9222 9152 Mandreel 12555 12586 12549 12346 12431 MandreelLatency 18741 18741 18883 19027 18955 Gameboy Emulator 6.80 10.8 14.9 14.9 17.7 Code loading 6245 6937 7372 7335 7533 Box2DWeb 3.57 5.72 7.80 7.82 9.19 zlib 29108 29025 29047 28926 29063 TypeScript 187 290 400 396 463 Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 16 / 43
  • 106. Statistic Benchmark Contract A I P Richards 24 1599377224 935751200 DeltaBlue 54 2319477672 1340451212 Crypto 1 5 3 RayTrace 42 687240082 509234422 EarleyBoyer 3944 89022 68172 RegExp 0 0 0 Splay 10 11620663 7067593 SplayLatency 10 11620663 7067593 NavierStokes 51 48334 39109 pdf.js 3 15 9 Mandreel 7 57 28 MandreelLatency 7 57 28 Gameboy Emulator 3206 141669753 97487985 Code loading 5600 34800 18400 Box2DWeb 20075 172755100 112664947 zlib 0 0 0 TypeScript 4 12673644 8449090 Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 17 / 43
  • 107. Statistic Benchmark Sandbox M D Richards 4678756000 4 DeltaBlue 6702256060 5 Crypto 15 3 RayTrace 2546172110 4 EarleyBoyer 340860 6 RegExp 0 0 Splay 35337965 5 SplayLatency 35337965 5 NavierStokes 195545 5 pdf.js 45 4 Mandreel 140 4 MandreelLatency 140 4 Gameboy Emulator 487439925 5 Code loading 92000 4 Box2DWeb 563324735 5 zlib 0 0 TypeScript 42245450 2 Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 17 / 43
  • 108. Statistic Benchmark Callback Richards 3351504000 DeltaBlue 4744203248 Crypto 13 RayTrace 2190186074 EarleyBoyer 309120 RegExp 0 Splay 26231845 SplayLatency 26231845 NavierStokes 177197 pdf.js 39 Mandreel 128 MandreelLatency 128 Gameboy Emulator 399084085 Code loading 70400 Box2DWeb 469141435 zlib 0 TypeScript 33796350 Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 17 / 43
  • 109. Timings Benchmark Full Baseline Richards 1 day, 18 hours, 21 min, 20 sec 8 sec DeltaBlue 2 days, 10 hours, 36 min, 49 sec 4 sec Crypto 9 sec 8 sec RayTrace 23 hours, 12 min, 37 sec 4 sec EarleyBoyer 1 min, 9 sec 53 sec RegExp 9 sec 8 sec Splay 19 min, 19 sec 3 sec SplayLatency 19 min, 19 sec 3 sec NavierStokes 11 sec 4 sec pdf.js 6 sec 6 sec Mandreel 5 sec 5 sec MandreelLatency 5 sec 5 sec Gameboy Emulator 4 hours, 28 min, 28 sec 5 sec Code loading 12 sec 9 sec Box2DWeb 5 hours, 19 min, 49 sec 6 sec zlib 11 sec 11 sec TypeScript 22 min, 46 sec 24 sec Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 18 / 43
  • 110. Timings Benchmark Predicate Baseline Richards 1 day, 6 hours, 59 min, 42 sec 8 sec DeltaBlue 1 day, 20 hours, 58 min, 17 sec 4 sec Crypto 8 sec 8 sec RayTrace 17 hours, 1 min, 25 sec 4 sec EarleyBoyer 1 min, 3 sec 53 sec RegExp 8 sec 8 sec Splay 13 min, 55 sec 3 sec SplayLatency 13 min, 55 sec 3 sec NavierStokes 9 sec 4 sec pdf.js 6 sec 6 sec Mandreel 5 sec 5 sec MandreelLatency 5 sec 5 sec Gameboy Emulator 3 hours, 13 min, 13 sec 5 sec Code loading 12 sec 9 sec Box2DWeb 3 hours, 52 min, 34 sec 6 sec zlib 12 sec 11 sec TypeScript 17 min, 8 sec 24 sec Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 18 / 43
  • 111. TreatJS-Sandbox TreatJS-Sandbox Transaction-based Sandboxing of JavaScript Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 19 / 43
  • 112. Motivation Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 20 / 43
  • 113. Application Scenarios TreatJS Non-interfering Contract Execution var Number = Contract.Base(function (arg) { type = (typeof arg); return type === ’number’; }); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 21 / 43
  • 114. Application Scenarios TreatJS Non-interfering Contract Execution var Number = Contract.Base(function (arg) { type = (typeof arg); return type === ’number’; }); Read-only access var Array = Contract.Base(function (arg) { return (arg instanceof OutsideArray); }); var Array = Contract.With({OutsideArray:Array}, Array ); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 21 / 43
  • 115. Application Scenarios TreatJS Online Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 22 / 43
  • 116. Running Example function Node (value, left, right) { this.value = value; this.left = left; this.right = right; } function heightOf (node) { return node ? Math.max(heightOf(node.left)+1), heightOf( node.right)+1) : −1; } function setValue (node) { node.value=heightOf(node); if(node.left) setValue(node.left); if(node.right) setValue(node.right); } Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 23 / 43
  • 117. Function Invocation var root = new Node(0, new Node(0), new Node(0)); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 24 / 43
  • 118. Function Invocation var root = new Node(0, new Node(0), new Node(0)); var sbx = new Sandbox(this, {/∗ some parameters ∗/}); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 24 / 43
  • 119. Function Invocation var root = new Node(0, new Node(0), new Node(0)); var sbx = new Sandbox(this, {/∗ some parameters ∗/}); sbx.call(heightOf, this, root); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 24 / 43
  • 120. Cross-Sandbox Access Read Access 0 0 0 0 0 0 left right global sandbox function heightOf (node) { return node ? Math.max(heightOf(node.left)+1), heightOf( node.right)+1) : −1; } Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 25 / 43
  • 121. Cross-Sandbox Access Read Access 0 0 0 0 0 0 left right global left sandbox function heightOf (node) { return node ? Math.max(heightOf(node.left)+1), heightOf( node.right)+1) : −1; } Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 25 / 43
  • 122. Cross-Sandbox Access Read Access 0 0 0 0 0 0 left right global left right sandbox function heightOf (node) { return node ? Math.max(heightOf(node.left)+1), heightOf( node.right)+1) : −1; } Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 25 / 43
  • 123. Cross-Sandbox Access Write Access 0 0 0 01 00 00 left right global left right sandbox function setValue (node) { node.value=heightOf(node); if(node.left) setValue(node.left); if(node.right) setValue(node.right); } Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 26 / 43
  • 124. Cross-Sandbox Access Write Access 0 0 0 01 00 00 left right global left right sandbox function setValue (node) { node.value=heightOf(node); if(node.left) setValue(node.left); if(node.right) setValue(node.right); } Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 26 / 43
  • 125. Cross-Sandbox Access Write Access (cont’d) 0 0 0 0 0 a b c right left right sandbox2 left right global var sbx2 = new Sandbox(this, {/∗ some parameters ∗/}); function appendRight (node) { node.right = Node(’a’, Node(’b’), Node(’c’)); } sbx2.call(appendRight, this, root); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 27 / 43
  • 126. Effect Monitoring Read Effects 0 0 0 1 0 0 left right global left right sandbox sbx.effectsOf(this).foreach(function(i, e) {print(e)}); ;;; Effects of this (1425301383541) has [name=heightOf] (1425301383541) get [name=heightOf] (1425301383543) has [name=Math] (1425301383543) get [name=Math] ... Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 28 / 43
  • 127. Effect Monitoring Write Effects 0 0 0 1 0 0 left right global left right sandbox sbx.writeeffectsOf(root).foreach(function(i, e) {print(e)}); ;;; Write Effects of root (1425301634992) set [name=value] Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 29 / 43
  • 128. Inspecting a Sandbox Changes 0 0 0 1 0 0 left right global left right sandbox sbx.hasChanges; // returns true sbx.changes.foreach(function(i, e) {print(e)}); ;;; All Changes Change: (1425300876577) set [name=value]@SBX001 Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 30 / 43
  • 129. Inspecting a Sandbox Differences 0 0 0 0 0 12 01 0 0 00 left right left right global left right sandbox sbx.hasDifferences; // returns true sbx.differences.foreach(function(i, e) {print(e)}); ;;; Differences of root Difference: (1425300932388) set [name=value]@SBX001 Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 31 / 43
  • 130. Inspecting a Sandbox Differences 0 0 0 0 0 12 01 0 0 00 left right left right global left right left right sandbox sbx.hasDifferences; // returns true sbx.differences.foreach(function(i, e) {print(e)}); ;;; Differences of root Difference: (1425300932388) set [name=value]@SBX001 Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 31 / 43
  • 131. Inspecting a Sandbox Conflicts 2 1 0 0 0 0 0 a b c right left right sandbox2 left right left right sandbox sbx.inConflictWith(sbx2); // returns true sbx.conflictsWith(sbx2).foreach(function(i, e) {print(e)}); Confict: (1425303937853) get [name=right]@SBX001 − (1425303937855) set [name=right]@SBX002 Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 32 / 43
  • 132. Transaction Processing Commit 2 1 0 0 1 2 1 0 0 1 left right left right global left right left right sandbox sbx.commit(); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 33 / 43
  • 133. Transaction Processing Rollback 2 1 0 0 1 0 0 0 0 0 left right left right global left right left right sandbox sbx.rollback(); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 34 / 43
  • 134. Transaction Processing Revert 2 1 0 0 1 2 1 0 0 1 left right left right global left right left right sandbox sbx.revert(); Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 35 / 43
  • 135. Further Features Fine-graned handling of commit, rollback and revert Transparent sandboxing Snapshot Mode Wrapping of values Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 36 / 43
  • 136. Sandbox Scope Chain var node = new Node(/∗some sub−nodes ∗/); var sbx = new Sandbox(this, /∗some parameters ∗/); with(sbxglobal){ function setValue (node) { node.value=heightOf(node); setValue(node.left); setValue(node.right); } } Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 37 / 43
  • 137. Policies A new sandbox starts with a blank environment Read access by binding values when instantiating a new sandbox Fine-grained write access by committing effects Combination with Access Permission Contracts and Revocable References possible Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 38 / 43
  • 138. Features Enables scripts to run in a configurable degree of isolation Enables fine-grained access control Provides a transactional scope that performs effect logging Effects can be committed to the application state or rolled back Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 39 / 43
  • 139. Limitations Function recompilation needs a string that contains the source code of that function Function.prototype.toString did not work for all functions A native function did not have a string representation The Function.prototype.bind method creates a new bound function without a string representation Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 40 / 43
  • 140. Experimental Evaluation Scores Benchmark Sandbox Transparent Baseline F w/o E F w/o E Richards 3919 4270 4070 4078 6618 DeltaBlue 177 333 225 333 4778 Crypto 1508 1917 1666 1959 11012 RayTrace 158 211 157 220 3941 EarleyBoyer 624 677 618 663 2648 RegExp 883 900 887 903 1192 Splay 697 774 706 1394 1439 SplayLatency 1986 2567 1983 2276 1234 NavierStokes 915 865 938 934 11835 pdf.js 84 121 85 127 9229 Mandreel 95 122 96 124 8521 MandreelLatency 455 621 437 632 16562 Gameboy Emulator 4413 5081 4577 5027 22307 Code loading 5123 5264 5148 5202 6721 Box2DWeb 84 121 82 120 13853 zlib - - - - 28970 TypeScript 3006 3339 2940 3242 11813 Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 41 / 43
  • 141. Experimental Evaluation Timings Benchmark Sandbox Transparent Baseline Richards 14 sec 16 sec 9 sec DeltaBlue 263 sec 265 sec 13 sec Crypto 59 sec 58 sec 9 sec RayTrace 865 sec 854 sec 23 sec EarleyBoyer 265 sec 249 sec 75 sec RegExp 14 sec 16 sec 8 sec Splay 32 sec 43 sec 17 sec SplayLatency 32 sec 43 sec 17 sec NavierStokes 59 sec 61 sec 5 sec pdf.js 944 sec 872 sec 9 sec Mandreel 683 sec 683 sec 9 sec MandreelLatency 683 sec 683 sec 9 sec Gameboy Emulator 30 sec 27 sec 7 sec Code loading 14 sec 14 sec 10 sec Box2DWeb 1156 sec 1140 sec 6 sec zlib - - 11 sec TypeScript 86 sec 91 sec 24 sec Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 42 / 43
  • 142. Experimental Evaluation Statistic Benchmark Wrap Cache Effect Miss Hit Richards 164021 3 7 328060 DeltaBlue 7348024 3 7 14696066 Crypto 2329634 3 1046550 3629234 RayTrace 25519224 3 12757207 38281266 EarleyBoyer 5465 3 24 4194942 RegExp 115474 3 65923 230966 Splay 466840 3 232019 1397701 SplayLatency 466840 3 232019 1397701 NavierStokes 1839 3 727 2978 pdf.js 18222921 4 37302 37477198 Mandreel 19954116 3 9974959 29934936 MandreelLatency 19954116 3 9974959 29934936 Gameboy Emulator 467585 4 121250 813987 Code loading 23829 5 4208 45064 Box2DWeb 24876419 3 7800731 115579412 zlib - - - - TypeScript 1114199 3 17 26404297 Matthias Keil, Peter Thiemann On Contracts and Sandboxes August 6, 2015 43 / 43