41
Philipp Burgmer theCodeCampus / w11k GmbH Sicherheit in SPAs mit

theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

Philipp BurgmertheCodeCampus / w11k GmbH

Sicherheit in SPAsmit

Page 2: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

AusgangssituationSicherheitskonzeptGängige Probleme

UrsacheAuswirkungTestGegenmaßnahme

Page 3: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

Philipp BurgmerSoftware-Entwickler, TrainerFokus: Frontend, [email protected]

w11k GmbHSoftware Design, Entwicklung & WartungConsulting, Schulungen & Projekt KickoffWeb-Apps, Mobil-Apps, Rich ClientsAngularJS, TypeScript, Eclipse RCP

ÜBER MICH

3

Page 4: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

HTTPFrontend Backend

Statische Dateien

RohdatenJSON

Web API (REST)Business Layer

DatenbankFramework

HTML + JS + CSSBrowser

Rich Client im BrowserServer liefert statische Dateien für den ClientServer bietet API für Daten (REST, WebSocket) (JSON, XML)Backend weis nichts über verwendete Technologien im ClientClient weis nichts über verwendete Technologien im BackendStateful Client, Stateless Backend

ARCHITEKTUR VON SPAs

4

Page 5: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

Datenbanken (SQL | NoSQL) & Backend-SpracheHTTPJavaScript & HTML

Historisch betrachtenVieles gewachsenNicht für heute Verwendung gedacht

TECHNOLOGIES

5

Page 6: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

Öffentlicher und privater BereichLogin -> SessionBenutzer-RollenGrundgedanke: Jeder sichert sich selbst ab

Client schütz UIServer schütz DatenzugriffeJeder schützt seine verwendeten TechnologienAlle schützen die Übertragung

SICHERHEITSKONZEPTNAIV

6

Page 7: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

Login vor Aufruf der AnwendungLogin innerhalb der Anwendung

Berechtigungen innerhalb der Anwendung

LOGIN

7

Page 8: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

Server stellt sicherAnwendung nur mit gültigem Login aufrufbarOhne gültigen Login: HTTP-Redirect auf Login-SeiteNach erfolgreichem Login: HTTP-Redirect auf Anwendung

In AnwendungHTTP 401: Navigation zu Login-Seite

Weniger Angriffsfläche: Nicht jeder sieht die AnwendungSchnelles Laden der ersten SeiteImmer ganze Anwendung geschützt

LOGINVOR DER ANWENDUNG

8

Page 9: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

Rein Client-seitiges Handling (für UI)Login-Formular als Route / State in AnwendungAjax-Request für LoginPrüfung auf gültigen Login

State-Change + Event-Handler $stateChangeErrorAPI-Requests + HTTP Interceptor

Weniger Request notwendigÖffentliche und geschützte Bereiche möglich

LOGININ DER ANWENDUNG

9

Page 10: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

Berechtigungen über Rollen verwaltenBereiche mit Rollen versehenIm UI per Direktive

BERECHTIGUNGEN VERWALTENIN ANGULARJS

<ul class="menu">1

<li user-role-required="'ADMIN'">2

<a href="#!/admin">Admin</a>3

</li>4

</ul>5

10

Page 11: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

An Route / State per resolve

BERECHTIGUNGEN VERWALTENIN ANGULARJS

angular.module('app').config(function() {1

$stateProvider.state('admin', {2

url: '/admin',3

templateUrl: 'route/admin/admin.html',4

resolve: {5

authorized: /* @ngInject */ function (UserService) {6

return UserService.hasRoles('ADMIN');7

}8

}});});9

11

Page 12: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

1. Injection2. Broken Authentication and Session Management3. Cross-Site Scripting4. Insecure Direct Object References5. Security Misconfiguration6. Sensitive Data Exposure7. Missing Function Level Access Control8. Cross-Site Request Forgery9. Using Components with Known Vulnerabilities

10. Unvalidated Redirects and Forwards

Quelle: OWASP Top10 2013

TOP 10 SICHERHEITSPROBLEME

12

Page 13: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

The Open Web Application Security ProjectNon-Profit OrganisationFinanziert über Mitgliedsbeiträge und SpendenExistiert seit 2001Stellt Informationen zu Sicherheitsthemen bereit

detaillierte Beschreibungen und Erklärungengängige Lösungsansätze

OWASP

