SlideShare a Scribd company logo
Trusted Types - W3C TPAC
Krzysztof Kotowicz, Google
koto@google.com
https://github.com/WICG/trusted-types
Slides: https://tinyurl.com/tttpac
DOM XSS
DOM XSS is a growing, prevalent problem
source ⇒ sink
location.hash ⇒ bar.innerHTML
● At Google, DOM XSS is already the most common XSS variant
Reasons:
● Growing complexity of client-side code
● Easy to introduce, hard to prevent & detect
DOM XSS is easy to introduce
● DOM API has ~70 sinks that can result in JavaScript execution
innerHTML, HTMLScriptElement.src, eval()
● These sinks are extremely common in applications
● DOM API “insecure by default”
(input) => document.querySelector(‘log’).innerHTML = input
● Sources far away from sinks, complex data flows (e.g. server roundtrip)
● Static checks don’t work reliably:
foo.innerHTML = bar // what is bar?
foo[(_ => "innerHTML")()] = bar
foo[k] = v
● Manual review is infeasible
● Dynamic (taint-tracking, fuzzing) has a small code coverage
DOM XSS is hard to detect
DOM XSS is hard to mitigate
● HTML Sanitization, CSP - bypasses via script gadgets
<div data-role=popup id='--><script>"use strict"
alert(1)</script>'></div>
<template is=dom-bind><div
c={{alert('1',ownerDocument.defaultView)}}
b={{set('_rootDataHost',ownerDocument.defaultView)}}>
</div></template>
● In-browser XSS filters - DOM XSS out of scope
Addressing DOM XSS @ Google
● Stop tracking a string, leverage the type system
● https://github.com/google/safe-html-types/blob/master/doc/safehtml-typ
es.md
● Wrappers for strings, representing values known to be safe to use in
various HTML contexts and with various DOM APIs:
○ SafeHTML (<b>I’m safe</b>)
○ SafeURL (https://click.me)
○ TrustedResourceURL (https://i.am.a/script.js)
○ …
Safe HTML Types
● Producing the typed value is safe by construction
goog.html.SafeHtml.create(“DIV”, {“benign”: “attributes”}, “text”);
● ... or sanitization (integrate with your sanitizers, templating systems, …)
goog.html.SafeUrl.sanitize(untrustedUrl);
● or gets reviewed manually
goog.html.uncheckedconversions.safeUrlFromStringKnownToSatisfyTypeContract(
“url comes from the server response”, url);
Producing Safe HTML types
Consuming Safe HTML types
● A typed object is propagated throughout the application code
● Taint tracking not necessary
● Wrappers over DOM XSS sinks that accept only typed values
goog.dom.safe.setLocationHref(locationObj, safeURL)
● Compiler prohibits the use of native sinks
let foo = “bar”; location.href = foo
Compile error!
● DOM is secure by default
● Only the code producing a safe type can introduce XSS
● Reduce the security-relevant code by orders of magnitude
○ Stable components (sanitizers, templating libs)
○ Custom application code producing the types
○ Scales extremely well (<1 headcount for all of Google)
● Very successful at preventing XSS
● … as understood by the compiler
Safe HTML Types advantages
Safe HTML Types limitations
● Reliance on compilation
○ Not all code is compiled
○ Different compilation units
○ Cross-language boundaries
● Compiler limitations
○ JS type system is unsound
○ Reflection, dynamic code
○ Missing type information
○ False positive/false negative tradeoff
● No protection at runtime
Trusted Types
Trusted Types
Safe HTML types
built into the platform
Trusted Types
1. API to create string-wrapping objects of a few types:
a. TrustedHTML (.innerHTML)
b. TrustedURL (a.href)
c. TrustedScriptURL (script.src)
d. TrustedScript (el.onclick)
TrustedURL<"//foo">.toString() == "//foo"
2. Opt-in enforcement:
Make DOM XSS sinks accept only the typed objects
Trusted Types
Without enforcement:
● Use types in place of strings with no breakage
● Backwards compatible (use the light polyfill defining the types)
With enforcement:
● DOM XSS attack surface reduction - minimizing the trusted codebase
● Only the code producing the types can introduce DOM XSS
● Design facilitates limiting the “DOM XSS capability” via policies
const myPolicy = TrustedTypes.createPolicy('my-policy', {
createHTML(html) {
return mySanitizer(html)
},
createScriptURL(url) {
const u = new URL(url, document.baseURI)
if (u.origin === window.origin)
return u.href;
throw new TypeError('Invalid URL!')
}
})
Trusted Types - policies
Name
Rules
Sanitize
HTML
Only
same
origin
scripts
Policy
Trusted Types - creating & using types
> document.body.innerHTML = myPolicy.createHTML(location.hash);
Running mySanitizer…
> document.body.innerHTML = location.hash
TypeError: HTMLBodyElement.innerHTML requires TrustedHTML assignment
(dispatch a securitypolicyviolation event?)
(function() {
// Seemingly unsafe policy
const unsafePolicy = TrustedTypes.createPolicy('unsafefoo', {
createHTML: (s) => s,
});
// No XSS because of the usage limitation
return fetch('/get-html')....then(
(response) => unsafePolicy.createHTML(response)
);
})();
Trusted Types - guarding policy usage
● Only the code calling an insecure policy
can cause DOM XSS
● Policy reference similar to a CSP script
nonce
● Rest of codebase is “DOM XSS neutral”
● Enables gradual adoption with
immediate security benefits
● Example blogging application - DOM
XSS can only be caused by a Markdown
renderer.
Module
Unsafe
policy
Secure
policy
Module
Module
Module
Module
Trusted Types - guarding policy usage
Enforcement & guarding policy creation
An X-Bikeshed-Later*
response header with a list of allowed policy names:
Content-Security-Policy: trusted-types foo bar
TrustedTypes.createPolicy('foo', ...) // OK
TrustedTypes.createPolicy('bar', ...) // OK
TrustedTypes.createPolicy('baz', ...) // Policy disallowed
Content-Security-Policy: trusted-types *
*
For now, Content-Security-Policy
● Trusted objects can be created via policies
● A policy defines application-specific rules to create types
● Multiple policies can coexist
○ A strict HTML sanitizer for the comment editing section
○ A custom one for application templating system
● Limit policy creation
○ Response header value
● Limit policy usage
○ Guard the reference
○ Example: HTML sanitizers need a no-op policy to use internally only
Policies
Implementations:
● Chrome - http://crbug/739170, http://w3c-test.org/trusted-types/
google-chrome-unstable --enable-blink-features=TrustedDOMTypes
--enable-experimental-web-platform-features
● Polyfill - https://github.com/WICG/trusted-types
○ https://wicg.github.io/trusted-types/demo/
● Tinyfill - TrustedTypes={createPolicy:(n, rules) => rules}
Trusted Types status
Integration trials
● JS libraries and frameworks: DOM interpolation, templating
○ Angular, Polymer + https://github.com/Polymer/polymer-resin
○ Pug - https://github.com/mikesamuel/pug-plugin-trusted-types
● External examples:
○ Sanitizers: http://koto.github.io/DOMPurify/demos/trusted-types-demo.html
○ Angular app: gothinkster/angular-realworld-example-app - 44 lines ugly patch
○ React app gothinkster/react-redux-realworld-example-app - trivial patch
● Internally - adopting Trusted Types at Google applications
Trusted Types status
● Makes DOM XSS easy to detect & difficult to introduce
○ Based on a solution with proven track record
(most core Google applications use it)
○ Promotes containing security-relevant code
○ Power to the authors (custom rules, multiple policies)
○ Control to the security teams (policy review, header control)
● Backwards-compatible, polyfillable
● Easy to implement in UAs (1Q 2*intern project at Google)
● Extensible: more types, browser-provided policies, userland libraries
Summary

More Related Content

PDF
Trusted Types and the end of DOM XSS
PDF
Trusted Types - Securing the DOM from the bottom up (JSNation Amsterdam)
PDF
Locking the Throne Room - How ES5+ might change views on XSS and Client Side ...
PDF
Scriptless Attacks - Stealing the Pie without touching the Sill
PDF
Securing your Node.js App
PDF
Generic Attack Detection - ph-Neutral 0x7d8
PDF
The innerHTML Apocalypse
PDF
Locking the Throneroom 2.0
Trusted Types and the end of DOM XSS
Trusted Types - Securing the DOM from the bottom up (JSNation Amsterdam)
Locking the Throne Room - How ES5+ might change views on XSS and Client Side ...
Scriptless Attacks - Stealing the Pie without touching the Sill
Securing your Node.js App
Generic Attack Detection - ph-Neutral 0x7d8
The innerHTML Apocalypse
Locking the Throneroom 2.0

What's hot (20)

PDF
In the DOM, no one will hear you scream
PDF
An Abusive Relationship with AngularJS
PDF
ECMAScript 6 from an Attacker's Perspective - Breaking Frameworks, Sandboxes,...
PDF
The Image that called me - Active Content Injection with SVG Files
PDF
The Ultimate IDS Smackdown
PDF
The Future of Web Attacks - CONFidence 2010
PDF
A XSSmas carol
PDF
Dev and Blind - Attacking the weakest Link in IT Security
PDF
talk-ta3m-crypto-tools-workshop
PDF
Introducing Cloakcast
PPTX
PPTX
XML Security
PPTX
SMIMP Lightning Talk - DEFCON CryptoVillage
PPTX
XML Encryption
PDF
Security Vulnerabilities: How to Defend Against Them
PDF
Dot Net Training in Chennai
PDF
Security in PHP Applications: An absolute must!
PDF
REST project brief - typical setup for teams
PPT
Cookie mechanism and attacks on web-client
PPT
Lock Interface in Java
In the DOM, no one will hear you scream
An Abusive Relationship with AngularJS
ECMAScript 6 from an Attacker's Perspective - Breaking Frameworks, Sandboxes,...
The Image that called me - Active Content Injection with SVG Files
The Ultimate IDS Smackdown
The Future of Web Attacks - CONFidence 2010
A XSSmas carol
Dev and Blind - Attacking the weakest Link in IT Security
talk-ta3m-crypto-tools-workshop
Introducing Cloakcast
XML Security
SMIMP Lightning Talk - DEFCON CryptoVillage
XML Encryption
Security Vulnerabilities: How to Defend Against Them
Dot Net Training in Chennai
Security in PHP Applications: An absolute must!
REST project brief - typical setup for teams
Cookie mechanism and attacks on web-client
Lock Interface in Java
Ad

Similar to Trusted Types @ W3C TPAC 2018 (20)

PDF
[OPD 2019] Trusted types and the end of DOM XSS
PPTX
Web security: Securing Untrusted Web Content in Browsers
PDF
Content Security Policy - Lessons learned at Yahoo
PDF
Securing the client side web
PPTX
Lec4-WebClientSideExploitation.pptxdslkjhgfkjdshgfkjfhdkjg
PDF
Tsc summit #2 - HTTP Header Security
PDF
Introduction to Web Application Security - Blackhoodie US 2018
PDF
Sandboxing JS and HTML. A lession Learned
PPTX
Web security: Securing untrusted web content at browsers
PDF
Let's talk Security
PDF
Html5 hacking
PDF
WAF protections and bypass resources
PDF
Going Beyond Cross Domain Boundaries (jQuery Bulgaria)
PDF
The Cross Site Scripting Guide
PDF
BSides Rochester 2018: Chaim Sanders: How the Cookie Crumbles: Modern HTTP St...
PPTX
Dom based xss
PPTX
Story of http headers
PDF
Efficient Context-sensitive Output Escaping for Javascript Template Engines
PDF
Waf.js: How to Protect Web Applications using JavaScript
PDF
Automated JavaScript Deobfuscation - PacSec 2007
[OPD 2019] Trusted types and the end of DOM XSS
Web security: Securing Untrusted Web Content in Browsers
Content Security Policy - Lessons learned at Yahoo
Securing the client side web
Lec4-WebClientSideExploitation.pptxdslkjhgfkjdshgfkjfhdkjg
Tsc summit #2 - HTTP Header Security
Introduction to Web Application Security - Blackhoodie US 2018
Sandboxing JS and HTML. A lession Learned
Web security: Securing untrusted web content at browsers
Let's talk Security
Html5 hacking
WAF protections and bypass resources
Going Beyond Cross Domain Boundaries (jQuery Bulgaria)
The Cross Site Scripting Guide
BSides Rochester 2018: Chaim Sanders: How the Cookie Crumbles: Modern HTTP St...
Dom based xss
Story of http headers
Efficient Context-sensitive Output Escaping for Javascript Template Engines
Waf.js: How to Protect Web Applications using JavaScript
Automated JavaScript Deobfuscation - PacSec 2007
Ad

More from Krzysztof Kotowicz (15)

PDF
Biting into the forbidden fruit. Lessons from trusting Javascript crypto.
PDF
Hacking HTML5 offensive course (Zeronights edition)
PDF
I'm in ur browser, pwning your stuff - Attacking (with) Google Chrome Extensions
PDF
HTML5: Atak i obrona
PDF
I'm in your browser, pwning your stuff
PDF
Advanced Chrome extension exploitation
PDF
Html5: Something wicked this way comes (Hack in Paris)
PDF
Something wicked this way comes - CONFidence
PDF
Html5: something wicked this way comes - HackPra
PDF
Html5: something wicked this way comes
PDF
Creating, obfuscating and analyzing malware JavaScript
PDF
Tworzenie, zaciemnianie i analiza złośliwego kodu JavaScript
PDF
Jak ocalić swoje dane przed SQL injection?
PDF
SQL Injection: complete walkthrough (not only) for PHP developers
PPT
Kompletny przewodnik po SQL injection dla developerów PHP (i nie tylko)
Biting into the forbidden fruit. Lessons from trusting Javascript crypto.
Hacking HTML5 offensive course (Zeronights edition)
I'm in ur browser, pwning your stuff - Attacking (with) Google Chrome Extensions
HTML5: Atak i obrona
I'm in your browser, pwning your stuff
Advanced Chrome extension exploitation
Html5: Something wicked this way comes (Hack in Paris)
Something wicked this way comes - CONFidence
Html5: something wicked this way comes - HackPra
Html5: something wicked this way comes
Creating, obfuscating and analyzing malware JavaScript
Tworzenie, zaciemnianie i analiza złośliwego kodu JavaScript
Jak ocalić swoje dane przed SQL injection?
SQL Injection: complete walkthrough (not only) for PHP developers
Kompletny przewodnik po SQL injection dla developerów PHP (i nie tylko)

Recently uploaded (20)

PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Review of recent advances in non-invasive hemoglobin estimation
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Empathic Computing: Creating Shared Understanding
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PPTX
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PPTX
Spectroscopy.pptx food analysis technology
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
Electronic commerce courselecture one. Pdf
PPT
Teaching material agriculture food technology
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
cuic standard and advanced reporting.pdf
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Mobile App Security Testing_ A Comprehensive Guide.pdf
Review of recent advances in non-invasive hemoglobin estimation
MYSQL Presentation for SQL database connectivity
Empathic Computing: Creating Shared Understanding
Digital-Transformation-Roadmap-for-Companies.pptx
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Spectroscopy.pptx food analysis technology
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Electronic commerce courselecture one. Pdf
Teaching material agriculture food technology
Reach Out and Touch Someone: Haptics and Empathic Computing
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
The AUB Centre for AI in Media Proposal.docx
Encapsulation_ Review paper, used for researhc scholars
cuic standard and advanced reporting.pdf
Per capita expenditure prediction using model stacking based on satellite ima...
“AI and Expert System Decision Support & Business Intelligence Systems”
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...

Trusted Types @ W3C TPAC 2018

  • 1. Trusted Types - W3C TPAC Krzysztof Kotowicz, Google koto@google.com https://github.com/WICG/trusted-types Slides: https://tinyurl.com/tttpac
  • 3. DOM XSS is a growing, prevalent problem source ⇒ sink location.hash ⇒ bar.innerHTML ● At Google, DOM XSS is already the most common XSS variant Reasons: ● Growing complexity of client-side code ● Easy to introduce, hard to prevent & detect
  • 4. DOM XSS is easy to introduce ● DOM API has ~70 sinks that can result in JavaScript execution innerHTML, HTMLScriptElement.src, eval() ● These sinks are extremely common in applications ● DOM API “insecure by default” (input) => document.querySelector(‘log’).innerHTML = input
  • 5. ● Sources far away from sinks, complex data flows (e.g. server roundtrip) ● Static checks don’t work reliably: foo.innerHTML = bar // what is bar? foo[(_ => "innerHTML")()] = bar foo[k] = v ● Manual review is infeasible ● Dynamic (taint-tracking, fuzzing) has a small code coverage DOM XSS is hard to detect
  • 6. DOM XSS is hard to mitigate ● HTML Sanitization, CSP - bypasses via script gadgets <div data-role=popup id='--><script>"use strict" alert(1)</script>'></div> <template is=dom-bind><div c={{alert('1',ownerDocument.defaultView)}} b={{set('_rootDataHost',ownerDocument.defaultView)}}> </div></template> ● In-browser XSS filters - DOM XSS out of scope
  • 8. ● Stop tracking a string, leverage the type system ● https://github.com/google/safe-html-types/blob/master/doc/safehtml-typ es.md ● Wrappers for strings, representing values known to be safe to use in various HTML contexts and with various DOM APIs: ○ SafeHTML (<b>I’m safe</b>) ○ SafeURL (https://click.me) ○ TrustedResourceURL (https://i.am.a/script.js) ○ … Safe HTML Types
  • 9. ● Producing the typed value is safe by construction goog.html.SafeHtml.create(“DIV”, {“benign”: “attributes”}, “text”); ● ... or sanitization (integrate with your sanitizers, templating systems, …) goog.html.SafeUrl.sanitize(untrustedUrl); ● or gets reviewed manually goog.html.uncheckedconversions.safeUrlFromStringKnownToSatisfyTypeContract( “url comes from the server response”, url); Producing Safe HTML types
  • 10. Consuming Safe HTML types ● A typed object is propagated throughout the application code ● Taint tracking not necessary ● Wrappers over DOM XSS sinks that accept only typed values goog.dom.safe.setLocationHref(locationObj, safeURL) ● Compiler prohibits the use of native sinks let foo = “bar”; location.href = foo Compile error!
  • 11. ● DOM is secure by default ● Only the code producing a safe type can introduce XSS ● Reduce the security-relevant code by orders of magnitude ○ Stable components (sanitizers, templating libs) ○ Custom application code producing the types ○ Scales extremely well (<1 headcount for all of Google) ● Very successful at preventing XSS ● … as understood by the compiler Safe HTML Types advantages
  • 12. Safe HTML Types limitations ● Reliance on compilation ○ Not all code is compiled ○ Different compilation units ○ Cross-language boundaries ● Compiler limitations ○ JS type system is unsound ○ Reflection, dynamic code ○ Missing type information ○ False positive/false negative tradeoff ● No protection at runtime
  • 14. Trusted Types Safe HTML types built into the platform
  • 15. Trusted Types 1. API to create string-wrapping objects of a few types: a. TrustedHTML (.innerHTML) b. TrustedURL (a.href) c. TrustedScriptURL (script.src) d. TrustedScript (el.onclick) TrustedURL<"//foo">.toString() == "//foo" 2. Opt-in enforcement: Make DOM XSS sinks accept only the typed objects
  • 16. Trusted Types Without enforcement: ● Use types in place of strings with no breakage ● Backwards compatible (use the light polyfill defining the types) With enforcement: ● DOM XSS attack surface reduction - minimizing the trusted codebase ● Only the code producing the types can introduce DOM XSS ● Design facilitates limiting the “DOM XSS capability” via policies
  • 17. const myPolicy = TrustedTypes.createPolicy('my-policy', { createHTML(html) { return mySanitizer(html) }, createScriptURL(url) { const u = new URL(url, document.baseURI) if (u.origin === window.origin) return u.href; throw new TypeError('Invalid URL!') } }) Trusted Types - policies Name Rules Sanitize HTML Only same origin scripts Policy
  • 18. Trusted Types - creating & using types > document.body.innerHTML = myPolicy.createHTML(location.hash); Running mySanitizer… > document.body.innerHTML = location.hash TypeError: HTMLBodyElement.innerHTML requires TrustedHTML assignment (dispatch a securitypolicyviolation event?)
  • 19. (function() { // Seemingly unsafe policy const unsafePolicy = TrustedTypes.createPolicy('unsafefoo', { createHTML: (s) => s, }); // No XSS because of the usage limitation return fetch('/get-html')....then( (response) => unsafePolicy.createHTML(response) ); })(); Trusted Types - guarding policy usage
  • 20. ● Only the code calling an insecure policy can cause DOM XSS ● Policy reference similar to a CSP script nonce ● Rest of codebase is “DOM XSS neutral” ● Enables gradual adoption with immediate security benefits ● Example blogging application - DOM XSS can only be caused by a Markdown renderer. Module Unsafe policy Secure policy Module Module Module Module Trusted Types - guarding policy usage
  • 21. Enforcement & guarding policy creation An X-Bikeshed-Later* response header with a list of allowed policy names: Content-Security-Policy: trusted-types foo bar TrustedTypes.createPolicy('foo', ...) // OK TrustedTypes.createPolicy('bar', ...) // OK TrustedTypes.createPolicy('baz', ...) // Policy disallowed Content-Security-Policy: trusted-types * * For now, Content-Security-Policy
  • 22. ● Trusted objects can be created via policies ● A policy defines application-specific rules to create types ● Multiple policies can coexist ○ A strict HTML sanitizer for the comment editing section ○ A custom one for application templating system ● Limit policy creation ○ Response header value ● Limit policy usage ○ Guard the reference ○ Example: HTML sanitizers need a no-op policy to use internally only Policies
  • 23. Implementations: ● Chrome - http://crbug/739170, http://w3c-test.org/trusted-types/ google-chrome-unstable --enable-blink-features=TrustedDOMTypes --enable-experimental-web-platform-features ● Polyfill - https://github.com/WICG/trusted-types ○ https://wicg.github.io/trusted-types/demo/ ● Tinyfill - TrustedTypes={createPolicy:(n, rules) => rules} Trusted Types status
  • 24. Integration trials ● JS libraries and frameworks: DOM interpolation, templating ○ Angular, Polymer + https://github.com/Polymer/polymer-resin ○ Pug - https://github.com/mikesamuel/pug-plugin-trusted-types ● External examples: ○ Sanitizers: http://koto.github.io/DOMPurify/demos/trusted-types-demo.html ○ Angular app: gothinkster/angular-realworld-example-app - 44 lines ugly patch ○ React app gothinkster/react-redux-realworld-example-app - trivial patch ● Internally - adopting Trusted Types at Google applications Trusted Types status
  • 25. ● Makes DOM XSS easy to detect & difficult to introduce ○ Based on a solution with proven track record (most core Google applications use it) ○ Promotes containing security-relevant code ○ Power to the authors (custom rules, multiple policies) ○ Control to the security teams (policy review, header control) ● Backwards-compatible, polyfillable ● Easy to implement in UAs (1Q 2*intern project at Google) ● Extensible: more types, browser-provided policies, userland libraries Summary