secure coding for java - an introduction

156
Secure Coding for Java (an introduc3on) Java User Group PoitouCharentes (Niort) 27 Juin 2013 Sébas3en Gioria [email protected] Chapter Leader OWASP France Friday, June 28, 13

Upload: sebastien-gioria

Post on 08-May-2015

456 views

Category:

Technology


4 download

DESCRIPTION

Ce talk est une introduction au Secure Coding pour Java. Il s'efforcera de présenter via différents exemples les bonnes pratiques permettant de développer de manière pragmatique une application java sécurisée. Nous aborderons aussi bien des pratiques fonctionnelles que des morceaux de codes java à erreurs et leur correctifs.

TRANSCRIPT

Page 1: Secure Coding for Java - An Introduction

Secure  Coding  for  Java  (an  introduc3on)Java  User  Group  Poitou-­‐Charentes  (Niort)

27  Juin  2013

Sébas3en  [email protected]  Leader  OWASP  France

Friday, June 28, 13

Page 2: Secure Coding for Java - An Introduction

http://www.google.fr/#q=sebastien gioria

‣OWASP France Leader & Founder & Evangelist

‣Innovation & Technology @ Advens

Twitter :@SPoint / @OWASP_France

2

‣Application Security group leader for the CLUSIF

‣Proud father of youngs kids trying to hack my digital life.

Ne  vous  inquietez  pas  c’est  le  seul  slide  en  anglais,  par  contre  il  y  aura  des  trucs  d’écrits  partout  en  bas...

Friday, June 28, 13

Page 3: Secure Coding for Java - An Introduction

ForeWords

• This  is  a  presenta,on  made  from  my  own  experience  with  some  company  using  OWASP  materials.

• Only  the  documents  from  OWASP  wiki  are  OWASP  officials  (see  hEps://www.owasp.org)

• Some  extracts  come  from  document  I  wrote  as  OWASP  leader,  this  is  why  you  could  find  it  elsewhere.

5

Friday, June 28, 13

Page 4: Secure Coding for Java - An Introduction

• Applica,on  Security  :–where  we  are  (no  bullshit)–where  we  are  (hopefully)  going  ?

• Using  OWASP  materials  to  secure  code• Secure  Coding  principles

Agenda

Friday, June 28, 13

Page 5: Secure Coding for Java - An Introduction

Introduc3on

5

Friday, June 28, 13

Page 6: Secure Coding for Java - An Introduction

Why  Applica0on  Security  ?

64

Friday, June 28, 13

Page 7: Secure Coding for Java - An Introduction

Why  Applica0on  Security  ?

64

Your Application

been Hacked

Friday, June 28, 13

Page 8: Secure Coding for Java - An Introduction

Why  Applica0on  Security  ?

64

Your Application

been Hacked YES

Friday, June 28, 13

Page 9: Secure Coding for Java - An Introduction

Why  Applica0on  Security  ?

64

Your Application

been Hacked

NO

YES

Friday, June 28, 13

Page 10: Secure Coding for Java - An Introduction

Why  Applica0on  Security  ?

64

Your Application

will be Hacked ;)

Your Application

been Hacked

NO

YES

Friday, June 28, 13

Page 11: Secure Coding for Java - An Introduction

Why  Applica0on  Security  ?

64

Your Application

will be Hacked ;)

Your Application

been Hacked

YES

NO

YES

Friday, June 28, 13

Page 12: Secure Coding for Java - An Introduction

Why  Applica0on  Security  ?

64

Your Application

will be Hacked ;)

Your Application

been Hacked

YES

NO

NO

YES

Friday, June 28, 13

Page 13: Secure Coding for Java - An Introduction

Why  Applica0on  Security  ?

6

Let Me take you on the right way 4

Your Application

will be Hacked ;)

Your Application

been Hacked

YES

NO

NO

YES

Friday, June 28, 13

Page 14: Secure Coding for Java - An Introduction

Why  Applica0on  Security  ?

6

My Application will be hacked !

Let Me take you on the right way 4

Your Application

will be Hacked ;)

Your Application

been Hacked

YES

NO

NO

YES

Friday, June 28, 13

Page 15: Secure Coding for Java - An Introduction

Why  Applica0on  Security  ?

6

My Application will be hacked !

Let Me take you on the right way 4

Your Application

will be Hacked ;)

Your Application

been Hacked

YES

NO

NO

YES

NextStep

Friday, June 28, 13

Page 16: Secure Coding for Java - An Introduction

We  are  living  in  a  Digital  environment,  in  a  Connected  World

vMost  of  websites  vulnerable  to  aTacks

vImportant   %   of  web-­‐based   Business   (Services,   Online   Store,   Self-­‐care,   Telcos,  SCADA,  ...)

Why  Applica0on  Security  ?  

Age  of  An0virus Age  of  Network  Security

Age  of  Applica0on  Security

7

Friday, June 28, 13

Page 17: Secure Coding for Java - An Introduction

Consequences  of  bad  or  no  security

–IdenPty  theQ–Hardware  theQ–IT  downPme  –Bad  Media  coverage–Financials  loss–Customers  loss–Legals/business  penalty  

8

Friday, June 28, 13

Page 18: Secure Coding for Java - An Introduction

What  Verizon  (PCI-­‐DSS  company)  said  ?

©  Verizon  2012

9

Friday, June 28, 13

Page 19: Secure Coding for Java - An Introduction

What  Verizon  (PCI-­‐DSS  company)  said  ?

©  Verizon  2012

9

Friday, June 28, 13

Page 20: Secure Coding for Java - An Introduction

What  Verizon  (PCI-­‐DSS  company)  said  ?

©  Verizon  2012

9

Friday, June 28, 13

Page 21: Secure Coding for Java - An Introduction

What  Verizon  (PCI-­‐DSS  company)  said  ?

©  Verizon  2012

9

Friday, June 28, 13

Page 22: Secure Coding for Java - An Introduction

