62
REST Security with JAXRS JavaOne 2013

Rest Security with JAX-RS

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Rest Security with JAX-RS

REST  Security  with  JAX-­‐RS  

JavaOne  2013  

Page 2: Rest Security with JAX-RS

•  Frank  Kim  – SANS  InsBtute  •  Curriculum  Lead,  ApplicaBon  Security  •  Author,  Secure  Coding  in  Java  

About  

2  

Page 3: Rest Security with JAX-RS

Outline  

•  AuthenBcaBon  •  EncrypBon  •  ValidaBon  •  Wrap  Up  

3  

Page 4: Rest Security with JAX-RS

AuthenBcaBon  

•  Process  of  verifying  an  idenBty  •  Can  be  based  on  three  factors  – Something  you  know  – Something  you  have  – Something  you  are  

4  

Page 5: Rest Security with JAX-RS

Java  EE  AuthenBcaBon  

•  ConfiguraBon  in  web.xml  ! 1 <security-constraint>! 2 <web-resource-collection>! 3 <web-resource-name>Example</web-resource-name>! 4 <url-pattern>/*</url-pattern>! 5 </web-resource-collection>! 6! 7 <auth-constraint>! 8 <role-name>user</role-name>! 9 <role-name>admin</role-name>!10 </auth-constraint>!11 </security-constraint>!12!13 <login-config>!14 <auth-method>FORM</auth-method>!15 <form-login-config>!16 <form-login-page>/login.jsp</form-login-page>!17 <form-error-page>/loginerror.jsp</form-error-page>!18 </form-login-config>!19 </login-config>!

5  

Page 6: Rest Security with JAX-RS

JAX-­‐RS  SecurityContext!

•  getAuthenticationScheme()!–  Returns  String  authenBcaBon  scheme  used  to  protect  the  resource  

–  BASIC,  FORM,  CLIENT_CERT  

•  getUserPrincipal()!–  Returns  Principal  object  containing  the  username  

•  isUserInRole(String role)!–  Returns  a  boolean  indicaBng  if  the  user  has  the  specified  logical  role  

6  

Page 7: Rest Security with JAX-RS

   

Photo  Sharing  Site  Demo  

7  

Page 8: Rest Security with JAX-RS

Photo  Sharing  Site  API  h]p://www.sparklr.com:8080/sparklr2/photos?&format=json  !{ "photos" : [ ! { "id":"1" , "name":"photo1.jpg" } , ! { "id":"3" , "name":"photo3.jpg" } , ! { "id":"5" , "name":"photo5.jpg" }] !}!

8  

Page 9: Rest Security with JAX-RS

Issues  

•  Userid/password  authenBcaBon  is  fine    –  If  the  API  is  used  only  by  your  site  

•  But  what  if  your  API  needs  to  be  used  by  – Other  web  apps  – Mobile  apps  – NaBve  apps  

•  Do  you  want  these  apps  to  – Have  your  password?  – Have  full  access  to  your  account?  

9  

Page 10: Rest Security with JAX-RS

10  

Page 11: Rest Security with JAX-RS

OAuth  

•  Way  to  authenBcate  a  service  – Valet  key  metaphor  coined  by  Eran  Hammer-­‐Lahav  

•  AuthorizaBon  token  with  limited  rights  – You  agree  which  rights  are  granted  – You  can  revoke  rights  at  any  Bme  – Can  gracefully  upgrade  rights  if  needed  

11  

Page 12: Rest Security with JAX-RS

OAuth  Roles  

12  

User  

Client  

Server  -­‐  Person  using  the  app  -­‐  Also  known  as  the  "resource  owner"  

-­‐  Photo  prinBng  service  called  Tonr    

-­‐  Photo  sharing  service  called  Sparklr  -­‐  Also  known  as  the  "resource  server"  

Page 13: Rest Security with JAX-RS

Simplified  OAuth  Flow  

13  

User  

Client  

Server  1)  You  log  in  to  Tonr  

-­‐  Photo  prinBng  service  called  Tonr    

-­‐  Photo  sharing  service  called  Sparklr  

2)  Tonr  needs  pictures  to  print  and  redirects  you  to  Sparklr's  log  in  page  

3)  You  log  in  to  Sparklr  directly  

Page 14: Rest Security with JAX-RS

Simplified  OAuth  Flow  

14  

User  

Client  

Server  6)  You  are  happy  prin<ng  and  viewing  your  pictures    

-­‐  Photo  prinBng  service  called  Tonr    

-­‐  Photo  sharing  service  called  Sparklr  

5)  Tonr  stores  the  "access  token"  with  your  account  

4)  Sparklr  returns  an  OAuth  "access  token"    

Page 15: Rest Security with JAX-RS

   

Photo  PrinBng  Site  Demo  

15  

Page 16: Rest Security with JAX-RS

Detailed  OAuth  Flow  

1)  Via  browser:  Tonr  starts  OAuth  process  –  Once  you  click  the  "Authorize"  bu]on  

http://www.sparklr.com:8080/sparklr2/oauth/authorize?

client_id=tonr&redirect_uri=http://www.tonr.com:8080/

tonr2/sparklr/photos&

response_type=code&

scope=read write&state=92G53T

16  

Page 17: Rest Security with JAX-RS

Detailed  OAuth  Flow  

1)  Via  browser:  Tonr  starts  OAuth  process  –  Once  you  click  the  "Authorize"  bu]on  

http://www.sparklr.com:8080/sparklr2/oauth/authorize?

client_id=tonr&redirect_uri=http://www.tonr.com:8080/

tonr2/sparklr/photos&

response_type=code&

scope=read write&state=92G53T

17  

Page 18: Rest Security with JAX-RS

Detailed  OAuth  Flow  

2)  Via  browser:  Sparklr  redirects  back  to  Tonr  

http://www.tonr.com:8080/tonr2/sparklr/photos?

code=cOuBX6&state=92G53T

18  

Page 19: Rest Security with JAX-RS

Detailed  OAuth  Flow  

3)  Via  "Client":  Tonr  sends  OAuth  request  to  Sparklr  using  client  id/password  

Request:  POST /sparklr2/oauth/token HTTP/1.1

Authorization: Basic dG9ucjpzZWNyZXQ= grant_type=authorization_code&code=cOuBX6& redirect_uri=http://www.tonr.com:8080/tonr2/sparklr/photos

Response:  {"access_token":"5881ce86-3ed0-4427-8a6b-42aef1068dfb",

"token_type":"bearer","expires_in":"42528",

"scope":"read write"}  19  

Page 20: Rest Security with JAX-RS

Detailed  OAuth  Flow  

3)  Via  "Client":  Tonr  sends  OAuth  request  to  Sparklr  using  client  id/password  

Request:  POST /sparklr2/oauth/token HTTP/1.1

Authorization: Basic dG9ucjpzZWNyZXQ= grant_type=authorization_code&code=cOuBX6& redirect_uri=http://www.tonr.com:8080/tonr2/sparklr/photos

Response:  {"access_token":"5881ce86-3ed0-4427-8a6b-42aef1068dfb",

"token_type":"bearer","expires_in":"42528",

"scope":"read write"}  20  

Page 21: Rest Security with JAX-RS

Detailed  OAuth  Flow  

3)  Via  "Client":  Tonr  sends  OAuth  request  to  Sparklr  using  client  id/password  

Request:  POST /sparklr2/oauth/token HTTP/1.1

Authorization: Basic dG9ucjpzZWNyZXQ= grant_type=authorization_code&code=cOuBX6& redirect_uri=http://www.tonr.com:8080/tonr2/sparklr/photos

Response:  {"access_token":"5881ce86-3ed0-4427-8a6b-42aef1068dfb",

"token_type":"bearer","expires_in":"42528",

"scope":"read write"}  21  

Page 22: Rest Security with JAX-RS

Detailed  OAuth  Flow  

3)  Via  "Client":  Tonr  sends  OAuth  request  to  Sparklr  using  client  id/password  

Request:  POST /sparklr2/oauth/token HTTP/1.1

Authorization: Basic dG9ucjpzZWNyZXQ= grant_type=authorization_code&code=cOuBX6& redirect_uri=http://www.tonr.com:8080/tonr2/sparklr/photos

Response:  {"access_token":"5881ce86-3ed0-4427-8a6b-42aef1068dfb", "token_type":"bearer","expires_in":"42528", "scope":"read write"}  

22  

Page 23: Rest Security with JAX-RS

Detailed  OAuth  Flow  

4)  Via  "Client":  Tonr  gets  pictures  from  Sparklr  

All  Requests  include:  Authorization: Bearer 5881ce86-3ed0-4427-8a6b-42aef1068dfb  

23  

Page 24: Rest Security with JAX-RS

When  to  Use  OAuth  

•  Use  OAuth  for  consuming  APIs  from  – Third-­‐party  web  apps  – Mobile  apps  – NaBve  apps  

•  Don't  need  to  use  OAuth  –  If  API  is  only  consumed  by  the  user  within  the  same  web  app  

–  If  APIs  are  only  consumed  server  to  server  

24  

Page 25: Rest Security with JAX-RS

Benefits  

•  No  passwords  shared  between  web  apps  •  No  passwords  stored  on  mobile  devices  •  Limits  impact  of  security  incidents  –  If  you  lose  your  mobile  device    

•  You  revoke  the  access  Sparklr  gave  to  the  Tonr  mobile  app  

–  If  Tonr  gets  hacked    •  Sparklr  revokes  OAuth  access  

–  If  Sparklr  gets  hacked    •  You  change  your  Sparklr  password    •  Revoke  access  from  Tonr  to  generate  a  new  access  token  

  25  

Page 26: Rest Security with JAX-RS

OAuth  Versions  

26  

Version   Comments  

1.0   -­‐  Has  a  security  flaw  related  to  session  fixaBon  -­‐  Don’t  use  it  

1.0a   -­‐  Stable  and  well  understood  -­‐  Uses  a  signature  to  exchange  credenBals  and  signs  every  request  -­‐  Signatures  are  more  of  a  pain  than  it  seems  

2.0   -­‐  Spec  is  final  with  good  support  

Page 27: Rest Security with JAX-RS

OAuth  2.0  AuthorizaBon  Grant  Types  

27  

Grant  Type   Descrip<on  

1)  AuthorizaBon  Code   -­‐  OpBmized  for  confidenBal  clients  -­‐  Uses  a  authorizaBon  code  from  the  Server  -­‐  User  doesn't  see  the  access  token  

2)  Implicit  Grant   -­‐  OpBmized  for  script  heavy  web  apps  -­‐  Does  not  use  an  authorizaBon  code  from  the  Server  -­‐  User  can  see  the  access  token  

3)  Resource  Owner  Password  CredenBals  

-­‐  Use  in  cases  where  the  User  trusts  the  Client  -­‐  Exposes  User  credenBals  to  the  Client  

4)  Client  CredenBals   -­‐  Client  gets  an  access  token  based  on  Client  credenBals  only  

Page 28: Rest Security with JAX-RS

OAuth  2.0    Access  Token  Types  

•  Bearer  – Large  random  token  – Need  SSL  to  protect  it  in  transit  – Server  needs  to  store  it  securely  hashed  like  a  user  password  

•  Mac  – Uses  a  nonce  to  prevent  replay  – Does  not  require  SSL  – OAuth  1.0  only  supported  a  mac  type  token  

28  

Page 29: Rest Security with JAX-RS

Outline  

•  AuthenBcaBon  •  EncrypBon  •  ValidaBon  •  Wrap  Up  

29  

Page 30: Rest Security with JAX-RS

Session  Hijacking  

Public WiFi "Network"

mybank.com  

VicBm  

A]acker  

Internet"

1)  Vic<m  goes  to  mybank.com  via  HTTP  

30  

Page 31: Rest Security with JAX-RS

Session  Hijacking  

Public WiFi "Network"

mybank.com  

VicBm  

A]acker  

Internet"

2)  AMacker  sniffs  the  public  wifi  network  and  steals  the  JSESSIONID  

31  

Page 32: Rest Security with JAX-RS

Session  Hijacking  

Public WiFi "Network"

mybank.com  

VicBm  

A]acker  

Internet"

3)  AMacker  uses  the  stolen  JSESSIONID  to  access  the  vic<m's  session  

32  

Page 33: Rest Security with JAX-RS

Enable  SSL  in  web.xml  ! 1 <security-constraint>! 2 <web-resource-collection>! 3 <web-resource-name>Example</web-resource-name>! 4 <url-pattern>/*</url-pattern>! 5 </web-resource-collection>! 6! 7 ...! 8! 9 <user-data-constraint>!10 <transport-guarantee>!11 CONFIDENTIAL!12 </transport-guarantee>!13 </user-data-constraint>!14 </security-constraint>!

33  

Page 34: Rest Security with JAX-RS

JAX-­‐RS  SecurityContext!

•  iSecure()!– Returns  a  boolean  indicaBng  whether  the  request  was  made  via  HTTPS  

34  

Page 35: Rest Security with JAX-RS

Secure  Flag  

•  Ensures  that  the  Cookie  is  only  sent  via  SSL  •  Configure  in  web.xml  as  of  Servlet  3.0  

<session-config>    <cookie-config>      <secure>true</secure>    </cookie-config> </session-config>!

•  ProgrammaBcally  Cookie cookie = new Cookie("mycookie", "test");!cookie.setSecure(true);!

35  

Page 36: Rest Security with JAX-RS

Strict-­‐Transport-­‐Security  

•  Tells  browser  to  only  talk  to  the  server  via  HTTPS  –  First  Bme  your  site  accessed  via  HTTPS  and  the  header  is  used  the  browser  stores  the  cerBficate  info  

–  Subsequent  requests  to  HTTP  automaBcally  use  HTTPS  

•  Supported  browsers  –  Implemented  in  Firefox  and  Chrome  – Defined  in  RFC  6797  

 

Strict-Transport-Security: max-age=seconds! ! ! ! ! ! ! ! ! [; includeSubdomains]!

36  

Page 37: Rest Security with JAX-RS

Outline  

•  AuthenBcaBon  •  EncrypBon  •  ValidaBon  •  Wrap  Up  

37  

Page 38: Rest Security with JAX-RS

Restrict  Input  

•  Restrict  to  POST  –  Use  @POST  annotaBon  

•  Restrict  the  Content-­‐Type  –  Use  @Consumes({MediaType.APPLICATION_JSON})!–  Invalid  Content-­‐Type  results  in  HTTP  415  Unsupported  Media  Type  

•  Restrict  to  Ajax  if  applicable  –  Check  X-Requested-With:XMLHttpRequest  header  

•  Restrict  response  types  –  Check  Accept  header  for  valid  response  types  

38  

Page 39: Rest Security with JAX-RS

Cross-­‐Site  Request  Forgery  (CSRF)  

39  

VicBm  browser  

mybank.com  

1)  VicBm  signs  on  to  mybank  

2)  VicBm  visits  a]acker.com  

3)  Page  contains  CSRF  code  

4)  Browser  sends  the  request  to  mybank  <form  acBon=h]ps://mybank.com/transfer.jsp  

   method=POST>      <input  name=recipient  value=a]acker>      <input  name=amount  value=1000>  </form>  <script>document.forms[0].submit()</script>  

POST  /transfer.jsp  HTTP/1.1  Cookie:  <mybank  authenBcaBon  cookie>  recipient=a]acker&amount=1000  

a]acker.com  

Page 40: Rest Security with JAX-RS

CSRF  and  OAuth  2.0  

•  How  can  an  a]acker  use  CSRF  to  take  over  your  account?  – Many  sites  allow  logins  from  third-­‐party  idenBty  providers  like  Facebook  

– Many  idenBty  providers  use  OAuth  – A]acker  can  automaBcally  associate  your  account  with  an  a]acker  controlled  Facebook  account  

 

40  

Page 41: Rest Security with JAX-RS

OAuth  CSRF  Research  

•  Accounts  at  many  sites  could  be  taken  over  using  OAuth  CSRF  –  Stack  Exchange,  woot.com,  IMDB,  Goodreads,  SoundCloud,  Pinterest,  

Groupon,  Foursquare,  SlideShare,  Kickstarter,  and  others  

•  Research  by  Rich  Lundeen  –  h]p://webstersprodigy.net/2013/05/09/common-­‐oauth-­‐issue-­‐you-­‐

can-­‐use-­‐to-­‐take-­‐over-­‐accounts  

•  Prior  research  by  Stephen  Sclafani  –  h]p://stephensclafani.com/2011/04/06/oauth-­‐2-­‐0-­‐csrf-­‐vulnerability  

 41  

Page 42: Rest Security with JAX-RS

OAuth  CSRF  A]ack  Flow  

1)  Create  a]acker  controlled  Facebook  account  2)  VicBm  is  signed  on  to  provider  account  (i.e.  

Stack  Exchange)  3)  Lure  vicBm  into  visiBng  an  evil  site  with  

OAuth  CSRF  code  – CSRF  code  sends  OAuth  authorizaBon  request    

4)    A]acker's  Facebook  account  now  controls  vicBm  provider  account  

42  

Page 43: Rest Security with JAX-RS

43  Image  from  h]p://webstersprodigy.net/2013/05/09/common-­‐oauth-­‐issue-­‐you-­‐can-­‐use-­‐to-­‐take-­‐over-­‐accounts  

 

Linking  Stack  Exchange  with  an    Evil  Facebook  Account  

Page 44: Rest Security with JAX-RS

CSRF  ProtecBon  •  Spec  defines  a  "state"  parameter  that  must  be  included  in  the  redirect  to  the  Client  –  Value  must  be  non-­‐guessable  and  Bed  to  session  

Client  sends  "state"  to  Server:  http://www.sparklr.com:8080/sparklr2/oauth/authorize? client_id=tonr&redirect_uri=http://www.eviltonr.com:8080/ tonr2/sparklr/photos& response_type=code& scope=read write&state=92G53T

Server  sends  "state"  back  to  Client  ater  authorizaBon:  http://www.tonr.com:8080/tonr2/sparklr/photos? code=cOuBX6&state=92G53T

44  

Page 45: Rest Security with JAX-RS

   

OAuth  CSRF  ProtecBon  Demo  

45  

Page 46: Rest Security with JAX-RS

OWASP  1-­‐Liner  

•  Deliberately  vulnerable  applicaBon  –  Intended  for  demos  and  training  – Created  by  John  Wilander  @johnwilander  

•  More  informaBon  at  – h]ps://www.owasp.org/index.php/OWASP_1-­‐Liner  

46  

Page 47: Rest Security with JAX-RS

   

JSON  CSRF  Demo  

47  

Page 48: Rest Security with JAX-RS

Normal  JSON  Message  

 {"id":0,"nickName":"John",! "oneLiner":"I LOVE Java!",! "timestamp":"2013-05-27T17:04:23"}!

48  

Page 49: Rest Security with JAX-RS

Forged  JSON  Message  

!{"id": 0, "nickName": "John",! "oneLiner": "I hate Java!",! "timestamp": "20111006"}//=dummy!

49  

Page 50: Rest Security with JAX-RS

CSRF  A]ack  Form  <form id="target" method="POST"!action="https://local.1-liner.org:8444/ws/vulnerable/oneliners" !enctype="text/plain" !style="visibility:hidden">!! <input type="text" ! name='{"id": 0, "nickName": "John",! "oneLiner": "I hate Java!",! "timestamp": "20111006"}//' ! value="dummy" />!! <input type="submit" value="Go" />!</form>!

50  

Page 51: Rest Security with JAX-RS

CSRF  A]ack  Form  <form id="target" method="POST"!action="https://local.1-liner.org:8444/ws/vulnerable/oneliners" !enctype="text/plain" !style="visibility:hidden">!! <input type="text" ! name='{"id": 0, "nickName": "John",! "oneLiner": "I hate Java!",! "timestamp": "20111006"}//' ! value="dummy" />!! <input type="submit" value="Go" />!</form>!

51  

Page 52: Rest Security with JAX-RS

Forged  JSON  Message  

!{"id": 0, "nickName": "John",! "oneLiner": "I hate Java!",! "timestamp": "20111006"}//=dummy!

52  

Page 53: Rest Security with JAX-RS

CSRF  Defense  

•  Must  include  something  random  in  the  request  – Use  an  anB-­‐CSRF  token  

•  OWASP  CSRFGuard  – Wri]en  by  Eric  Sheridan  @eric_sheridan  – Can  inject  anB-­‐CSRF  token  using  •  JSP  Tag  library  -­‐  for  manual,  fine  grained  protecBon  •  JavaScript  DOM  manipulaBon  -­‐  for  automated  protecBon  requiring  minimal  effort  

– Filter  that  intercepts  requests  and  validates  tokens  

53  

Page 54: Rest Security with JAX-RS

CSRFGuard  JSP  Tags  

•  Tags  for  token  name  and  value  <form name="test1" action="protect.html">! <input type="text" name="text" value="text"/>! <input type="submit" name="submit" value="submit"/>! <input type="hidden" name="<csrf:token-name/>"! value="<csrf:token-value/>"/> !</form>  

•  Tag  for  name/value  pair  (delimited  with  "=")  <a href="protect.html?<csrf:token/>">protect.html</a>!

•  Convenience  tags  for  forms  and  links  as  well  <csrf:form>  and  <csrf:a>!!

54  Examples  from  h]ps://www.owasp.org/index.php/CSRFGuard_3_Token_InjecBon  

Page 55: Rest Security with JAX-RS

CSRFGuard  DOM  ManipulaBon  •  Include  JavaScript  in  every  page  that  needs  CSRF  protecBon  <script src="/securish/JavaScriptServlet"></script>!

•  JavaScript  used  to  hook  the  open  and  send  methods  XMLHttpRequest.prototype._open = XMLHttpRequest.prototype.open;!XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {! // store a copy of the target URL! this.url = url; ! this._open.apply(this, arguments);!}!!XMLHttpRequest.prototype._send = XMLHttpRequest.prototype.send;!XMLHttpRequest.prototype.send = function(data) {! if(this.onsend != null) {! // call custom onsend method to modify the request! this.onsend.apply(this, arguments);! }! this._send.apply(this, arguments);!}!

  55  

Page 56: Rest Security with JAX-RS

ProtecBng  XHR  Requests  

•  CSRFGuard  sends  two  HTTP  headers  XMLHttpRequest.prototype.onsend = function(data) {! if(isValidUrl(this.url)) {!

this.setRequestHeader("X-Requested-With", ! "OWASP CSRFGuard Project")!

this.setRequestHeader("OWASP_CSRFTOKEN", ! "EDTF-U8O6-J91L-RZOW-4X09-KEXB-K9B3-4OIV");! }!};!

56  

Page 57: Rest Security with JAX-RS

   

JSON  CSRF  ProtecBon  Demo  

57  

Page 58: Rest Security with JAX-RS

Outline  

•  AuthenBcaBon  •  EncrypBon  •  ValidaBon  •  Wrap  Up  

58  

Page 59: Rest Security with JAX-RS

Summary  •  AuthenBcaBon  

þ  Can  use  userid/password  for  services  consumed  by  your  app  

þ  Use  OAuth  for  third-­‐party  web  apps  and  mobile  apps  •  EncrypBon  

þ  Use  SSL  þ  Use  Secure  flag  þ  Use  Strict-­‐Transport-­‐Security  header  

•  ValidaBon  þ  Restrict  input  þ  Protect  your  apps  against  CSRF      

59  

Page 60: Rest Security with JAX-RS
Page 61: Rest Security with JAX-RS

Frank  Kim        [email protected]  

@sansappsec                                

Page 62: Rest Security with JAX-RS

References  •  JAX-­‐RS  2.0  

–  h]p://jcp.org/en/jsr/detail?id=339  –  h]ps://jax-­‐rs-­‐spec.java.net/nonav/2.0/apidocs  

•  OAuth  2.0  SpecificaBon  –  h]p://tools.iex.org/html/rfc6749  –  h]p://oauth.net  

•  Spring  Security  OAuth  –  h]p://www.springsource.org/spring-­‐security-­‐oauth  

•  OAuth:  The  Big  Picture  –  h]p://pages.apigee.com/oauth-­‐big-­‐picture-­‐ebook.html  

•  OAuth  CSRF  issues  –  h]p://webstersprodigy.net/2013/05/09/common-­‐oauth-­‐issue-­‐you-­‐can-­‐use-­‐to-­‐take-­‐over-­‐accounts  –  h]p://stephensclafani.com/2011/04/06/oauth-­‐2-­‐0-­‐csrf-­‐vulnerability  

•  OWASP  1-­‐Liner  –  h]ps://www.owasp.org/index.php/OWASP_1-­‐Liner  

•  CSRFGuard  –  h]ps://www.owasp.org/index.php/Category:OWASP_CSRFGuard_Project  –  h]p://ericsheridan.blogspot.com/2010/12/how-­‐csrfguard-­‐protects-­‐ajax.html  

62