Enhancing JavaScript Security with ConScript Approach

ConScript
Specifying and Enforcing Fine-Grained Security Policies
for JavaScript in the Browser
Web Programmability Platform
2
 
yelp.com
 
openid.net
 
adsense.com
 
Google maps
Rich Internet Applications are Dynamic
 
      Yelp.com:
          main.js
   
  
… jQuery.js
   
  
… adSense.js
   
  
… GoogleMaps.js
   
  
… OpenID_API.js
 
 
3
 
flexible runtime composition
                                            … but little control.
Towards Safe Programmability for the Web
4
Goals and Contributions
5
 
approach
protect benign users by giving control
to the hosting site
: aspects for security
6
ConScript
Approach
protect benign Web users
give control to the hosting site
How
Browser-supported aspects for security
7
Contributions of ConScript
8
 
 
Policies
9
ConScript
 aspects
implementing aspects in IE8
checking 
ConScript
 policies
generating 
ConScript
 policies
performance
10
eval
 is evil
window.eval =
11
function () {
    throw ‘Disallowed’
};
function
eval
heap
object
eval
eval
foo
bar
No 
postMessage
: A Simple Policy?
 
Wrapping:
 
[[Caja, DoCoMo, AOJS, lightweightjs, Web Sandbox, …]]
 
 
window.postMessage = function () {};
frame1.postMessage(“msg”, “evil.com”)
 
Aspects: 
[[AspectJ]]
 
  void 
around
(String msg, String uri) :
  
call
 
DOM.postMessage
(String m, String u)
{   /* do nothing instead of call */   }
 
   
… no classes in JavaScript / DOM …
12
function () {
  [native code]
}
function () {
  throw ‘exn’;
}
Specifying Calls using References
 
around(window.postMessage,
     function () { throw ‘exn’; });
[Object
window]
[Object
frame]
postMessage
postMessage
13
 
1.
Functions
DOM:  
 
  
 
aroundExt(postMessage, function (pm2, m, uri) { … });
JS: 
  
  
 
aroundNat(eval, function (eval, str) { … });
User-defined:
 
aroundFnc(foo, function (foo2, arg1) { … });
 
2.  Script introduction
<script>: 
 
aroundScr(function (src) { return src + ‘;’ + pol;});
inline:
 
 
aroundInl(function (src) { return src + ‘;’ + pol;});
 
ConScript Interface
14
ConScript
 aspects
implementing aspects in IE8
checking 
ConScript
 policies
generating 
ConScript
 policies
performance
15
function f () { … }
function f () {<before> … <after>}
Problem: Implementation?
 
Source Rewriting 
[[aojs, docomo, caja, sandbox, fbjs]]
 
 
 
 
50%-450% more to transfer, 30-70% slowdown
limited: native (DOM) functions, dynamic code?
big assumptions: adds parser to TCB, …
16
Mediating DOM Functions
17
window.postMessage
frame2.postMessage
JavaScript interpreter
IE8 libraries
(HTML, Networking, …)
postMessage
 
aroundExt(window.postMessage,
off
 
0xff34e5
off
 
);
advice dispatch
 
0xff34e5
function advice1 (foo2) {
    if (ok()) {
        foo2();
    } else throw ‘exn’;  }
function foo () { }
Resuming Calls
18
1.
function (eval, str) {
    if (ok(str)) {
     
        bless();
             return eval(str);
          } else throw ‘exn’;  }
3. function (eval, str) {
    if (ok(str)) return eval(str);
    else {
        curse();
        throw ‘exn’; }}
function advice2 (foo2) {
    if (ok()) {
        bless();
        foo2();
    } else throw ‘exn’;  }
function foo () { }
advice on
advice off
 
bless() 
temporarily disables advice for next call
Optimizing the Critical Path
19
function advice2 (foo2) {
    if (ok()) {
        bless();
        foo2();
    } else throw ‘exn’;  }
function foo () { }
advice on
advice off
advice on
 
 calling advice turns advice off for next call
 
curse()
 
enables advice for next call
ConScript
 aspects
implementing aspects in IE8
checking 
ConScript
 policies
generating 
ConScript
 policies