What  Verizon  (PCI-­‐DSS  company)  said  ?

©  Verizon  2012

9

Friday, June 28, 13

Page 23: Secure Coding for Java - An Introduction

What  Verizon  (PCI-­‐DSS  company)  said  ?

©  Verizon  2012

9

Friday, June 28, 13

Page 24: Secure Coding for Java - An Introduction

What  Verizon  (PCI-­‐DSS  company)  said  ?

©  Verizon  2012

9

Friday, June 28, 13

Page 25: Secure Coding for Java - An Introduction

©  Verizon  2012

Verizon  Study

10

Friday, June 28, 13

Page 26: Secure Coding for Java - An Introduction

©  Verizon  2012

Verizon  Study

10

Friday, June 28, 13

Page 27: Secure Coding for Java - An Introduction

©  Verizon  2012

Verizon  Study

10

Friday, June 28, 13

Page 28: Secure Coding for Java - An Introduction

©  Verizon  2012

Verizon  Study

10

Friday, June 28, 13

Page 29: Secure Coding for Java - An Introduction

©  Verizon  2012

Verizon  Study

10

Friday, June 28, 13

Page 30: Secure Coding for Java - An Introduction

©  Verizon  2012

Verizon  Study

10

Friday, June 28, 13

Page 31: Secure Coding for Java - An Introduction

Verizon  study  

11©  Verizon  2012

Friday, June 28, 13

Page 32: Secure Coding for Java - An Introduction

Verizon  study  

11©  Verizon  2012

Friday, June 28, 13

Page 33: Secure Coding for Java - An Introduction

12(c)  WhiteHatSecurity  2013

Friday, June 28, 13

Page 34: Secure Coding for Java - An Introduction

12(c)  WhiteHatSecurity  2013

Friday, June 28, 13

Page 35: Secure Coding for Java - An Introduction

12(c)  WhiteHatSecurity  2013

Friday, June 28, 13

Page 36: Secure Coding for Java - An Introduction

12(c)  WhiteHatSecurity  2013

Friday, June 28, 13

Page 37: Secure Coding for Java - An Introduction

What  you  CIO  Said  :  I  got  a  Firewall  !  

27

Friday, June 28, 13

Page 38: Secure Coding for Java - An Introduction

What  your  business  user  said  :  I  have  SSL  based  Web  Site

28

Friday, June 28, 13

Page 39: Secure Coding for Java - An Introduction

What  your  business  user  said  :  only  the  hacker  can  aMack  my  website

• Tools  are  more  and  more  simples.

• Try  a  simple  request  on  google  website  on  SQL  InjecPon  and  look  at  it.

• An  aEack  on  a  Web  Server  cost  100$/200$  per  day  on  the  underground  market.

29

Friday, June 28, 13

Page 40: Secure Coding for Java - An Introduction

What  your  user  said  :  a  vulnerability  on  internal  ApplicaPon  is  not  criPcal.

• No,  The  web  is  anywhere,  and  CSRF,  HTML5  CORS  and  more  can  make  this  complete  destrucPve

• Be  aware  and  share  this  :  • AJAX  doing  a  lot  of  things  without  you

• Be  aware  and  share  this  :  •  HTML5  will  come  with  “nice”  user  funcPonality  ,  but  with  big  impact  on  security  (WebSocket,  CORS,  ...)

30

Friday, June 28, 13

Page 41: Secure Coding for Java - An Introduction

But  I  do  Security  tesPng  !  

17

Security  Tes3ng

Coding

Friday, June 28, 13

Page 42: Secure Coding for Java - An Introduction

Majors OWASP publications you can use

All are on the wiki https://www.owasp.orgAll are under GPL or friendly licensesMajors publications you can use to secure

your projects/SDLC

Building Guide

Code Review Guide Testing Guide

Application Security Desk Reference (ASDR)

Top10 reference this 3 guides

Ø OWASP Top10Ø Auditor/Testing GuideØ Code Review GuideØ Building GuideØ Application Security Verification

Standard (ASVS)Ø Secure Coding Practices

12

Friday, June 28, 13

Page 43: Secure Coding for Java - An Introduction

Friday, June 28, 13

Page 44: Secure Coding for Java - An Introduction

Learn

Friday, June 28, 13

Page 45: Secure Coding for Java - An Introduction

Learn

Friday, June 28, 13

Page 46: Secure Coding for Java - An Introduction

Learn Contract

Friday, June 28, 13

Page 47: Secure Coding for Java - An Introduction

Learn Contract

Friday, June 28, 13

Page 48: Secure Coding for Java - An Introduction

Learn Contract Design

Friday, June 28, 13

Page 49: Secure Coding for Java - An Introduction

Learn Contract Design

Friday, June 28, 13

Page 50: Secure Coding for Java - An Introduction

Learn Contract Design

Build

Friday, June 28, 13

Page 51: Secure Coding for Java - An Introduction

Learn Contract Design

Build

Friday, June 28, 13

Page 52: Secure Coding for Java - An Introduction

Learn Contract

Test

Design

Build

Friday, June 28, 13

Page 53: Secure Coding for Java - An Introduction

Learn Contract

Test

Design

Build

Friday, June 28, 13

Page 54: Secure Coding for Java - An Introduction

Learn Contract

Test

Design

Build Progress

Friday, June 28, 13

Page 55: Secure Coding for Java - An Introduction

Learn Contract

Test

Design

Build Progress

Friday, June 28, 13

Page 56: Secure Coding for Java - An Introduction

OWASP  Applica,on  Security  Verifica,on  Standard

20

Friday, June 28, 13

Page 57: Secure Coding for Java - An Introduction

What  is  ASVS  ?

• A  standard  that  provides  a  basis  for  the  verificaPon  of  web  applicaPons  applicaPon-­‐independent.

• A  standard  life-­‐cycle  model  independent.• A  standard  that  define  requirements  that  can  be  applied  across  applicaPons  without  special  interpretaPon. 43

