grails vs xss: defending grails against xss attacks

59
R. Luque & J. San Leandro Grails vs XSS Defending Grails against XSS attacks @rafael_luque - Osoco @rydnr - Ventura24

Upload: theratpack

Post on 13-Jun-2015

1.184 views

Category:

Technology


2 download

DESCRIPTION

Talk at Codemotion Madrid 2013.

TRANSCRIPT

Page 1: Grails vs XSS: Defending Grails against XSS attacks

R. Luque & J. San Leandro

Grails vs XSSDefending Grails against XSS attacks

@rafael_luque - Osoco @rydnr - Ventura24

Page 2: Grails vs XSS: Defending Grails against XSS attacks

http://goo.gl/uVadCh

Page 3: Grails vs XSS: Defending Grails against XSS attacks
Page 4: Grails vs XSS: Defending Grails against XSS attacks

Followingthewhiterabbit. . .

Page 5: Grails vs XSS: Defending Grails against XSS attacks

Something more than ajoke. . .

Page 6: Grails vs XSS: Defending Grails against XSS attacks

Demo 1https://vimeo.com/77387364

Page 7: Grails vs XSS: Defending Grails against XSS attacks
Page 8: Grails vs XSS: Defending Grails against XSS attacks

XSS Intro

Page 9: Grails vs XSS: Defending Grails against XSS attacks

XSS concepts and treatsR. Luque & J. San Leandro

• What’s a XSS• XSS Types: Reflected, stored, DOM-based.• Famous attacks: Samy worm, MrBean defacement, . . .

Page 10: Grails vs XSS: Defending Grails against XSS attacks

XSS threatsR. Luque & J. San Leandro

• Interface defacement• Session hijacking• Your PC may be joined to the horde of zombies in a BotNet.

Page 11: Grails vs XSS: Defending Grails against XSS attacks

Responsibilities: Why isthis still an issue?

Page 12: Grails vs XSS: Defending Grails against XSS attacks

Do your homeworkR. Luque & J. San Leandro

• Security is often overlooked at all levels• Raise awareness• Practice with security tools• Promote defensive coding

Page 13: Grails vs XSS: Defending Grails against XSS attacks

Understanding GrailsEncoding

Page 14: Grails vs XSS: Defending Grails against XSS attacks

Grails Pre-2.3 Gotchas

Page 15: Grails vs XSS: Defending Grails against XSS attacks

#1: Built-in default codec

is none!

Page 16: Grails vs XSS: Defending Grails against XSS attacks

#1: Built-in default codec

is none!

grails.views.default.codec

Page 17: Grails vs XSS: Defending Grails against XSS attacks

#1: Built-in default codecis none!

grails.views.default.codec = ’’none’’

Page 18: Grails vs XSS: Defending Grails against XSS attacks

#1: Built-in default codecis none!

Problems

You have to escape explicitly every untrusteddata:

encodeAsHTML()encodeAsJavaScript()encodeAsURL()

Page 19: Grails vs XSS: Defending Grails against XSS attacks

#1: Built-in default codecis none!

Problems

High likelihood of XSS vulnerabilities inproduction.

E.g. Grails.org website is vulnerable.

Page 20: Grails vs XSS: Defending Grails against XSS attacks

#1: Built-in default codecis none!

Problems

Double-encoding prevention over security bydefault.

Page 21: Grails vs XSS: Defending Grails against XSS attacks

#1: Built-in default codecis none!

Solution

Change default codec to HTML:

grails.views.default.codec = ’’html’’

Page 22: Grails vs XSS: Defending Grails against XSS attacks

#2: Inconsistent behaviour

Apply codec Does not apply codec

• GSP EL: ${...}

• Tag: <g:tag .../>

• GSP EL in tag attribute: <g:tag a="${...}"/>

• Tag as a method: ${g.tag(...)}• Scriptlets: <%= ... %>

Page 23: Grails vs XSS: Defending Grails against XSS attacks

#2: Inconsistent behaviour

Apply codec Does not apply codec

• GSP EL: ${...}• Tag: <g:tag .../>

• GSP EL in tag attribute: <g:tag a="${...}"/>

• Tag as a method: ${g.tag(...)}• Scriptlets: <%= ... %>

Page 24: Grails vs XSS: Defending Grails against XSS attacks

#2: Inconsistent behaviour

Apply codec Does not apply codec

• GSP EL: ${...}• Tag: <g:tag .../>

• GSP EL in tag attribute: <g:tag a="${...}"/>