13

Page 14: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

Benutzereingaben nie trauenIm Backend nie davon ausgehen, dass Request vom Client kommenVerwendete Komponenten auf Security-Updates prüfenSecurity testen

punkspider.org: Suchmaschine für SicherheitslückenBeEF - The Browser Exploitation Framework: Tool für PenetrationstestsOWASP - Vulnerability Scanning Tools

GENERELLE GEGENMASSNAHMEN

14

Page 15: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

Code-Minimierung / -ObfuscatingVerwendung von HTTPSBerechtigungen im Client prüfenEingaben im Client validieren

UNZUREICHENDE GEGENMASSNAHMEN

15

Page 16: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

CODE INJECTION

Page 17: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

Java Code um SQL Abfrage zusammen zu bauen

URL-Aufruf des Angreifers

Ausgeführtes SQL

BEISPIEL: SQL

statement = "SELECT * FROM users WHERE id = " + request.getParameter("id") + ";"1

http://example.com/user?id=42;UPDATE+USER+SET+TYPE="admin"+WHERE+ID=23;--1

SELECT * FROM users WHERE id = 42; UPDATE USER SET TYPE="admin" WHERE ID=23;--;1

17

Page 18: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

Daten aus Sprache A werden zu Code in Sprache BCode wird dynamisch an einen Interpreter übergebenCode enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...)Benutzereingaben werden nicht oder unzureichend überprüftAn vielen Stellen möglich

SQLHTML (z.B. bei Cross-Site-Scripting)Script-Sprachen mit eval-Funktion (JS, PHP)Dynamisches Laden von Code aus DateienShell / Command Execution

CODE INJECTION

18

Page 19: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

Manuell am CodeVerwendung von Interpretern ausfindig machenEingaben von Interpretern auf dynamische Teile untersuchenDatenfluss zurückverfolgen (Wo kommen dynamische Teile her?)

AutomatisiertCode Analyse Tools um Interpreter zu findenPeneration-Test-Tools finden häufig gemachte Fehler

SCHWACHSTELLEN FINDEN

19

Page 20: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

Möglichst wenig Interpreter verwenden, besser APIsPrepared-StatementsStored-Procedures

Benutzereingaben nicht vertrauenKontextuelles Escapen (HTML, JS, SQL)White-Listing

GEGENMASSNAHMEN

20

Page 21: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

Sicherer Java Code um SQL Abfrage zusammen zu bauen

BEISPIEL: SQL

PreparedStatement pstmt = connection.prepareStatement("SELECT * FROM users WHERE id = ?");1

pstmt.setInt(1, request.getParameter("id"));2

ResultSet rset = pstmt.executeQuery();3

21

Page 22: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

BROKEN AUTHENTICATION AND SESSIONMANAGEMENT

Page 23: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

Zugangsdaten oder Session können entwendet werden

Session kann geklaut werdenz.B. Session-ID in der URL, oft bei URL RewritingKein Session-Timeout (öffentlicher PC)Vorhersagbare Session IDsÜbertragung per unverschlüsselter KommunikationCross-Site-Scripting um Cookie zu entwenden

SESSION MANAGEMENT

23

Page 24: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

Passwörter stehen im Klartext in der DatenbankDatenbank wird entwendetAngreifer kann sich als jeder User einloggen

Session-ID steht in URL

BEISPIELE

http://example.com/shoppingcart?sessionid=2685445411

24

Page 25: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

Login, Logout und Session Managemnt nicht selbst implementierenBewährte, gut getestete Biblotheken verwenden (OAuth?)Verschlüsselte KommunikationKeine Passwörte speichern, Hash mit SaltCross-Site-Scripting verhindern

GEGENMASSNAHMEN

25

Page 26: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

Weniger Zustand im Server -> Bessere SkalierbarkeitGut: Session = Mapping Session ID -> User IDBesser: keine Session im Backend, Session ID enthält allen ZustandIm Backend benötigter Zustand wird bei jedem Request übertragen

HERAUSFORDERUNG

STATELESS BACKEND

26

Page 27: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

Session-ID ist kein Random oder HashSession-ID enthält Zustand

User-IDLogin-TimestampXSRF-Token?Base64 encoded

Session-ID wird gegen Manipulation und Nachahmung geschütztVerschlüsselungSignierungMessage Authentication Code (z.B. HMAC)Nur auf dem Server bekannt

