Secure Distributed Programming on EcmaScript 5 + HTML5 platforms - - PowerPoint PPT Presentation

secure distributed programming on ecmascript 5 html5
SMART_READER_LITE
LIVE PREVIEW

Secure Distributed Programming on EcmaScript 5 + HTML5 platforms - - PowerPoint PPT Presentation

Secure Distributed Programming on EcmaScript 5 + HTML5 platforms Mark S. Miller and the Cajadores with thanks to Tyler Close How to lose an arms race How to lose an arms race Doomed to never ending tinkering? Doomed to never ending tinkering?


slide-1
SLIDE 1

Secure Distributed Programming

  • n EcmaScript 5 + HTML5 platforms

Mark S. Miller and the Cajadores with thanks to Tyler Close

slide-2
SLIDE 2

How to lose an arms race

slide-3
SLIDE 3

How to lose an arms race

slide-4
SLIDE 4

Doomed to never ending tinkering?

slide-5
SLIDE 5

Doomed to never ending tinkering?

Identity-centric access

HTTP auth info client side certs script, img, fragment holes

Cookies

augments attacker’s authority  confused deputies

Origin: header “fix”

 subtler confused deputies

slide-6
SLIDE 6

Doomed to never ending tinkering?

Identity-centric access

HTTP auth info client side certs script, img, fragment holes

Cookies

augments attacker’s authority  confused deputies

Origin: header “fix”

 subtler confused deputies

Identity-centric vs. Authorization-centric

slide-7
SLIDE 7

Original Web

Server Server Frame Frame Browser

Link/Form GET/POST New Page Link/Form GET/POST New Page

slide-8
SLIDE 8

Ajax = Mobile code + async msgs

Server Server Frame Frame Browser

XHR GET/POST XHR Response XHR GET/POST XHR Response Web services

slide-9
SLIDE 9

Kludging Towards Distributed Objects

Server Server Frame Frame Browser

XHR GET/POST XHR Response, Comet XHR GET/POST XHR Response, Comet Web services JSONP Fragment tricks

slide-10
SLIDE 10

A Web of Distributed Objects

Server Server Frame Frame Browser

XHR GET/POST XHR Response, SSE XHR GET/POST XHR Response, SSE Web services Cross-Origin XHR with UMP postMessage

slide-11
SLIDE 11

A Web of Distributed Objects

Mobile messages, code, objects

slide-12
SLIDE 12

Safe Mobile Messages: Uniform XHR

As in “Uniform Resource Locator”

Designation (ideally) independent of requestor context

Ignore browser’s “helpful” extras

HTTP Auth info, client side certs, cookies, Origin: header, Like IP address: use only for forensics & emergencies

Authorize based only on payload

HTTPS URL or request body – info the requestor knows

Waive response “protection”

Access-Control-Allow-Origin: *

slide-13
SLIDE 13

Safe Mobile Code: OCaps in JavaScript

EcmaScript 3:

One of the hardest oo languages to secure. Caja: Complex server-side translator. Runtime overhead.

EcmaScript 5:

One of the easiest oo languages to secure. <script src=“initSES.js”></script> Simple client-side init and verifier. No runtime overhead. Approx 5K download compressed.

slide-14
SLIDE 14

Security as Extreme Modularity

Modularity: Avoid needless dependencies Security: Avoid needless vulnerabilities Vulnerability is a form of dependency Mod: Principle of info hiding - need to know. Sec: Principle of least authority - need to do.

slide-15
SLIDE 15

Connectivity by…

… Introduction

ref to Carol ref to Bob decides to share

… Parenthood … Endowment … Initial Conditions

Alice says: bob.foo(carol) How might object Bob come to know object Carol?

slide-16
SLIDE 16

OCaps: Small step from pure objects

Memory safety and encapsulation + Effects only by using held references + No powerful references by default

slide-17
SLIDE 17

OCaps: Small step from pure objects