• Tag as a method: ${g.tag(...)}• Scriptlets: <%= ... %>

Page 25: Grails vs XSS: Defending Grails against XSS attacks

#2: Inconsistent behaviour

Apply codec Does not apply codec

• GSP EL: ${...}• Tag: <g:tag .../>

• GSP EL in tag attribute: <g:tag a="${...}"/>

• Tag as a method: ${g.tag(...)}

• Scriptlets: <%= ... %>

Page 26: Grails vs XSS: Defending Grails against XSS attacks

#2: Inconsistent behaviour

Apply codec Does not apply codec

• GSP EL: ${...}• Tag: <g:tag .../>

• GSP EL in tag attribute: <g:tag a="${...}"/>

• Tag as a method: ${g.tag(...)}• Scriptlets: <%= ... %>

Page 27: Grails vs XSS: Defending Grails against XSS attacks

#2: Inconsistent behaviour

Apply codec Does not apply codec

• GSP EL: ${...}• Tag: <g:tag .../>

• GSP EL in tag attribute: <g:tag a="${...}"/>

• Tag as a method: ${g.tag(...)}• Scriptlets: <%= ... %>

Page 28: Grails vs XSS: Defending Grails against XSS attacks

#3: One codec is notenough

You MUST use the escape syntax for the context of the HTMLdocument you’re putting untrusted data into:

• HTML• JavaScript• URL• CSS

Page 29: Grails vs XSS: Defending Grails against XSS attacks

#3: One codec is notenough

HTML entity encoding doesn’t work if you’re using untrusteddata inside a <script>, or an event handler attribute likeonmouseover, or inside CSS, or in a URL.

Page 30: Grails vs XSS: Defending Grails against XSS attacks

#3: One codec is notenough

Problems

You can override the default codec for a page,but not to switch the codec for each context:

<%@page defaultCodec=’CODEC’ %>

Page 31: Grails vs XSS: Defending Grails against XSS attacks

#3: One codec is notenough

Problems

How to manage GSPs with mixed encodingrequirements?

Page 32: Grails vs XSS: Defending Grails against XSS attacks

#3: One codec is notenough

Solution 1

Turn off default codec for that page and useencodeAsJavaScript() andencodeAsHTML() explicitly everywhere.

Page 33: Grails vs XSS: Defending Grails against XSS attacks

#3: One codec is notenough

Solution 2

Extract the JavaScript fragment to a GSP tagencoding as JavaScript.

Page 34: Grails vs XSS: Defending Grails against XSS attacks

Grails 2.3 EncodingEnhancements

Page 35: Grails vs XSS: Defending Grails against XSS attacks

#1: New configuration moresecure by default

Page 36: Grails vs XSS: Defending Grails against XSS attacks

#1: New configuration moresecurity by default

grails {views {

gsp {encoding = ’UTF-8’htmlcodec = ’xml’ // use xml escaping instead of HTML4codecs {

expression = ’html’ // escapes values inside ${}scriptlet = ’html’ // escapes output from scriptlets in GSPstaglib = ’none’ // escapes output from taglibsstaticparts = ’none’ // escapes output from static templates

}}// escapes all not-encoded output at final stage of outputtingfilteringCodecForContentType {//’text/html’ = ’html’

}}

}

Page 37: Grails vs XSS: Defending Grails against XSS attacks

#2: Finer-grained control ofcodecs

Control the codecs used per plugin:

pluginName.grails.views.gsp.codecs.expression = ’CODEC’

Page 38: Grails vs XSS: Defending Grails against XSS attacks

#2: Finer-grained control ofcodecs

Control the codecs used per page:

<%@ expressionCodec=’CODEC’ %>

Page 39: Grails vs XSS: Defending Grails against XSS attacks

#2: Finer-grained control ofcodecs

Control the default codec used by a tag library:

static defaultEncodeAs = ’HTML’

Or on a per tag basis:

static encodeAsForTags = [tagName: ’HTML’]

Page 40: Grails vs XSS: Defending Grails against XSS attacks

#2: Finer-grained control ofcodecs

Add support for an optional encodeAs attribute to all tagsautomatically:

<my:tag arg=’foo.bar’ encodeAs=’JavaScript’/>

Page 41: Grails vs XSS: Defending Grails against XSS attacks

#3: Context-sensitiveencoding switching

Tag withCodec(’CODEC’, Closure) to switch the currentdefault codec, pushing and popping a default codec stack.