Friday, June 28, 13

Page 58: Secure Coding for Java - An Introduction

What  are  ASVS  responses  ?

• How  much  trust  can  be  placed  in  a  web  applicaPon?

•What  features  should  be  built  into  security  controls?

• How  do  I  acquire  a  web  applicaPon  that  is  verified  to  have  a  certain  range  in  coverage  and  level  of  rigor?

Friday, June 28, 13

Page 59: Secure Coding for Java - An Introduction

ASVS  secure  controls  requirements

Security AreaLevel

1A

Level

1B

Level

2A

Level

2BLevel 3 Level 4

V1 – Security Architecture Verification Requirements 1 1 2 2 4 5

V2 – Authentication Verification Requirements 3 2 9 13 13 14

V3 – Session Management Verification Requirements 4 1 6 7 8 9

V4 – Access Control Verification Requirements 5 1 12 13 14 15

V5 – Input Validation Verification Requirements 3 1 5 7 8 9

V6 – Output Encoding/Escaping Verification Requirements 0 1 2 8 9 10

V7 – Cryptography Verification Requirements 0 0 2 8 9 10

V8 – Error Handling and Logging Verification Requirements 1 1 2 8 8 9

V9 – Data Protection Verification Requirements 1 1 2 3 4 4

V10 – Communication Security Verification Requirements 1 0 3 6 8 8

V11 – HTTP Security Verification Requirements 3 3 6 6 7 7

V12 – Security Configuration Verification Requirements 0 0 0 2 3 4

V13 – Malicious Code Search Verification Requirements 0 0 0 0 0 5

V14 – Internal Security Verification Requirements 0 0 0 0 1 3

Totals 22 12 51 83 96 112

23

Friday, June 28, 13

Page 60: Secure Coding for Java - An Introduction

But  ASVS  stand  for  VerificaPon  ?

• ASVS  just  said  funcPonals  needs  for  controls.  • You  should  use  it  as  a  Secure  Coding  Policy.

★Don’t  be  medium(ASVS  Level1/2),  just  target  excellence  (ASVS  Level  4)

24

Friday, June 28, 13

Page 61: Secure Coding for Java - An Introduction

Using  ASVS  as  a  secure  coding  policy

• ASVS  :  Verify  that  all  password  fields  do  not  echo  the  user’s  password  when  it  is  entered.➡All  Password  fields  must  be  define  as  HTML  password  fields  and  must  not  echo  user  password.  

➡All  login  forms  must  include  autocomplete=off  tag  

• ASVS  :  Verify  that  all  input  validaPon  is  performed  on  the  server  side.  ➡Performs  all  input  valida,on  on  the  server.  Nothing  in  the  browser

25

Friday, June 28, 13

Page 62: Secure Coding for Java - An Introduction

Posi,ve  aatude

Nega0ve

The  tester  shall  search  for  XSS  holesPosi0ve

Verify  that  the  applica0on  performs  input  valida0on  and  output  encoding  on  all  user  input

See:  hTp://www.owasp.org/index.php/XSS_(Cross_Site_Scrip0ng)_Preven0on_Cheat_Sheet

56

Friday, June 28, 13

Page 63: Secure Coding for Java - An Introduction

OWASP  Secure  Coding  Prac3ces

27

Friday, June 28, 13

Page 64: Secure Coding for Java - An Introduction

OWASP  Secure  Coding  PracPces

• Small  document  (only  9  pages)• Could  be  use  as  an  simple  checklist  for  your  policy.

• Could  be  use  together  with  ASVS  or  alone.•More  technical  and  deeper  approach  than  ASVS  .

•Wrote  and  use  by  Boeing  :)

28

Friday, June 28, 13

Page 65: Secure Coding for Java - An Introduction

Secure  Coding  PracPces  Contents

• Input  ValidaPon• Output  Encoding• AuthenPcaPon  and  Password  Management

• Session  Management• Access  Control• Cryptographic  PracPces• Error  Handling  and  Logging

• Data  ProtecPon• CommunicaPon  Security• System  ConfiguraPon• Database  Security• File  Management• Memory  Management• General  Coding  PracPces

29

Friday, June 28, 13

Page 66: Secure Coding for Java - An Introduction

Now  the  torture  room

30

Friday, June 28, 13

Page 67: Secure Coding for Java - An Introduction

(extracts  from  OWASP  Secure  Coding  Prac0ces/OWASP  CheatSheets  OWASP  

ASVS,  ...)

Let  talk  Secure  Coding  now

31

Friday, June 28, 13

Page 68: Secure Coding for Java - An Introduction

Some  secures  principles  to  follow

32

•Deep  defense  of  applica,on  is  mandatory  • Following  less  privileges  is  the  best  soluPon• Segregate  duty  more  that  user  think➡Remember  that  applica,on  need  to  answer  user  needs  and  not  security  pleasure.

Friday, June 28, 13

Page 69: Secure Coding for Java - An Introduction

Deep  defense  of  a  Web  Applica0on  (example)

70

Firewall

Applica0onWeb  Apps

SGBDApp ServerWebServer

Browser

User auth

Input Validation

Secure configuration

Good crash mecanisms

• Critical data transport protection

• Preventing session and ID theft

Critical data protectionsLogs/Audit of transactions

Authorisation and

authentication

Authorisation and authentication

Critical data protectionsPreventing parameters thefts

Friday, June 28, 13

Page 70: Secure Coding for Java - An Introduction

Fail  securely

• Don’t  give  user  technical  details  of  the  error/crash.• Clean  state  or  use  objects  in  catch  clause

34

Friday, June 28, 13

Page 71: Secure Coding for Java - An Introduction

Fail  securely

• Don’t  give  user  technical  details  of  the  error/crash.• Clean  state  or  use  objects  in  catch  clause

34

Friday, June 28, 13

Page 72: Secure Coding for Java - An Introduction

Don’t  try  to  make  obscure  things

72

Friday, June 28, 13