Memory safety and encapsulation + Effects only by using held references + No powerful references by default Reference graph ≡ Access graph Only connectivity begets connectivity Natural Least Authority OO expressiveness for security patterns

slide-18
SLIDE 18

Objects as Closures

function makeCounter() { var count = 0; return { incr: function() { return ++count; }, decr: function() { return –count; } }; }

makeCounter count incr incr decr decr count incr incr decr decr count incr incr decr decr

slide-19
SLIDE 19

Objects as Closures

function makeCounter() { var count = 0; return { incr: function() { return ++count; }, decr: function() { return –count; } }; }

makeCounter count incr incr decr decr count incr incr decr decr count incr incr decr decr

A record of closures hiding state is a fine representation of an

  • bject of methods hiding instance vars
slide-20
SLIDE 20

Objects as Closures in ES5/strict

“use strict”; function makeCounter() { var count = 0; return def({ incr: function() { return ++count; }, decr: function() { return –count; } }); }

makeCounter count incr incr decr decr count incr incr decr decr count incr incr decr decr

A tamper-proof record of lexical closures encapsulating state is a defensive object

slide-21
SLIDE 21

Turning ES5 into SES

<script src=“initSES.js”></script> Monkey patch away bad non-std behaviors Remove non-whitelisted primordials Install leaky WeakMap emulation Make virtual global root Freeze whitelisted global variables

  • Replace eval & Function with safe alternatives
  • Freeze accessible primordials
slide-22
SLIDE 22

No powerful references by default

Alice says: var bobSrc = //site B var carolSrc = //site C var bob = eval(bobSrc); var carol = eval(carolSrc); bob carol Alice Bob Carol

slide-23
SLIDE 23

No powerful references by default

bob carol Alice Bob and Carol are confined. Only Alice controls how they can interact or get more connected. Bob Carol Alice says: var bobSrc = //site B var carolSrc = //site C var bob = eval(bobSrc); var carol = eval(carolSrc);

slide-24
SLIDE 24

No powerful references by default

Alice says: Alice bob carol Bob Carol

slide-25
SLIDE 25

Bob Carol bob carol counter

Only connectivity begets connectivity

Alice says: var counter = makeCounter(); bob(counter.incr); carol(counter.decr); bob = carol = null;

count count count incr incr decr decr

slide-26
SLIDE 26

Bob Carol bob carol counter

Only connectivity begets connectivity

Alice says: var counter = makeCounter(); bob(counter.incr); carol(counter.decr); bob = carol = null;

count count count incr incr decr decr

Bob can only count up and see result. Carol only down. Alice can only do both.

slide-27
SLIDE 27

Revocable Function Forwarder

function makeFnCaretaker(target) { return def({ wrapper: function(…args) { return target(…args); }, revoke: function() { target = null; } }); }

makeCaretaker target wrapper wrapper revoke revoke target wrapper wrapper revoke revoke target wrapper wrapper revoke revoke target wrapper wrapper revoke revoke target wrapper wrapper revoke revoke target wrapper wrapper revoke revoke

slide-28
SLIDE 28

Alice

Unconditional Access

Alice says: bob.foo(carol); Bob Carol

foo

Grants Bob full access to Carol forever

slide-29
SLIDE 29

Alice

Revocability ≡ Temporal attenuation

Alice says: var ct = makeCaretaker(carol); bob.foo(ct.wrapper);

target wrapper wrapper revoke revoke

Bob Carol

foo

slide-30
SLIDE 30

Alice

Revocability ≡ Temporal attenuation

Alice says: var ct = makeCaretaker(carol); bob.foo(ct.wrapper); //…

target wrapper wrapper revoke revoke

Bob Carol

slide-31
SLIDE 31

Alice Alice says: var ct = makeCaretaker(carol); bob.foo(ct.wrapper); //… ct.revoke();

target wrapper wrapper revoke revoke

Bob Carol

Revocability ≡ Temporal attenuation

