ݺߣ

ݺߣShare a Scribd company logo
Dokazatelná bezpečnost
Jakub Vrána, Google
Vývojáři dělají chyby
● echo $_GET['id'];
● message.innerHTML = searchParams.get('message');
● <a href="{$url |noAutoescape}">
Problematické konstrukce v DOM
● .innerHTML
● document.write()
● eval()
● location.href
● script.src
● window.open
Celkem asi 61
Zakázání problematických konstrukcí
Šablony: pouze nevypnutelný kontextový autoescaping
JavaScript: JS Conformance
Server: zákaz přímého výpisu řetězce
Bezpečné typy
● SafeHtml
● SafeScript
● SafeStyle
● SafeStyleSheet
● SafeUrl
● TrustedResourceUrl
● goog.string.Const
Přiřazování těchto typů je povoleno:
goog.dom.safe.setInnerHtml
Vytváření je povoleno jen bezpečně:
goog.html.SafeHtml.htmlEscape, .create
Vyžaduje schválení bezpečnostním expertem:
goog.html.uncheckedconversions (např. sanitizer)
Při přechodu, vyžaduje také schválení:
goog.html.legacyconversions
Vynucení dokazatelné bezpečnosti
Všechen kód se kompiluje
Pokud používá nebezpečné konstrukce, tak se nezkompiluje
Použití legacy a unchecked conversions je omezeno BUILD viditelností nebo
globálním conformance checkem, přidání nového použití vyžaduje schválení
Přenos dat pomocí protocol buffers
SafeHtmlProto a spol.
Všechna pole veřejná – jak zabránit nebezpečnému přiřazení?
● private_do_not_access_or_else_safe_html_wrapped_value
● Přímé použití tohoto pole přidá bezpečnostního reviewera, který to autorovi
rozmluví
Přechod na dokazatelnou bezpečnost
Vytvoření bezpečného API, např. goog.dom.safe.setInnerHtml
Částečně automatický převod na bezpečné API, buď dokazatelně bezpečně nebo
pomocí legacy conversions
el.innerHTML = 'text' → el.textContent = 'text'
el.innerHTML = s → goog.dom.safe.setInnerHtml(
el, goog.html.legacyconversions.safeHtmlFromString(s))
Zakázání nebezpečného vzoru, např. pomocí JS Conformance
Putování dat programem
Problematické ověřit, jestli data byla vytvořena bezpečně
vytvoření funkce funkce sinkstring string string
vytvoření funkce funkce sinkstring
Mezistav při refaktoringu
string SafeHtml
vytvoření funkce funkce sinkSafeHtml
Ideální stav
SafeHtml SafeHtml
Další oblasti
SQL Injection
CSRF

More Related Content

Jakub Vrána: Dokazatelná bezpečnost

  • 2. Vývojáři dělají chyby ● echo $_GET['id']; ● message.innerHTML = searchParams.get('message'); ● <a href="{$url |noAutoescape}">
  • 3. Problematické konstrukce v DOM ● .innerHTML ● document.write() ● eval() ● location.href ● script.src ● window.open Celkem asi 61
  • 4. Zakázání problematických konstrukcí Šablony: pouze nevypnutelný kontextový autoescaping JavaScript: JS Conformance Server: zákaz přímého výpisu řetězce
  • 5. Bezpečné typy ● SafeHtml ● SafeScript ● SafeStyle ● SafeStyleSheet ● SafeUrl ● TrustedResourceUrl ● goog.string.Const Přiřazování těchto typů je povoleno: goog.dom.safe.setInnerHtml Vytváření je povoleno jen bezpečně: goog.html.SafeHtml.htmlEscape, .create Vyžaduje schválení bezpečnostním expertem: goog.html.uncheckedconversions (např. sanitizer) Při přechodu, vyžaduje také schválení: goog.html.legacyconversions
  • 6. Vynucení dokazatelné bezpečnosti Všechen kód se kompiluje Pokud používá nebezpečné konstrukce, tak se nezkompiluje Použití legacy a unchecked conversions je omezeno BUILD viditelností nebo globálním conformance checkem, přidání nového použití vyžaduje schválení
  • 7. Přenos dat pomocí protocol buffers SafeHtmlProto a spol. Všechna pole veřejná – jak zabránit nebezpečnému přiřazení? ● private_do_not_access_or_else_safe_html_wrapped_value ● Přímé použití tohoto pole přidá bezpečnostního reviewera, který to autorovi rozmluví
  • 8. Přechod na dokazatelnou bezpečnost Vytvoření bezpečného API, např. goog.dom.safe.setInnerHtml Částečně automatický převod na bezpečné API, buď dokazatelně bezpečně nebo pomocí legacy conversions el.innerHTML = 'text' → el.textContent = 'text' el.innerHTML = s → goog.dom.safe.setInnerHtml( el, goog.html.legacyconversions.safeHtmlFromString(s)) Zakázání nebezpečného vzoru, např. pomocí JS Conformance
  • 9. Putování dat programem Problematické ověřit, jestli data byla vytvořena bezpečně vytvoření funkce funkce sinkstring string string vytvoření funkce funkce sinkstring Mezistav při refaktoringu string SafeHtml vytvoření funkce funkce sinkSafeHtml Ideální stav SafeHtml SafeHtml