Page 73: Secure Coding for Java - An Introduction

Don’t  try  to  make  obscure  things

72

GEOPORTAIL

Friday, June 28, 13

Page 74: Secure Coding for Java - An Introduction

Don’t  try  to  make  obscure  things

72

Friday, June 28, 13

Page 75: Secure Coding for Java - An Introduction

Don’t  try  to  make  obscure  things

72

GOOGLE MAPS

Friday, June 28, 13

Page 76: Secure Coding for Java - An Introduction

• ObfuscaPon  is  not  the  soluPon• There  is  someone  in  the  matrix  who  will  send  you  evil  data

• Be  evil  !  • Protect  area  with  filter  is  the  best  soluPon

36

Friday, June 28, 13

Page 77: Secure Coding for Java - An Introduction

Controls

• Controls  need  :–to  be  simple–to  be  used  correctly–funcPonal–present  in  every  part  of  the  applicaPon

74

Bad understanding of a control result of unused it by developers and application will be vulnerable.

Friday, June 28, 13

Page 78: Secure Coding for Java - An Introduction

Minimals  controls  to  have

• You  must  have  at  least  this  components  in  your  applicaPon  :  –AuthenPcaPon–AuthorizaPon–Logging  and  audit–Secure  Storage–Secure  transport–Secure  input  and  output  manipulaPon  of  data

75

Friday, June 28, 13

Page 79: Secure Coding for Java - An Introduction

Authen3ca3on

39

Friday, June 28, 13

Page 80: Secure Coding for Java - An Introduction

Implement  good  passwd  strategy

• Password  length-­‐ Categorize  applicaPons  :  

• Important  :  at  least  6  characters• Cri0cal  :  at  least  8  characters  and  perhaps  mul0-­‐factors  authen0ca0on

• High  Cri0cal  :  at  least  14  characters  and  mul0-­‐factors  authen0ca0on

• Password  strength-­‐ Implement  passwd  complexity  with  previous  categories

• at  least  :  1  upper,  1  lower,  1  digit,  1  special• don’t  allow  dic0onnary  passwd• don’t  allow  con0nuous  characters

40

Friday, June 28, 13

Page 81: Secure Coding for Java - An Introduction

Implement  good  passwd  strategy

•Let  the  user  choose  it•Force  the  user  to  change  it  regulary,  and  add  no  reuse  capability.

•Don’t  allow  too  much  “I  forgot  my  passwd”•Don’t  allow  change  of  passwd  without  user  approval;  require  actual  passwd  from  the  user  and  more  for  high  cri0cal.

•Add  sleep  strategy  !•Add  detec3on  of  misuse  strategy  !•Don’t  store  passwd  in  clear  !!!!!  use  hash  !

41

Friday, June 28, 13

Page 82: Secure Coding for Java - An Introduction

MulP-­‐Factor  authenPcaPon

•Passwds  are  bad•Passwds  are  guessable•MulP-­‐factor  combine:  

–something  you  have  (token,  mobile,  ...)–something  you  know  (details  about  you,  passwd,  ...)–somePme,  something  you  are  (biometrics)–Use  it  for  high  criPcal  applicaPons.

42

Friday, June 28, 13

Page 83: Secure Coding for Java - An Introduction

Implement  good  global  strategy

• Ask  second  authenPcaPon  for  criPcal  transacPons  (with  mulP-­‐factor  auth...)

• Force  authenPcaPon  to  be  in  TLS/SSL• Regenerate  Session  ID  aQer  authenPcaPon• Force  Session  ID  to  be  “secure”• LimiPng  forgoEen  passwd,change  of  login/passwd    

43

Friday, June 28, 13

Page 84: Secure Coding for Java - An Introduction

How  to  do  ?  

• Authen0cate  all  pages  but  not  public  pages  (login,  logout,  help,  ....)

• Don’t  allow  more  than  one  authen0ca0on  mecanism• Authen3cate  on  the  SERVER• Simply  send  back  “user  or  passwd  mismatch”  and    nothing  else  aker  a  failed  authen0ca0on.

• Logged  all  failed  and  all  correct  authen0ca0on• Aker  each  authen0ca0on  give  the  user  the  last  status  of  his  authen0ca0on.  

44

Friday, June 28, 13

Page 85: Secure Coding for Java - An Introduction

• Good  Regex  for  a  passwd  complexity  :  

• Good  Storage  of    password  with  SALT

45