out.println ’<script type=’’text/javascript’’>’withCodec(‘‘JavaScript’’) {

out << body()}out.println()out.println ’</script>’

Page 42: Grails vs XSS: Defending Grails against XSS attacks

Don’t Trust Plugins

Page 43: Grails vs XSS: Defending Grails against XSS attacks

Plugins are part of your appR. Luque & J. San Leandro

• Grails plugins are not security audited• Grails plugins are part of your application’s attack surface• Review plugins to make sure they encode, and if they don’t

you should JIRA the authors immediately, and fork andpatch to fix your app quickly.

Page 44: Grails vs XSS: Defending Grails against XSS attacks

E.g. Javamelody vulnerabilityR. Luque & J. San Leandro

• CVE-2013-4378 vulnerability reported.• Allows blind XSS attack via X-Forwarded-For header

spoofing.• The attack target is the admin’s browser.• Fixed in the last release (1.47).• You should upgrade ASAP.

Page 45: Grails vs XSS: Defending Grails against XSS attacks

Demo: Javamelody XSSedR. Luque & J. San Leandro

Page 46: Grails vs XSS: Defending Grails against XSS attacks

Demo 2https://vimeo.com/77401328

Page 47: Grails vs XSS: Defending Grails against XSS attacks

Solutions: What optionsdo we have?

Page 48: Grails vs XSS: Defending Grails against XSS attacks

Be awareR. Luque & J. San Leandro

• Upgrade to Grails 2.3• Review carefully all dynamic content• Raise awareness• Use application firewalls

Page 49: Grails vs XSS: Defending Grails against XSS attacks

• CSP: Content Security Policy• Adds headers to disable default behavior

• inline Javascript• dynamic code evaluation

Page 50: Grails vs XSS: Defending Grails against XSS attacks

Security in the development lifecycleR. Luque & J. San Leandro

• ZAP Security Tests Plugin for Grails.

Page 51: Grails vs XSS: Defending Grails against XSS attacks

Demo 3https://vimeo.com/77395745

Page 52: Grails vs XSS: Defending Grails against XSS attacks

Conclusions: Grails candefeat XSS

Page 53: Grails vs XSS: Defending Grails against XSS attacks

GrailsR. Luque & J. San Leandro

• Provides the means to make your application safe fromXSS attacks

• Upgrade to 2.3 ASAP• Pay attention to XSS

Page 54: Grails vs XSS: Defending Grails against XSS attacks

XSSR. Luque & J. San Leandro

• It’s much more dangerous than defacement jokes• Your users are the actual target• Difficult to monitor

Page 55: Grails vs XSS: Defending Grails against XSS attacks

Wake upR. Luque & J. San Leandro

• Get yourself used with Metasploit, ZAP, BeEF,mod-security, Burp.

• Spread the word both horizontally and vertically.

Page 56: Grails vs XSS: Defending Grails against XSS attacks

Wake upR. Luque & J. San Leandro

• Get yourself used with Metasploit, ZAP, BeEF,mod-security, Burp.

• Spread the word both horizontally and vertically.

Page 57: Grails vs XSS: Defending Grails against XSS attacks

ReferencesR. Luque & J. San Leandro

• Grails XSS Countermeasures – R. Luque, J. San Leandro• Grails ZAP Security Tests Plugin – The Rat Pack group• ZAP Security Tests Sample App – The Rat Pack group• Can I pwn your Grails application? – Marc Palmer• Grails-9906 – Grails Jira• Grails Default Codecs Proposal – Grails Wiki• Metasploit: The Penetration Tester’s Guide – David Kennedy et al.• The Tangled Web – Michal Zalewski• Metasploit para Pentesters – Pablo Gonzalez• Pentesting con Kali – Pablo Gonzalez

Page 58: Grails vs XSS: Defending Grails against XSS attacks

Picture creditsR. Luque & J. San Leandro

• Game:http://www.themaninblue.com/

• Cover:http://www.flickr.com/photos/usairforce/CC by-nc

• White rabbit:http://www.flickr.com/photos/alles-banane/5849593440CC by-sa-nc

• Hieroglyphs:http://www.flickr.com/photos/59372146@N00CC by-sa-nc

• Zombies:http://www.flickr.com/photos/aeviin/4986897433CC by-sa-nc

Page 59: Grails vs XSS: Defending Grails against XSS attacks

R. Luque & J. San Leandro

Grails vs XSSDefending Grails against XSS attacks

@rafael_luque - Osoco @rydnr - Ventura24