V Google píšeme kód tak, aby se o něm dalo dokázat, že není náchylný k XSS a několika dalším útokům. Přednáška ukazuje, jak navrhujeme bezpečná API, konvertujeme na ně starý kód a vynucujeme, aby nebezpečná API nikdo nemohl použít. Děláme to kombinací pravidel kompilace kódu a nutnosti schválení některých změn bezpečnostním expertem. Většina použitých nástrojů je open-source (Bazel, Closure Templates, Closure Compiler) a dá se použít i mimo Google.
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