(?=^.{8,30}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+}{"":;'?/>.<,]).*$

import java.security.MessageDigest;

public byte[] getHash(String password, byte[] salt) throws NoSuchAlgorithmException { MessageDigest digest = MessageDigest.getInstance("SHA-256"); digest.reset(); digest.update(salt); return digest.digest(password.getBytes("UTF-8"));}

Friday, June 28, 13

Page 86: Secure Coding for Java - An Introduction

Session  Management

46

Friday, June 28, 13

Page 87: Secure Coding for Java - An Introduction

Session  

• Use  Default  Java  Framework  Generator• Use  other  name  than  the  default  name  of  the  Framework  (rename  JSESSIONID...)

• Force  transport  of  ID  authenPcaPon  on  SSL/TLS.• Don’t  allow  Session  ID  in  URL  !• If  using  cookie  :  

– Secure  Cookie– HTTPOnly  Cookie  – LimiPng  path  +  domain–Max  Age  and  expiraPon

47

Friday, June 28, 13

Page 88: Secure Coding for Java - An Introduction

Session  tricky

• AutomaPc  expiraPon–categorize  applicaPons  :

• default  :  1  hour• cri0cal  (some  transac0on)  :  20mns• high  cri0cal  (financials  or  account  impact)  :  5mns  

• Renew  Session  ID  aQer  any  privilege  change• Don’t  allow  simultaneous  logon  • Add  Session  AEack  DetecPon

• add  in-­‐session  0ps  :  ip  of  session,  other  random  number,  ...

48

Friday, June 28, 13

Page 89: Secure Coding for Java - An Introduction

Browser  defenses

• Bind  JavaScript  events  to  close  session  –on  window.close()–on  window.stop()–on  window.blur()–on  window.home()

• Use  Javascripts  Pmer  to  automaPc  close  session  in  high  criPcal  applicaPons

• Disable  WebBrowser  Cross-­‐tab  Session  if  possible...(bad  user  experiences....)– If  you  use  cookie,  this  is  not  possible    !!!!

49

Friday, June 28, 13

Page 90: Secure Coding for Java - An Introduction

50

<session-­‐config>    <cookie-­‐config>        <http-­‐only>true</http-­‐only>        <secure>true</secure>    </cookie-­‐config></session-­‐config>

Using  Servlet  3.0  ?

Friday, June 28, 13

Page 91: Secure Coding for Java - An Introduction

 Access  Controls

107

Friday, June 28, 13

Page 92: Secure Coding for Java - An Introduction

Remember

Friday, June 28, 13

Page 93: Secure Coding for Java - An Introduction

Remember

(1)Without  access  control,  you  can’t  control  the  user  in  your  applica,on

Friday, June 28, 13

Page 94: Secure Coding for Java - An Introduction

Remember

(1)Without  access  control,  you  can’t  control  the  user  in  your  applica,on

(2)All  client  inputs  are  EVIL

Friday, June 28, 13

Page 95: Secure Coding for Java - An Introduction

Authen0ca0on  &  Authoriza0on

• Two  Levels  of  authenPcaPon  and  authorizaPon  are  needed–In  the  ApplicaPon–In  infrastructure

Table  A

Table  B

Connexion Table A + duty ARole  A

Role  B

SGBDApp Server

Connexion Table B + Duty B

Friday, June 28, 13

Page 96: Secure Coding for Java - An Introduction

AuthorizaPon

• Have  in  mind  the  rule  :  –Nothing    by  default

• Centralize  all  authorizaPon  code  on  the  SERVER• If  client  state  are  mandatory,  use  encrypPon  and  integrity  checking  on  the  server  side  to  catch  state  tampering.  

• Limit  number  of  transacPons  per  user  at  a  interval  Pme.

54

Friday, June 28, 13

Page 97: Secure Coding for Java - An Introduction

AuthorizaPon

• Enforce  :– protec0on  of  URL  to  authorized  account  only– protec0on  of  func0on  to  authorized  account  only– protec0on  of  file  access  to  authorized  account  only

• Applica0on  need  to  terminate  session  when  authoriza0on  failed.

• Split  administra0ve  and  user  authoriza0on• Enforce  dormant  account  :

– loss  privileges.– “disable  account”– alerts

55

Friday, June 28, 13

Page 98: Secure Coding for Java - An Introduction

Valida3on  of  Data

56

Friday, June 28, 13

Page 99: Secure Coding for Java - An Introduction

Input  ValidaPon

• Ensure  all  data  validaPon  are  done  on  THE  SERVER.–If  you  do  something  on  client  side  we  can  said  you  do  “painPng”

• Classify  your  data  :–Trusted  Data  –Untrusted  Data

• Conduct  trusted  path.• Centralize  your  data  validaPon• Use  correct  parametrize  query  when  exists  (SQL)

57

Friday, June 28, 13

Page 100: Secure Coding for Java - An Introduction

Border  validaPon

• Consider  validaPng  data  along  all  the  entry  points  of  your  ApplicaPon  border

58

Friday, June 28, 13

Page 101: Secure Coding for Java - An Introduction

Input  ValidaPon

• Use  proper  characters  set  for  all  input• Encode  all  data  to  the  same  character  set  before  doing  anything  <=>Canonicalize

• Reject  all  not  validated  datas• Validate  data    :

–expected  type  (convert  as  soon  as  possible  to  Java  Types)–expected  range–expected  length–expected  values–expected  “white  list”  if  possible

59

Friday, June 28, 13

Page 102: Secure Coding for Java - An Introduction

Input  ValidaPon

• Be  careful  of  using  “hazardous”  characters  (ex:  <>’,”!(+)&\  %.)

• Add  specific  validaPon  :–check  for  null  bytes  (%00)–check  for  new  lines  (%0D,  %0A,  \n,  \r,  ...)–check  for  dot-­‐dot-­‐slashes  (../)  

60

Friday, June 28, 13

Page 103: Secure Coding for Java - An Introduction

Be  careful  of  encoding  for  specific  valida0on...

URL%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%58%53%53%29%3b%3c%2f%73%63%72%69%70%74%3e%0a

HTML&#x3c;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3e;&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x58;&#x53;&#x53;&#x29;&#x3b;&#x3c;&#x2f;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3e;&#x0a;

UTF-8%u003c%uff53%uff43%uff52%uff49%uff50%uff54%u003e%uff41%uff4c%uff45%uff52%uff54%uff08%uff38%uff33%uff33%uff09%u003c%u2215%uff53%uff43%uff52%uff49%uff50%uff54%u003

One space ?< s c r i p t > a l e r t ( X S S ) ; < / s c r i p t >

<script>alert(XSS);</script>

Friday, June 28, 13

Page 104: Secure Coding for Java - An Introduction

Validate  Datas

124

Friday, June 28, 13

Page 105: Secure Coding for Java - An Introduction

SQL  =>  bad

125

Friday, June 28, 13

Page 106: Secure Coding for Java - An Introduction

SQL  =>  bad

125

Friday, June 28, 13

Page 107: Secure Coding for Java - An Introduction

SQL  =>  bad

125

Friday, June 28, 13

Page 108: Secure Coding for Java - An Introduction

SQL  =>  a  liEle  bit  beEer

126

Friday, June 28, 13

Page 109: Secure Coding for Java - An Introduction

List  results  =  entityManager.createQuery("Select  order  from  Orders  order  where  order.id  =  "  +  orderId).getResultList();List  results  =  entityManager.createNativeQuery("Select  *  from  Books  where  author  =  "  +  author).getResultList();int  resultCode  =  entityManager.createNativeQuery("Delete  from  Cart  where  itemId  =  "  +  itemId).executeUpdate();

JPA/EnPty  

65

Friday, June 28, 13

Page 110: Secure Coding for Java - An Introduction

List  results  =  entityManager.createQuery("Select  order  from  Orders  order  where  order.id  =  "  +  orderId).getResultList();List  results  =  entityManager.createNativeQuery("Select  *  from  Books  where  author  =  "  +  author).getResultList();int  resultCode  =  entityManager.createNativeQuery("Delete  from  Cart  where  itemId  =  "  +  itemId).executeUpdate();

JPA/EnPty  

65

Friday, June 28, 13

Page 111: Secure Coding for Java - An Introduction

List  results  =  entityManager.createQuery("Select  order  from  Orders  order  where  order.id  =  "  +  orderId).getResultList();List  results  =  entityManager.createNativeQuery("Select  *  from  Books  where  author  =  "  +  author).getResultList();int  resultCode  =  entityManager.createNativeQuery("Delete  from  Cart  where  itemId  =  "  +  itemId).executeUpdate();

JPA/EnPty  

65

/*  positional  parameter  in  JPQL  */Query  jpqlQuery  =  entityManager.createQuery("Select  order  from  Orders  order  where  order.id  =  ?1");List  results  =  jpqlQuery.setParameter(1,  "123-­‐ADB-­‐567-­‐QTWYTFDL").getResultList();

Friday, June 28, 13

Page 112: Secure Coding for Java - An Introduction

List  results  =  entityManager.createQuery("Select  order  from  Orders  order  where  order.id  =  "  +  orderId).getResultList();List  results  =  entityManager.createNativeQuery("Select  *  from  Books  where  author  =  "  +  author).getResultList();int  resultCode  =  entityManager.createNativeQuery("Delete  from  Cart  where  itemId  =  "  +  itemId).executeUpdate();

JPA/EnPty  

65

/*  positional  parameter  in  JPQL  */Query  jpqlQuery  =  entityManager.createQuery("Select  order  from  Orders  order  where  order.id  =  ?1");List  results  =  jpqlQuery.setParameter(1,  "123-­‐ADB-­‐567-­‐QTWYTFDL").getResultList();

/*  named  query  in  JPQL  -­‐  Query  named  "myCart"  being  "Select  c  from  Cart  c  where  c.itemId  =  :itemId"  */Query  jpqlQuery  =  entityManager.createNamedQuery("myCart");List  results  =  jpqlQuery.setParameter("itemId",  "item-­‐id-­‐0001").getResultList();

Friday, June 28, 13

Page 113: Secure Coding for Java - An Introduction

List  results  =  entityManager.createQuery("Select  order  from  Orders  order  where  order.id  =  "  +  orderId).getResultList();List  results  =  entityManager.createNativeQuery("Select  *  from  Books  where  author  =  "  +  author).getResultList();int  resultCode  =  entityManager.createNativeQuery("Delete  from  Cart  where  itemId  =  "  +  itemId).executeUpdate();

JPA/EnPty  

65

/*  positional  parameter  in  JPQL  */Query  jpqlQuery  =  entityManager.createQuery("Select  order  from  Orders  order  where  order.id  =  ?1");List  results  =  jpqlQuery.setParameter(1,  "123-­‐ADB-­‐567-­‐QTWYTFDL").getResultList();

/*  named  query  in  JPQL  -­‐  Query  named  "myCart"  being  "Select  c  from  Cart  c  where  c.itemId  =  :itemId"  */Query  jpqlQuery  =  entityManager.createNamedQuery("myCart");List  results  =  jpqlQuery.setParameter("itemId",  "item-­‐id-­‐0001").getResultList();/*  named  parameter  in  JPQL  */Query  jpqlQuery  =  entityManager.createQuery("Select  emp  from  Employees  emp  where  emp.incentive  >  :incentive");List  results  =  jpqlQuery.setParameter("incentive",  new  Long(10000)).getResultList();

Friday, June 28, 13

Page 114: Secure Coding for Java - An Introduction

List  results  =  entityManager.createQuery("Select  order  from  Orders  order  where  order.id  =  "  +  orderId).getResultList();List  results  =  entityManager.createNativeQuery("Select  *  from  Books  where  author  =  "  +  author).getResultList();int  resultCode  =  entityManager.createNativeQuery("Delete  from  Cart  where  itemId  =  "  +  itemId).executeUpdate();

JPA/EnPty  

65

/*  positional  parameter  in  JPQL  */Query  jpqlQuery  =  entityManager.createQuery("Select  order  from  Orders  order  where  order.id  =  ?1");List  results  =  jpqlQuery.setParameter(1,  "123-­‐ADB-­‐567-­‐QTWYTFDL").getResultList();

/*  Native  SQL  */Query  sqlQuery  =  entityManager.createNativeQuery("Select  *  from  Books  where  author  =  ?",  Book.class);List  results  =  sqlQuery.setParameter(1,  "Charles  Dickens").getResultList();

/*  named  query  in  JPQL  -­‐  Query  named  "myCart"  being  "Select  c  from  Cart  c  where  c.itemId  =  :itemId"  */Query  jpqlQuery  =  entityManager.createNamedQuery("myCart");List  results  =  jpqlQuery.setParameter("itemId",  "item-­‐id-­‐0001").getResultList();/*  named  parameter  in  JPQL  */Query  jpqlQuery  =  entityManager.createQuery("Select  emp  from  Employees  emp  where  emp.incentive  >  :incentive");List  results  =  jpqlQuery.setParameter("incentive",  new  Long(10000)).getResultList();

Friday, June 28, 13

Page 115: Secure Coding for Java - An Introduction

XML  =>  bad

127

Friday, June 28, 13

Page 116: Secure Coding for Java - An Introduction

XML  =>  bad

127

Friday, June 28, 13

Page 117: Secure Coding for Java - An Introduction

XML  =>  ValidaPng  via  regexp/white  list

128

Friday, June 28, 13

Page 118: Secure Coding for Java - An Introduction

BeEer,  a  XML  schema

<xs:schema  xmlns:xs="hTp://www.w3.org/2001/XMLSchema">  

<xs:element  name="item">  

  <xs:complexType>  

    <xs:sequence>  

      <xs:element  name="descrip0on"  type="xs:string"/>  

      <xs:element  name="price"  type="xs:decimal"/>  

      <xs:element  name="quan0ty"  type="xs:integer"/>  

    </xs:sequence>  

  </xs:complexType>

 </xs:element>  

</xs:schema>  

Friday, June 28, 13

Page 119: Secure Coding for Java - An Introduction

XML  =>  XML  Parser  validaPon

Friday, June 28, 13

Page 120: Secure Coding for Java - An Introduction

LDAP  =>  bad

131

Friday, June 28, 13

Page 121: Secure Coding for Java - An Introduction

LDAP  =>  bad

131

Friday, June 28, 13

Page 122: Secure Coding for Java - An Introduction

LDAP  =>  beEer

132

Friday, June 28, 13

Page 123: Secure Coding for Java - An Introduction

Using  OWASP  ESAPI

72

Friday, June 28, 13

Page 124: Secure Coding for Java - An Introduction

Output  Encoding

73

Friday, June 28, 13

Page 125: Secure Coding for Java - An Introduction

Output  encoding

• It’s  a  Defense  in  depth  mechanism• Encode  ON  THE  SERVER• Centralize  the  encoder  funcPons• SaniPze  all  data  send  to  the  client  

–HTMLEncode  is  a  minimum  but  did  not  work  on  all  cases

74

Friday, June 28, 13

Page 126: Secure Coding for Java - An Introduction

Essai  1  =>  bad

137

Friday, June 28, 13

Page 127: Secure Coding for Java - An Introduction

Essai  1  =>  bad

137

Friday, June 28, 13

Page 128: Secure Coding for Java - An Introduction

Essai  2  =>  it’s  bad,  but  beTer  than  nothing

138

Friday, June 28, 13

Page 129: Secure Coding for Java - An Introduction

Essai  2  =>  it’s  bad,  but  beTer  than  nothing

138

Friday, June 28, 13

Page 130: Secure Coding for Java - An Introduction

A  good  soluPon  with  a  robust  SaniPzer  :)