slide-32
SLIDE 32

Alice Alice says: var ct = makeCaretaker(carol); bob.foo(ct.wrapper); //… ct.revoke();

target wrapper wrapper revoke revoke

Bob Carol

Revocability ≡ Temporal attenuation

slide-33
SLIDE 33

Alice

Attenuators ≡ Access Abstractions

Alice says: var ct = makeCaretaker(carol); bob.foo(ct.wrapper); Bob Carol Express security policy by the behavior of the objects you provide

foo

slide-34
SLIDE 34

Alice

Membranes: Transitive Interposition

function makeFnMembrane(target) { var enabled = true; function wrap(wrapped) { if (wrapped !== Object(wrapped)) { return wrapped; } return function(…args) { if (!enabled) { throw new Error(“revoked”); } return wrap(wrapped(…args.map(wrap)); } } return def({ wrapper: wrap(target), revoke: function() { enabled = false; } }); }

Bob Carol Dave

slide-35
SLIDE 35

Attenuators Compose

function makeROFile(file) { return def({ read: file.read, getLength: file.getLength }); } var rorFile = makeROFile(revocableFile);

slide-36
SLIDE 36

Membrane eval → compartment

var compartment = makeMembrane(eval); var vbob = compartment.wrapper(bobSrc);

Alice Bob

slide-37
SLIDE 37

Membrane eval → compartment

var compartment = makeMembrane(eval); var vbob = compartment.wrapper(bobSrc); //…

Alice Bob

slide-38
SLIDE 38

Membrane eval → compartment

var compartment = makeMembrane(eval); var vbob = compartment.wrapper(bobSrc); //… compartment.revoke();

Alice Bob GC

slide-39
SLIDE 39
  • Dr. SES

Distributed Resilient Secure EcmaScript

Linguistic abstraction for safe messaging

Stretch reference graph between machines Preserve distributed “memory safety”

SES + Promise lib* + optional infix “!” syntax

Current standards missing only syntactic convenience

*ref_send by Tyler Close, qcomm by Kris Kowal,

and caja-captp by Kevin Reid

slide-40
SLIDE 40
  • Dr. SES

Distributed Resilient Secure EcmaScript

Object operation syntax Library call

var result = bob.foo(carol);

Local only call

var resultP = bobP ! foo(carol); Q.post(bobP, ‘foo’, [carol])

slide-41
SLIDE 41
  • Dr. SES

Distributed Resilient Secure EcmaScript

Object operation syntax Library call

var result = bob.foo(carol); var resultP = bobP ! foo(carol); Q.post(bobP, ‘foo’, [carol]) var result = bob.foo; var resultP = bobP ! foo;

Q.get(bobP, ‘foo’)

bob.foo = newFoo; bobP ! foo = newFoo; Q.put(bobP, ‘foo’, newFoo) delete bob.foo; delete bobP ! foo; Q.delete(bobP, ‘foo’)

slide-42
SLIDE 42
  • Dr. SES

Distributed Resilient Secure EcmaScript

Object operation syntax Library call

var result = bob.foo(carol); var resultP = bobP ! foo(carol); Q.post(bobP, ‘foo’, [carol]) var result = bob.foo; var resultP = bobP ! foo;

Q.get(bobP, ‘foo’)

bob.foo = newFoo; bobP ! foo = newFoo; Q.put(bobP, ‘foo’, newFoo) delete bob.foo; delete bobP ! foo; Q.delete(bobP, ‘foo’)

slide-43
SLIDE 43
  • Dr. SES

Distributed Resilient Secure EcmaScript

var resultP = bobP ! foo(carol); Eventual send var resultP = bobP ! foo; Eventual get

slide-44
SLIDE 44
  • Dr. SES

Distributed Resilient Secure EcmaScript

var resultP = bobP ! foo(carol); Eventual send var resultP = bobP ! foo; Eventual get

slide-45
SLIDE 45

Q.defer(); {promise: promise, resolve: resolve} Q.when(resultP, function(result) { …result… }, function (ex) { …ex… }); Register callbacks

  • Dr. SES

Distributed Resilient Secure EcmaScript

var resultP = bobP ! foo(carol); Eventual send var resultP = bobP ! foo; Eventual get

slide-46
SLIDE 46

Infinite Queue

function makeQueue() { var ends = Q.defer(); var front = ends.promise; var rear = ends.resolve; return def({ enqueue: function(elem) { var next = Q.defer(); rear({first: elem, rest: next.promise}); rear = next.resolve; }, dequeue: function() { var result = front ! first; front = front ! rest; return result; } });}

makeQueue target wrapper wrapper revoke revoke front enqueue enqueue dequeue dequeue rear target wrapper wrapper revoke revoke front enqueue enqueue dequeue dequeue rear target wrapper wrapper revoke revoke front enqueue enqueue dequeue dequeue rear

slide-47
SLIDE 47

Infinite Queue

function makeQueue() { var ends = Q.defer(); var front = ends.promise; var rear = ends.resolve; return def({ enqueue: function(elem) { var next = Q.defer(); rear({first: elem, rest: next.promise}); rear = next.resolve; }, dequeue: function() { var result = front ! first; front = front ! rest; return result; } });}

target wrapper wrapper revoke revoke front enqueue enqueue dequeue dequeue rear

slide-48
SLIDE 48

Infinite Queue

function makeQueue() { var ends = Q.defer(); var front = ends.promise; var rear = ends.resolve; return def({ enqueue: function(elem) { var next = Q.defer(); rear({first: elem, rest: next.promise}); rear = next.resolve; }, dequeue: function() { var result = front ! first; front = front ! rest; return result; } });}

target wrapper wrapper revoke revoke front enqueue enqueue dequeue dequeue rear

slide-49
SLIDE 49

Infinite Queue

function makeQueue() { var ends = Q.defer(); var front = ends.promise; var rear = ends.resolve; return def({ enqueue: function(elem) { var next = Q.defer(); rear({first: elem, rest: next.promise}); rear = next.resolve; }, dequeue: function() { var result = front ! first; front = front ! rest; return result; } });}

target wrapper wrapper revoke revoke front enqueue enqueue dequeue dequeue rear

slide-50
SLIDE 50

Infinite Queue

function makeQueue() { var ends = Q.defer(); var front = ends.promise; var rear = ends.resolve; return def({ enqueue: function(elem) { var next = Q.defer(); rear({first: elem, rest: next.promise}); rear = next.resolve; }, dequeue: function() { var result = front ! first; front = front ! rest; return result; } });}

front enqueue enqueue dequeue dequeue rear

slide-51
SLIDE 51

Infinite Queue

function makeQueue() { var ends = Q.defer(); var front = ends.promise; var rear = ends.resolve; return def({ enqueue: function(elem) { var next = Q.defer(); rear({first: elem, rest: next.promise}); rear = next.resolve; }, dequeue: function() { var result = front ! first; front = front ! rest; return result; } });}

target wrapper wrapper revoke revoke front enqueue enqueue dequeue dequeue rear

slide-52
SLIDE 52

Infinite Queue

function makeQueue() { var ends = Q.defer(); var front = ends.promise; var rear = ends.resolve; return def({ enqueue: function(elem) { var next = Q.defer(); rear({first: elem, rest: next.promise}); rear = next.resolve; }, dequeue: function() { var result = front ! first; front = front ! rest; return result; } });}

target wrapper wrapper revoke revoke front enqueue enqueue dequeue dequeue rear

slide-53
SLIDE 53

Infinite Queue

function makeQueue() { var ends = Q.defer(); var front = ends.promise; var rear = ends.resolve; return def({ enqueue: function(elem) { var next = Q.defer(); rear({first: elem, rest: next.promise}); rear = next.resolve; }, dequeue: function() { var result = front ! first; front = front ! rest; return result; } });}

target wrapper wrapper revoke revoke front enqueue enqueue dequeue dequeue rear

slide-54
SLIDE 54

Infinite Queue

function makeQueue() { var ends = Q.defer(); var front = ends.promise; var rear = ends.resolve; return def({ enqueue: function(elem) { var next = Q.defer(); rear({first: elem, rest: next.promise}); rear = next.resolve; }, dequeue: function() { var result = front ! first; front = front ! rest; return result; } });}

target wrapper wrapper revoke revoke front enqueue enqueue dequeue dequeue rear first rest

slide-55
SLIDE 55

A Web of Distributed Objects

slide-56
SLIDE 56

A Web of Distributed Objects

slide-57
SLIDE 57

A Web of Distributed Objects

slide-58
SLIDE 58

Async object ops as JSON/REST ops

Object operations https: JSON/RESTful operations

var resultP = bobP ! foo(carol); POST https://…q=foo {…} var resultP = bobP ! foo;

GET https://…q=foo

Q.when(resultP, function(result) { …result… }, function (ex) { …ex… });

Register for notification using

xhr.onreadystatechange = …

slide-59
SLIDE 59

Distributed Secure Currency

$100 $200

slide-60
SLIDE 60

Distributed Secure Currency

$100 $200

var paymentP = myPurse ! makePurse();

slide-61
SLIDE 61

Distributed Secure Currency

$100 $200

var paymentP = myPurse ! makePurse();

slide-62
SLIDE 62

Distributed Secure Currency

$100 $0 $200

var paymentP = myPurse ! makePurse();

slide-63
SLIDE 63

Distributed Secure Currency

$100 $0 $200

var paymentP = myPurse ! makePurse(); paymentP ! deposit(10, myPurse);

slide-64
SLIDE 64

Distributed Secure Currency

$100 $0 $200

var paymentP = myPurse ! makePurse(); paymentP ! deposit(10, myPurse);

slide-65
SLIDE 65

Distributed Secure Currency

$100 $0 $200

var paymentP = myPurse ! makePurse(); paymentP ! deposit(10, myPurse);

$90 $10

slide-66
SLIDE 66

Distributed Secure Currency

$100 $0 $200

var paymentP = myPurse ! makePurse(); paymentP ! deposit(10, myPurse); var goodP = bobP ! buy(desc, paymentP);

$90 $10

slide-67
SLIDE 67

Distributed Secure Currency

$100 $0 $200

var paymentP = myPurse ! makePurse(); paymentP ! deposit(10, myPurse); var goodP = bobP ! buy(desc, paymentP);

buy

$90 $10

slide-68
SLIDE 68

Distributed Secure Currency

$100 $0 $200

var paymentP = myPurse ! makePurse(); paymentP ! deposit(10, myPurse); var goodP = bobP ! buy(desc, paymentP);

$90 $10

return Q.when(paymentP, function(p) {

slide-69
SLIDE 69

Distributed Secure Currency

$100 $0 $200

var paymentP = myPurse ! makePurse(); paymentP ! deposit(10, myPurse); var goodP = bobP ! buy(desc, paymentP);

$90 $10

return Q.when(paymentP, function(p) { return Q.when(myPurse ! deposit(10, p), function(_) {

slide-70
SLIDE 70

Distributed Secure Currency

$100 $0 $200

var paymentP = myPurse ! makePurse(); paymentP ! deposit(10, myPurse); var goodP = bobP ! buy(desc, paymentP);

$90 $10

deposit

return Q.when(paymentP, function(p) { return Q.when(myPurse ! deposit(10, p), function(_) {

slide-71
SLIDE 71

Distributed Secure Currency

$100 $0 $200

var paymentP = myPurse ! makePurse(); paymentP ! deposit(10, myPurse); var goodP = bobP ! buy(desc, paymentP);

$90 $210

return Q.when(paymentP, function(p) { return Q.when(myPurse ! deposit(10, p), function(_) {

slide-72
SLIDE 72

Distributed Secure Currency

$100 $0 $200

var paymentP = myPurse ! makePurse(); paymentP ! deposit(10, myPurse); var goodP = bobP ! buy(desc, paymentP); return Q.when(paymentP, function(p) { return Q.when(myPurse ! deposit(10, p), function(_) { return good; }, …

$90 $210

slide-73
SLIDE 73

Money as “factorial” of secure coding

function makeMint() { var amp = WeakMap(); return function mint(balance) { var purse = def({ getBalance: function() { return balance; }, makePurse: function() { return mint(0); }, deposit: function(amount, src) { Nat(balance + amount); amp.get(src)(Nat(amount)); balance += amount; } }); function decr(amount) { balance = Nat(balance – amount); } amp.set(purse, decr); return purse; } }

No explicit crypto Alice Bob

buy makeMint mint mint purse decr purse decr purse decr balance amp

slide-74
SLIDE 74

A Web of Distributed Objects

slide-75
SLIDE 75

A Web of Distributed Objects

slide-76
SLIDE 76

Questions?

slide-77
SLIDE 77

Caja Roadmap

Cajita SES5/3 SES/ES5-strict + Valija ES5/3 Sandboxed ES5-strict + ref_send / server-proxy ref_send / UMP + server-server captp captp / web-sockets + “!” sending sugar Subtotal:

  • Dr. SES5/3
  • Dr. SES

+ Sanitize HTML & CSS + Domita / uncajoled JS Domado / SES = Caja Yesterday Caja Tomorrow Caja on ES5,HTML5

slide-78
SLIDE 78

The Mashup problem: Code as Media

<html> <head> <title>Basic Mashup</title> <script> function animate(id) { var element = document.getElementById(id); var textNode = element.childNodes[0]; var text = textNode.data; var reverse = false; element.onclick = function() { reverse = !reverse; }; setInterval(function() { textNode.data = text = reverse ? text.substring(1) + text[0] : text[text.length-1] + text.substring(0, text.length-1); }, 100); } </script> </head> <body onload="animate('target')"> <pre id="target">Hello Programmable World! </pre> </body> </html>

slide-79
SLIDE 79

Running ES5 & SES on old browsers

slide-80
SLIDE 80

Future objects on old browsers

slide-81
SLIDE 81
  • Dr. SES

Distributed Resilient Secure EcmaScript

Shared State Message Passing Blocking C++/pthreads Java, C#, Mozart/Oz JoCAML, Polyphonic C# Blocking receive CSP, Occam, CCS Erlang, Scala, Go Non-blocking Soft Transactional Mem Argus, Fortress, X10 Comm Event Loops Actors, AmbientTalk E, Waterken Ajax

slide-82
SLIDE 82
  • Dr. SES

Distributed Resilient Secure EcmaScript

No conventional deadlocks or memory races

Shared State Message Passing Blocking C++/pthreads Java, C#, Mozart/Oz JoCAML, Polyphonic C# Blocking receive CSP, Occam, CCS Erlang, Scala, Go Non-blocking Soft Transactional Mem Argus, Fortress, X10 Comm Event Loops Actors, AmbientTalk E, Waterken Ajax

slide-83
SLIDE 83
  • Dr. SES

Distributed Resilient Secure EcmaScript

No conventional deadlocks or memory races var result = bob.foo(carol); // do it immediately var resultP = bobP ! foo(carol); // do it eventually

Shared State Message Passing Blocking C++/pthreads Java, C#, Mozart/Oz JoCAML, Polyphonic C# Blocking receive CSP, Occam, CCS Erlang, Scala, Go Non-blocking Soft Transactional Mem Argus, Fortress, X10 Comm Event Loops Actors, AmbientTalk E, Waterken Ajax, Dr. SES