performance
20
Basic Usage
Yelp.com
: main.js, index.html
   … jQuery.js
   … adSense.js
   … GoogleMaps.js
   … OpenID_API.js
21
script
whitelist
no eval
no innerHTML
no hidden frames
only HTTP cookies
no inline scripts
 
<script src=“main.js” policy=“noEval()”/>
SURGEON GENERAL’S WARNING
Policies are written in a small JavaScript subset.
Applications only lose a few dangerous features.
Policy Integrity
 
Objects defined with policy constructors do not flow out
 
 
 
 
 
 
 
 
 
Old Policy
around(postMessage, function (m, url) {
  w = {“msn.com”: true};
 
22
Policy Integrity
Objects defined with policy constructors do not flow out
Old Policy
around(postMessage, function (m, url) {
  
w 
= 
{“msn.com”: 
true
}
;
policy object:  must protect
unknown: do not pass privileged objects!
23
Policy Integrity
Objects defined with policy constructors do not flow out
Old Policy
around(postMessage, function (m, url) {
  
w 
= 
{“msn.com”: 
true
}
;
User Exploit
postMessage(“”, “msn.com”);
w
[“evil.com”] = 1;
postMessage(“”, “evil.com”);
24
Policy Integrity
Objects defined with policy constructors do not flow out
New Policy
around(postMessage, function (m, url) {
  window.w = {“msn.com”: true};
User Exploit
postMessage(“”, “msn.com”);
w[“evil.com”] = 1;
postMessage(“”, “evil.com”);
var w
25
Policy Integrity
Objects defined with policy constructors do not flow out
New Policy
around
(
postMessage
, 
function 
(
m
, 
url
) {
  window.w = 
{“msn.com”: 
true
}
;
policy object:  must protect
unknown: do not pass privileged objects!
var 
w
26
Maintaining Integrity
 
1.
Policy objects do not leak out of policies
2.
Access path integrity of calls 
(no prototype hijacking)
ML-style type inference
 b
asic
 p
rogram unmodified
 only manually tested on policies
JavaScript interpreter support
call(ctx, fnc, arg1, …), hasOwnProperty(obj, “fld”)
caller
 
 
27
Transparency
 
If running with policies throws no errors
… for same input, running without should be safe
empty advice should not be functionally detectable
Difficult with wrapping or rewriting
Function.prototype.apply, exn.stacktrace, myFunction.callee,
arguments.caller, myFunction.toString, Function.prototype.call
correctness vs. compatibility vs. performance …
Simpler at interpreter level
rest up to developer
no proof
28
ConScript
 aspects
implementing aspects in IE8
checking 
ConScript
 policies
generating 
ConScript
 policies
performance
29
Automatically Generating Policies
Intrusion detection
can we infer and disable unneeded DOM functions?
C# access modifiers
can we enforce access modifiers like 
private
?
ASP policies
can we guarantee no scripts get run in <% echo %>?
30
Intrusion Detection 1: Learn Blacklist
31
eval
new Function(“string”)
postMessage
XDomainRequest
xmlHttpRequest
Intrusion Detection 2: Enforce Blacklist
32
Enforcing C# Access Modifiers
33
ConScript
 aspects
implementing aspects in IE8
checking 
ConScript
 policies
generating 
ConScript
 policies
performance
34
Performance
Microbenchmarks: 1.2x (vs. 3.4x)
Initialization time: 0-1%
Runtime: 0-7%  (vs. 30+%)
File size blowup: < 1% (vs. 50+%)
35
Microbenchmark: Mediation Overhead
36
function advice2 (foo2) {
  bless();
  foo2();
}
function advice3 (foo2) {
foo2();
}
var raw = obj.f;
obj.f = function () { raw();}
3.42x
1.44x
1.24x
File Size Increase (IDS)
37
38
 
Access
Modifier
Enforcement
Intrusion
Detection
System
Runtime Overhead
Goals and Contributions
39
Questions?
40
END.
 
41
Conclusion
Security mechanisms should be deep & in browser
around
aroundScr, aroundInl
optimized 
around
Expressing policies is hard
16 handwritten policies [[TODO average size]]
designed static analysis
blacklist generator prototype
private function policy generator
Policy enforcement must be cheap
file size increase: < 1%  (vs.  50-104%)
initialization: could not detect!
runtime: could not detect!
42
Integrity 2/2: No Hijacked Calls
objects defined with policy constructors do not flow out
 
Old Policy
around(window.eval,
  function (oldEval, str) {
    var hash = str.reverse(); …
User Exploit
String.prototype.reverse =
  function () { return “forged”; };
eval(“alert()”);
43
Integrity 2/2: No Hijacked Calls
objects defined with policy constructors do not flow out
Old Policy
around
(
window.eval
,
  function (oldEval, 
str
) {
    var hash = 
str.reverse
(); …
policy object: privileged, callable object
environment object: untrusted, unhijacked (
directly callable
)
unknown: untrusted, uncallable object
44
Integrity 2/2: No Hijacked Calls
objects defined with policy constructors do not flow out
New Policy
around(window.eval,
  function (oldEval, str) {
    var hash = str.reverse(); …
User Exploit
String.prototype.reverse =
  function () { return “forged”; };
eval(“alert()”);
var r = “”.reverse;
call(str, r)
45
Integrity 2/2: No Hijacked Calls
objects defined with policy constructors do not flow out
New Policy
around
(
window.eval
,
  
function 
(
oldEval
, 
str
) {
    var 
hash 
= 
str.reverse
(); …
policy object: privileged, callable object
environment object: untrusted, unhijacked (
directly callable)
unknown: untrusted, uncallable object
var 
r
 = 
“”.reverse;
call
(
str
,
 
r
)
46
Slide Note
Embed
Share

Explore how ConScript enables specifying and enforcing fine-grained security policies for JavaScript in the browser. Learn about the approach to protect benign users by giving control to the hosting site, the contributions of ConScript, and its impact on browser security and policy correctness.

  • JavaScript Security
  • ConScript Approach
  • Browser Security
  • Web Programmability

Uploaded on Oct 04, 2024 | 0 Views


Download Presentation

Please find below an Image/Link to download the presentation.

The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author. Download presentation by click this link. If you encounter any issues during the download, it is possible that the publisher has removed the file from their server.

E N D

Presentation Transcript


  1. ConScript Specifying and Enforcing Fine-Grained Security Policies for JavaScript in the Browser Leo Meyerovich UC Berkeley Benjamin Livshits Microsoft Research

  2. Web Programmability Platform openid.net yelp.com adsense.com Google maps 2

  3. Rich Internet Applications are Dynamic Yelp.com: main.js jQuery.js adSense.js GoogleMaps.js OpenID_API.js flexible runtime composition but little control. 3

  4. Towards Safe Programmability for the Web Can t trust other people s code Mash-ups 4

  5. Goals and Contributions control loading and use of scripts protect benign users by giving control to hosting site ConScript approach: aspects for security 17 hand-written policies correct policies are hard to write proposed type system to catch common attacks implemented 2 policy generators express many policies safely built into IE 8 JavaScript interpreter runtime and space overheads under 1% (vs. 30-550%) smaller trusted computing base (TCB) browser support 5

  6. approach protect benign users by giving control to the hosting site : aspects for security 6

  7. ConScript Approach protect benign Web users give control to the hosting site How Browser-supported aspects for security 7

  8. Contributions of ConScript A case for aspects in browser protect benign users by giving control to hosting site ConScript approach: aspects for security built into IE 8 JavaScript interpreter Correctness checking Policies are easy to get wrong Type system to ensure policy correctness 17 hand-written policies Comprehensive catalog of policies from literature and practice implemented 2 policy generators Expressiveness Tested on real apps: Google Maps, Live Desktop, etc. runtime and space overheads under 1% (vs. 30-550%) smaller trusted computing base (TCB) Evaluation 8

  9. manifest of script URLs enforce public vs. private HTTP-only cookies resource blacklists no pop-ups Policies no URL redirection limit eval no foreign links <noscript> no hidden frames script whitelist 9

  10. CONSCRIPT aspects implementing aspects in IE8 checking CONSCRIPT policies generating CONSCRIPT policies performance 10

  11. eval is evil function () { throw Disallowed }; window.eval = heap stack document window x y z div eval heap object bar function foo eval eval 11

  12. No postMessage: A Simple Policy? Wrapping:[[Caja, DoCoMo, AOJS, lightweightjs, Web Sandbox, ]] window.postMessage = function () {}; frame1.postMessage( msg , evil.com ) Aspects: [[AspectJ]] void around(String msg, String uri) : callDOM.postMessage(String m, String u) { /* do nothing instead of call */ } no classes in JavaScript / DOM 12

  13. Specifying Calls using References [Object window] postMessage function () { [native code] } } function () { throw exn ; [Object frame] postMessage around(window.postMessage, function () { throw exn ; }); 13

  14. ConScript Interface 1. Functions DOM: JS: User-defined: aroundExt(postMessage, function (pm2, m, uri) { }); aroundNat(eval, function (eval, str) { }); aroundFnc(foo, function (foo2, arg1) { }); 2. Script introduction <script>: aroundScr(function (src) { return src + ; + pol;}); inline: aroundInl(function (src) { return src + ; + pol;}); 14

  15. CONSCRIPT aspects implementing aspects in IE8 checking CONSCRIPT policies generating CONSCRIPT policies performance 15

  16. Problem: Implementation? Source Rewriting [[aojs, docomo, caja, sandbox, fbjs]] function f () { } function f () {<before> <after>} 50%-450% more to transfer, 30-70% slowdown limited: native (DOM) functions, dynamic code? big assumptions: adds parser to TCB, 16

  17. Mediating DOM Functions window.postMessage IE8 libraries (HTML, Networking, ) JavaScript interpreter postMessage advice dispatch 0xff34e5 arguments: hello , evil.com 0xff34e5 call advice off 0xff34e5 aroundExt(window.postMessage, ); [not found] off frame2.postMessage 17

  18. Resuming Calls function foo () { } function foo () { } advice on advice off function advice1 (foo2) { if (ok()) { foo2(); } else throw exn ; } function advice2 (foo2) { if (ok()) { bless(); foo2(); } else throw exn ; } bless() temporarily disables advice for next call 18

  19. Optimizing the Critical Path function foo () { } function foo () { } advice off advice on advice on function advice3 (foo2) { if (ok()) foo2(); else { curse(); throw exn ; } } function advice2 (foo2) { if (ok()) { bless(); foo2(); } else throw exn ; } calling advice turns advice off for next call curse() enables advice for next call 19

  20. CONSCRIPT aspects implementing aspects in IE8 checking CONSCRIPT policies generating CONSCRIPT policies performance 20

  21. Basic Usage script whitelist Yelp.com: main.js, index.html jQuery.js adSense.js GoogleMaps.js OpenID_API.js no eval SURGEON GENERAL S WARNING no innerHTML no hidden frames Policies are written in a small JavaScript subset. no inline scripts Applications only lose a few dangerous features. only HTTP cookies <script src= main.js policy= noEval() /> 21

  22. Policy Integrity Objects defined with policy constructors do not flow out Old Policy around(postMessage, function (m, url) { w = { msn.com : true}; 22

  23. Policy Integrity Objects defined with policy constructors do not flow out Old Policy around(postMessage, function (m, url) { w = { msn.com : true}; policy object: must protect unknown: do not pass privileged objects! 23

  24. Policy Integrity Objects defined with policy constructors do not flow out Old Policy around(postMessage, function (m, url) { w = { msn.com : true}; User Exploit postMessage( , msn.com ); w[ evil.com ] = 1; postMessage( , evil.com ); 24

  25. Policy Integrity Objects defined with policy constructors do not flow out New Policy around(postMessage, function (m, url) { window.w = { msn.com : true}; var w User Exploit postMessage( , msn.com ); w[ evil.com ] = 1; postMessage( , evil.com ); 25

  26. Policy Integrity Objects defined with policy constructors do not flow out New Policy around(postMessage, function (m, url) { window.w = { msn.com : true}; var w policy object: must protect unknown: do not pass privileged objects! 26

  27. Maintaining Integrity 1. Policy objects do not leak out of policies 2. Access path integrity of calls (no prototype hijacking) ML-style type inference basic program unmodified only manually tested on policies JavaScript interpreter support call(ctx, fnc, arg1, ), hasOwnProperty(obj, fld ) caller 27

  28. Transparency If running with policies throws no errors for same input, running without should be safe empty advice should not be functionally detectable Difficult with wrapping or rewriting Function.prototype.apply, exn.stacktrace, myFunction.callee, arguments.caller, myFunction.toString, Function.prototype.call correctness vs. compatibility vs. performance Simpler at interpreter level rest up to developer no proof 28

  29. CONSCRIPT aspects implementing aspects in IE8 checking CONSCRIPT policies generating CONSCRIPT policies performance 29

  30. Automatically Generating Policies Intrusion detection can we infer and disable unneeded DOM functions? C# access modifiers can we enforce access modifiers like private? ASP policies can we guarantee no scripts get run in <% echo %>? 30

  31. Intrusion Detection 1: Learn Blacklist log eval new Function( string ) postMessage XDomainRequest xmlHttpRequest audit 31

  32. Intrusion Detection 2: Enforce Blacklist 32

  33. Enforcing C# Access Modifiers function File () { } File.construct = File.open = class File { public File () { } private open () { } Script# compiler C# JavaScript around(File, pubEntryPoint); around(File.construct, pubEntryPoint); around(File.open, privCall); ConScript 33

  34. CONSCRIPT aspects implementing aspects in IE8 checking CONSCRIPT policies generating CONSCRIPT policies performance 34

  35. Performance Microbenchmarks: 1.2x (vs. 3.4x) Initialization time: 0-1% Runtime: 0-7% (vs. 30+%) File size blowup: < 1% (vs. 50+%) 35

  36. Microbenchmark: Mediation Overhead wrap bless autobless 3.42x var raw = obj.f; obj.f = function () { raw();} 4 3.5 3 2.5 1.44x function advice2 (foo2) { bless(); foo2(); } 2 1.5 1 0.5 0 function advice3 (foo2) { foo2(); } 1.24x 36

  37. File Size Increase (IDS) MSN GMail Google Maps 10.4 11.0 10.0 9.0 8.0 7.0 6.0 4.8 4.4 5.0 3.9 4.0 3.0 1.7 1.5 1.5 1.5 2.0 1.2 1.0 1.0 1.0 1.0 0.0 ConScript Docomo Caja Sandbox 37

  38. Runtime Overhead DoCoMo (JavaScript rewriting) ConScript 80% 73% Runtime overhead 63% 60% Intrusion Detection System 40% 30% 20% 7% 1% 0% Google Maps (183ms) MSN (439ms) GMail (736ms) Uninstrumented Secured Private Methods 400 Runtime (ms) 300 Access Modifier Enforcement 200 297.45 291.05 100 156.9 155.5 0 Application Loading Opening a Folder 38

  39. Goals and Contributions control loading and use of scripts protect benign users by giving control to hosting site ConScript approach: aspects for security 16 hand-written policies correct policies are hard to write proposed type system to catch common attacks implemented 2 policy generators express many policies safely built into IE 8 JavaScript interpreter runtime and space overheads under 1% (vs. 30-550%) smaller trusted computing base (TCB) browser support 39

  40. Questions? manifest of URLs enforce public vs. private limit eval no pop-ups no foreign links HTTP-only cookies resource blacklists no URL redirection no hidden frames <noscript> script whitelist Uninstrumented Secured Private Methods MSN GMail Google Maps Runtime (ms) 10.4 400 11.0 wrap bless autobless 300 200 10.0 291.05 297.45 155.5 156.9 4 100 9.0 0 3.5 8.0 Application Loading Opening a Folder 7.0 3 4.8 6.0 4.4 2.5 100% 73% 3.9 ConScript DoCoMo (JavaScript rewriting) 5.0 63% Runtime overhead 2 4.0 30% 3.0 1.7 1.5 1.5 1.5 1.5 1.2 1.0 1.0 1.0 7% 2.0 1% 1 1.0 40 0% 0.5 0.0 Google Maps (183ms) MSN (439ms) GMail (736ms) 0 ConScript Docomo Caja Sandbox

  41. END. 41

More Related Content

giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#