139

Friday, June 28, 13

Page 131: Secure Coding for Java - An Introduction

Error  Logging

78

Friday, June 28, 13

Page 132: Secure Coding for Java - An Introduction

Error  Handling

Your  Applica3on  will  crash  !• Catch  all  excep0ons  without  excep0on  (remember  the  null  pointer  excep0on  !)– Clean  all  excep0on  code  of  sensi0ve  datas– Don’t  give  user  any  details  about  crash,  just  said  “It’s  a  crash,  try  again  later”

• Logs  are  sensi0ve,  you  MUST  PROTECT  THEM• Log  :  

– input  valida0on  failures– authen0ca0on  request;  especially  failures– access  control  failures– systems  excep0ons– administra0ve  func0onality– crypto  failures– invalid/expired  session  token  access

79

Friday, June 28, 13

Page 133: Secure Coding for Java - An Introduction

Logging/Errors

• Split  your  logs  with  categories,  examples  :  –Access–Error–Debug–Audit

• Use  log4j  for  standard  logging

80

Friday, June 28, 13

Page 134: Secure Coding for Java - An Introduction

Log4J  Example

81

import com.sec.dev;

// Import log4j classes. import org.apache.log4j.Logger; import org.apache.log4j.BasicConfigurator;

public class SecLogger {

// Define a static logger variable so that it references the // Logger instance named "MyApp". static Logger logger = Logger.getLogger(MyApp.class);

public static void main(String[] args) {

// Set up a simple configuration that logs on the console. BasicConfigurator.configure();

logger.setLevel(Level.DEBUG); // optional if log4j.properties file not used // Possible levels: TRACE, DEBUG, INFO, WARN, ERROR, and FATAL

logger.info("Entering application."); Bar bar = new Bar(); bar.doIt(); logger.info("Exiting application."); } }