STATEFUL SESSION-ID

27

Page 28: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

XSSCROSS-SITE-SCRIPTING

Page 29: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

Ausprobieren ...

BEISPIELvar source = $('#insecure-input');1

var text = source.val();2

var target = $('#insecure-output');3

target.append(text);4

29

Page 30: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

Spezielle Art der HTML InjectionHTML-Injection wird ausgenutzt um anderen Benutzer Code unterzuschiebenBenutzereingabe wird ohne Prüfung in HTML ausgegebenErmöglicht Ausführen von Code

AngriffeDaten auslesen und an Angreifen übermitteln (z.B. Session-Cookie)Code ruft URL auf um Aktion mit Rechten des Benutzers auszuführen (ähnlich wie XSRF)

CROSS-SITE-SCRIPTING

30

Page 31: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

Benutzereingaben immer escapenDaten vom Server escapenSanitizer Biblothek verwendenKontext beachten in dem Wert verwendet wird

GEGENMASSNAHMEN

31

Page 32: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

Angular escapt alle Data-Bindings automatisch$sanitize Service um sicheres HTML-Subset ausgeben zu können$sce Service um beliebiges HTML aus vertrauenswürdiger Quelle ausgeben zu könnenAusführliches Beispiel

ANGULARJS

32

Page 33: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

ANGULARJSBESPIEL

<input type="text" ng-model="text"/>1

<div ng-bind="text"></div>2

<div ng-bind-html="text"></div>3

33

Page 34: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

ng-bind und {{}} escaped alle HTML Sonderzeichenng-bind-html lässt ein sicheres Subset durch

ngSanitize : zusätzliches Modul mit erweitertem Sanitizer für sicheres SubsetMuss eigebunden werden für ng-bind-html , ansonsten Fehler auf Konsole

ANGULARJSNG-BIND-HTML

34

Page 35: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

$sce Service stellt Methoden zum wrappen bereitJS, URL, HTML

$sce.trustAsHtml wrapt Text in ObjektObjekt markiert Text als sicheren Codeng-bind-html übernimmt ursprünglichen Text als Code in DOM

ANGULARJSSTRICT CONTEXTUAL ESCAPING

35

Page 36: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

XSRFCROSS-SITE-REQUEST-FORGERY

Page 37: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

Ausgangsituation: Benutzer in App eingeloggt (hat gültiges Session-Cookie)

Aufruf von Business Logik ohne zusätzlichen Schutz

XSRF Attacke per Social Engeneering

XSRF Attacke per XSS

BEISPIEL

http://example.com/app/transferFunds?amount=1500&destinationAccount=46732432431

<a href="http://bit.ly/xyz">Link zu einer "vertrauenswürdigen" Seite</a>1

<img src="http://example.com/app/transferFunds?amount=1500&destination=attacker" />1

37

Page 38: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

Angreifer bringt Benutzer dazu URL aufzurufenRequest wird mit Rechten des Benutzers ausgeführtVerschiedene Angriffsformen

Cross-Site-ScriptingSocial-Engeneering / Unterschieben einer URL

Cookies allein sind nicht sicherFür Session-Cookie immer httpOnly und secure verwendenCookie kann nicht abgegriffen werden (per JS)Cookie wird aber immer gesendet (XSRF immer noch möglich)

Zusätzlicher Schutz notwendig

XSRF

38

Page 39: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

ServerSchickt bei Login Session-ID als Cookie mit httpOnly und secureSchickt bei Login zusätzliches Token als Cookie XSRF-Token ohne httpOnly

ClientToken wird zwischengespeichert (JS Variable) und Cookie gelöschtToken wird bei jedem Request als Header mitgesendet

Server validiert bei jedem Request mitgesendetes Token

GEGENMASSNAHMEN

39

Page 40: theCodeCampus / w11k GmbH Philipp Burgmer mit · Code wird dynamisch an einen Interpreter übergeben Code enthält Benutzereingaben (Formular-Daten, URL-Parameter, ...) Benutzereingaben

HTTP-Interceptor KonzeptInterceptor schon mit dabei

Ließt Cookie XSRF-TOKENSendet Header X-XSRF-TOKENNamen konfigurierbar

Problem: Öffne Link in neuem TabLösung: Server sendet Token noch mal bei GET api/login

ANGULARJS

40