Friday, June 28, 13

Page 135: Secure Coding for Java - An Introduction

Bad  handling  of  ExcepPon

144

Friday, June 28, 13

Page 136: Secure Coding for Java - An Introduction

Bad  handling  of  ExcepPon

144

Friday, June 28, 13

Page 137: Secure Coding for Java - An Introduction

Good  Housecleaning

83

try { SensitiveData sensitiveData = new SensitiveData (“4242424242424242”); out = new PrintWriter(new FileWriter("OutFile.txt")); //Do Stuff….} catch (IOException e) { if ( sensitiveData != null ) {

sensitiveData.set(“0000000000000000”); }

logger.log ("IO exception ", e.getMessage());

} catch (Exception e) { if ( sensitiveData != null ) {

sensitiveData.set(“0000000000000000”); }logger.log ("Error occurred!”, e.getMessage());

} finally { if ( sensitiveData != null ) {

sensitiveData.set(“0000000000000000”); } if (out != null) {

out.close(); // RELEASE RESOURCES } }

Friday, June 28, 13

Page 138: Secure Coding for Java - An Introduction

BeEer  handling  of  excepPon  and  error

145<error-­‐page>      <excepPon-­‐type>java.lang.Throwable</excepPon-­‐type>      <locaPon>/error.jsp</locaPon>  </error-­‐page>

Friday, June 28, 13

Page 139: Secure Coding for Java - An Introduction

Data  Protec3on

85

Friday, June 28, 13

Page 140: Secure Coding for Java - An Introduction

Data  protecPon

• Protect  sensiPve  datas,    don’t  store  them  in  clear.• Store  sensiPve  datas  in  trusted  systems• Don’t  use  GET  request  for  sensiPve  data.• Disable  client  site  caching

86

Friday, June 28, 13

Page 141: Secure Coding for Java - An Introduction

Disable  Client  Side  caching

87

import  javax.servlet.*;import  javax.servlet.http.HttpServletResponse;import  java.io.IOException;import  java.util.Date;

public  class  CacheControlFilter  implements  Filter  {

       public  void  doFilter(ServletRequest  request,  ServletResponse  response,                                                  FilterChain  chain)  throws  IOException,  ServletException  {

               HttpServletResponse  resp  =  (HttpServletResponse)  response;                resp.setHeader("Expires",  "Tue,  03  Jul  2001  06:00:00  GMT");                resp.setHeader("Last-­‐Modified",  new  Date().toString());                resp.setHeader("Cache-­‐Control",  "no-­‐store,  no-­‐cache,  must-­‐revalidate,  max-­‐age=0,  post-­‐check=0,  pre-­‐check=0");                resp.setHeader("Pragma",  "no-­‐cache");

               chain.doFilter(request,  response);        }

}

<filter>        <filter-­‐name>SetCacheControl</filter-­‐name>        <filter-­‐class>com.sec.dev.cacheControlFilter</filter-­‐class></filter>                                              <filter-­‐mapping>        <filter-­‐name>SetCacheControl</filter-­‐name><url-­‐pattern>/*</url-­‐pattern></filter-­‐mapping>

web.xml

Friday, June 28, 13

Page 142: Secure Coding for Java - An Introduction

Access  to  FileSystem

88

Friday, June 28, 13

Page 143: Secure Coding for Java - An Introduction

Absolute  Path  is  bad

151

Friday, June 28, 13

Page 144: Secure Coding for Java - An Introduction

Absolute  Path  is  bad

151

Friday, June 28, 13

Page 145: Secure Coding for Java - An Introduction

Absolute  Path  is  bad

151

Friday, June 28, 13

Page 146: Secure Coding for Java - An Introduction

Canonicalisa,on  is  good

90

Friday, June 28, 13

Page 147: Secure Coding for Java - An Introduction

Secure  Communica3ons

91

Friday, June 28, 13

Page 148: Secure Coding for Java - An Introduction

Secure  CommunicaPons

• Use  TLS/SSL  :–at  least  SSL  v3.0/TLS  1.0–minimum  of  128bits  encrypPon–use  secure  crypto  :  AES  is  good

• Don’t  expose  criPcal  data  in  the  URL• Failed  SSL/TLS  communicaPons  should  not  fall  back  to  insecure

• Validate  cerPficate  when  used• Protect  all  page,  not  just  logon  page  !

92

Friday, June 28, 13

Page 149: Secure Coding for Java - An Introduction

Force  TLS/SSL  Response

• Use  HTTP  Strict  Transport  Security  (HSTS).–Available  on  some  browsers  (not  IE)–draQ  IETF  :  hEp://tools.iew.org/html/draQ-­‐iew-­‐websec-­‐strict-­‐transport-­‐sec-­‐04

93

HttpServletResponse  ...;response.setHeader("Strict-­‐Transport-­‐Security",  "max-­‐age=7776000;  includeSubdomains");

Friday, June 28, 13

Page 150: Secure Coding for Java - An Introduction

ConfiguraPon

94

• Review  all  properPes,  configuraPon  files• Be  careful  of  default  passwords...• Remove,  and  not  just  de-­‐acPvate,  unused  funcPons/modules

• Use  sandbox  system  when  available  :

Be  careful  of  Java  Signed  code  who  execute  with  more  privileges  !

Friday, June 28, 13

Page 151: Secure Coding for Java - An Introduction

Now  you  can  protect  against  him

95

Friday, June 28, 13

Page 152: Secure Coding for Java - An Introduction

 NEWS

A  BLOG

A  PODCAST

MEMBERSHIPS

MAILING  LISTS

A  NEWSLETTER

APPLE  APP  STORE

VIDEO  TUTORIALS

TRAINING  SESSIONS

SOCIAL  NETWORKING

96On  est  aussi  des  humains,  et  on  peut  boire  un  coup  tout  simplement

Friday, June 28, 13

Page 153: Secure Coding for Java - An Introduction

Dates

• AppSec  Research  Europe  2013  :  20/23  Aout  –  Hambourg  –  Allemagne

• Octobre  2013  :  OSSIR  PARIS–OWASP  Top10  2013;  quoi  de  neuf  ?

•  OWASP  Benelux  :  28/29  Novembre  2013

97Un  tour  des  JUG  est  prévu  en  France,  si  vous  en  connaissez  un  dans  le  coin...

Friday, June 28, 13

Page 154: Secure Coding for Java - An Introduction

Soutenir  l’OWASP

• Différentes  soluPons  :  –Membre  Individuel  :  50  $–Membre  Entreprise  :  5000  $–DonaPon  Libre

• Soutenir  uniquement    le  chapitre  France  :–Single  MeePng  supporter  

• Nous  offrir  une  salle  de  mee0ng  !  • Par0ciper  par  un  talk  ou  autre  !  • Dona0on  simple  

–Local  Chapter  supporter  :  • 500  $  à  2000  $  

98

Friday, June 28, 13

Page 155: Secure Coding for Java - An Introduction

Prochains  meePngs

• Septembre  2013  –Salle  :  Mozilla  Center  Paris–Speaker  :  

• Security  on  Firefox  OS• A  définir

• Novembre  2013–Salle  :  a  définir–Speaker  :  a  définir

Septembre  s’annonce  merveilleux  avec  plein  d’annonces  en  tout  genre....

Friday, June 28, 13

Page 156: Secure Coding for Java - An Introduction

License

100Si  vous  avez  tout  suivi  vous  connaissez  le  prochain  slide....

@SPoint

[email protected]

Friday, June 28, 13