identifying information disclosure in web applications
play

Identifying Information Disclosure in Web Applications with - PowerPoint PPT Presentation

Identifying Information Disclosure in Web Applications with Retroactive Auditing Haogang Chen , Taesoo Kim, Xi Wang Nickolai Zeldovich, and M. Frans Kaashoek MIT CSAIL Data breach: an enduring problem Data breach: an enduring problem What


  1. Design: action history graph (AHG) • AHG [ OSDI ’10 ] tracks dependencies among actions and objects request / 
 db/users • Actions timer • Triggered by external events code • All application code 
 action is executed in the 
 db/log context of an action args view/<sid> • Rail connects actions and 
 objects as the code runs write read trigger • Rail stores AHG in a persistent log

  2. Selective replay using AHG • Rail replays each action 
 sequentially in the time order • Replays an action if 
 any of its inputs or 
 outputs are changed

  3. Selective replay using AHG • Rail replays each action 
 sequentially in the time order • Replays an action if 
 any of its inputs or 
 code outputs are changed

  4. Selective replay using AHG Time • Rail replays each action 
 action � #1 sequentially in the time order action � #2 action � • Replays an action if 
 #3 any of its inputs or 
 code outputs are changed action � #4

  5. Selective replay using AHG • Rail replays each action 
 action � #1 sequentially in the time order db/users action � • Replays an action if 
 #3 any of its inputs or 
 code outputs are changed action � #4 login/sid db/log

  6. Selective replay using AHG • Rail replays each action 
 action � #1 sequentially in the time order db/users action � • Replays an action if 
 #3 any of its inputs or 
 code outputs are changed action � #4 login/sid login/sid db/log

  7. Selective replay using AHG • Rail replays each action 
 action � #1 sequentially in the time order db/users action � • Replays an action if 
 #3 any of its inputs or 
 code outputs are changed action � #4 action 
 login/sid login/sid db/log #8 action � #12

  8. Selective replay using AHG • Rail replays each action 
 action � #1 sequentially in the time order db/users action � • Replays an action if 
 #3 any of its inputs or 
 code outputs are changed action � #4 • Replay is guaranteed 
 to terminate action 
 login/sid login/sid db/log #8 • Never runs actions earlier 
 action � than current replaying action #12

  9. Selective replay using Object API • Rail must intercept all accesses to global objects • e.g., inputs, outputs, database items, 
 session states, …

  10. Selective replay using Object API • Rail must intercept all accesses to global objects • e.g., inputs, outputs, database items, 
 session states, … • Reasons • to track dependency between actions • to make continuous checkpoints of object states

  11. 
 
 
 
 Selective replay using Object API • Developer must wrap all global objects in the app using Rail’s object API 


  12. 
 
 
 
 Selective replay using Object API • Developer must wrap all global objects in the app using Rail’s object API 


  13. 
 
 
 
 Selective replay using Object API • Developer must wrap all global objects in the app using Rail’s object API 
 • Global objects are quite standard in all web apps.

  14. 
 
 
 
 Selective replay using Object API • Developer must wrap all global objects in the app using Rail’s object API 
 • Global objects are quite standard in all web apps. • Most wrappers can be done once in the framework

  15. Example: homework submission // ¡Server ¡side ¡code ¡ var ¡Homeworks ¡= ¡App.getDBCollection(‘hws’); ¡ var ¡Answers ¡= ¡App.getDBCollection(‘answers’); ¡ � App.method(‘submit’, ¡function ¡(hw_id, ¡answer) ¡{ 
 ¡ var ¡uid ¡= ¡App.getSessionUserId(); ¡ ¡ var ¡hw ¡= ¡Homework.findOne( ¡{_id: ¡hw_id} ¡); 
 ¡ ¡ ¡ if ¡(!uid ¡|| ¡!hw ¡|| ¡hw.dueDate ¡< ¡(new ¡ Date)) ¡ ¡ ¡ throw ¡new ¡Error(’Submission ¡failed’); ¡ ¡ Answers.insert( ¡{_id: ¡Math.random(), ¡ ¡ ¡ ¡ ¡hw: ¡hw_id, ¡user: ¡uid, ¡answer: ¡answer} ¡); ¡ }); ¡

  16. Example: homework submission // ¡Server ¡side ¡code ¡ var ¡Homeworks ¡= ¡App.getDBCollection(‘hws’); ¡ var ¡Answers ¡= ¡App.getDBCollection(‘answers’); ¡ � App.method(‘submit’, ¡function ¡(hw_id, ¡answer) ¡{ 
 ¡ var ¡uid ¡= ¡App.getSessionUserId(); ¡ ¡ var ¡hw ¡= ¡Homework.findOne( ¡{_id: ¡hw_id} ¡); 
 ¡ ¡ ¡ if ¡(!uid ¡|| ¡!hw ¡|| ¡hw.dueDate ¡< ¡(new ¡ Date)) ¡ ¡ ¡ throw ¡new ¡Error(’Submission ¡failed’); ¡ ¡ Answers.insert( ¡{_id: ¡Math.random(), ¡ ¡ ¡ ¡ ¡hw: ¡hw_id, ¡user: ¡uid, ¡answer: ¡answer} ¡); ¡ }); ¡

  17. Example: homework submission // ¡Server ¡side ¡code ¡using ¡Rail ¡API ¡ // ¡Server ¡side ¡code ¡ var ¡Homeworks ¡= ¡App.getDBCollection(‘hws’); ¡ var ¡Homeworks ¡= ¡App.getDBCollection(‘hws’); ¡ var ¡Answers ¡= ¡App.getDBCollection(‘answers’); ¡ var ¡Answers ¡= ¡App.getDBCollection(‘answers’); ¡ � � App.method(‘submit’, ¡function ¡(hw_id, ¡answer) ¡{ 
 App.method(‘submit’, ¡function ¡(hw_id, ¡answer) ¡{ 
 ¡ var ¡uid ¡= ¡App.getSessionUserId(); ¡ ¡ var ¡uid ¡= ¡App.getSessionUserId(); ¡ ¡ var ¡hw ¡= ¡Homework.findOne( ¡{_id: ¡hw_id} ¡); 
 ¡ var ¡hw ¡= ¡Homework.findOne( ¡{_id: ¡hw_id} ¡); 
 ¡ ¡ ¡ var ¡ctx ¡= ¡ Rail.inputContext (hw_id, ¡uid); ¡ ¡ if ¡(!uid ¡|| ¡!hw ¡|| ¡hw.dueDate ¡< ¡ ctx.date ()) ¡ ¡ if ¡(!uid ¡|| ¡!hw ¡|| ¡hw.dueDate ¡< ¡(new ¡ Date)) ¡ ¡ ¡ throw ¡new ¡Error(’Submission ¡failed’); ¡ ¡ ¡ throw ¡new ¡Error(’Submission ¡failed’); ¡ ¡ Answers.insert( ¡{_id: ¡Math.random(), ¡ ¡ Answers.insert( ¡{_id: ¡ ctx.random (), ¡ ¡ ¡ ¡ ¡hw: ¡hw_id, ¡user: ¡uid, ¡answer: ¡answer} ¡); ¡ ¡ ¡ ¡ ¡hw: ¡hw_id, ¡user: ¡uid, ¡answer: ¡answer} ¡); ¡ }); ¡ }); ¡

  18. Example: homework submission // ¡Server ¡side ¡code ¡using ¡Rail ¡API ¡ // ¡Server ¡side ¡code ¡ var ¡Homeworks ¡= ¡App.getDBCollection(‘hws’); ¡ var ¡Homeworks ¡= ¡App.getDBCollection(‘hws’); ¡ var ¡Answers ¡= ¡App.getDBCollection(‘answers’); ¡ var ¡Answers ¡= ¡App.getDBCollection(‘answers’); ¡ � � App.method(‘submit’, ¡function ¡(hw_id, ¡answer) ¡{ 
 App.method(‘submit’, ¡function ¡(hw_id, ¡answer) ¡{ 
 ¡ var ¡uid ¡= ¡App.getSessionUserId(); ¡ ¡ var ¡uid ¡= ¡App.getSessionUserId(); ¡ ¡ var ¡hw ¡= ¡Homework.findOne( ¡{_id: ¡hw_id} ¡); 
 ¡ var ¡hw ¡= ¡Homework.findOne( ¡{_id: ¡hw_id} ¡); 
 ¡ ¡ ¡ var ¡ctx ¡= ¡ Rail.inputContext (hw_id, ¡uid); ¡ ¡ if ¡(!uid ¡|| ¡!hw ¡|| ¡hw.dueDate ¡< ¡ ctx.date ()) ¡ ¡ if ¡(!uid ¡|| ¡!hw ¡|| ¡hw.dueDate ¡< ¡(new ¡ Date)) ¡ ¡ ¡ throw ¡new ¡Error(’Submission ¡failed’); ¡ ¡ ¡ throw ¡new ¡Error(’Submission ¡failed’); ¡ ¡ Answers.insert( ¡{_id: ¡Math.random(), ¡ ¡ Answers.insert( ¡{_id: ¡ ctx.random (), ¡ ¡ ¡ ¡ ¡hw: ¡hw_id, ¡user: ¡uid, ¡answer: ¡answer} ¡); ¡ ¡ ¡ ¡ ¡hw: ¡hw_id, ¡user: ¡uid, ¡answer: ¡answer} ¡); ¡ }); ¡ }); ¡

  19. Example: homework submission // ¡Server ¡side ¡code ¡ // ¡Server ¡side ¡code ¡using ¡Rail ¡API ¡ var ¡Homeworks ¡= ¡App.getDBCollection(‘hws’); ¡ var ¡Homeworks ¡= ¡App.getDBCollection(‘hws’); ¡ var ¡Answers ¡= ¡App.getDBCollection(‘answers’); ¡ var ¡Answers ¡= ¡App.getDBCollection(‘answers’); ¡ � � App.method(‘submit’, ¡function ¡(hw_id, ¡answer) ¡{ 
 App.method(‘submit’, ¡function ¡(hw_id, ¡answer) ¡{ 
 ¡ var ¡uid ¡= ¡App.getSessionUserId(); ¡ ¡ var ¡uid ¡= ¡App.getSessionUserId(); ¡ ¡ var ¡hw ¡= ¡Homework.findOne( ¡{_id: ¡hw_id} ¡); 
 ¡ var ¡hw ¡= ¡Homework.findOne( ¡{_id: ¡hw_id} ¡); 
 “call” � ¡ ¡ ¡ var ¡ctx ¡= ¡ Rail.inputContext (hw_id, ¡uid); ¡ action ¡ if ¡(!uid ¡|| ¡!hw ¡|| ¡hw.dueDate ¡< ¡ ctx.date ()) ¡ ¡ if ¡(!uid ¡|| ¡!hw ¡|| ¡hw.dueDate ¡< ¡(new ¡ Date)) ¡ ¡ ¡ throw ¡new ¡Error(’Submission ¡failed’); ¡ ¡ ¡ throw ¡new ¡Error(’Submission ¡failed’); ¡ ¡ Answers.insert( ¡{_id: ¡Math.random(), ¡ ¡ Answers.insert( ¡{_id: ¡ ctx.random (), ¡ ¡ ¡ ¡ ¡hw: ¡hw_id, ¡user: ¡uid, ¡answer: ¡answer} ¡); ¡ ¡ ¡ ¡ ¡hw: ¡hw_id, ¡user: ¡uid, ¡answer: ¡answer} ¡); ¡ }); ¡ }); ¡ input 
 context

  20. Example: homework submission handler 
 // ¡Server ¡side ¡code ¡ // ¡Server ¡side ¡code ¡using ¡Rail ¡API ¡ table code var ¡Homeworks ¡= ¡App.getDBCollection(‘hws’); ¡ var ¡Homeworks ¡= ¡App.getDBCollection(‘hws’); ¡ var ¡Answers ¡= ¡App.getDBCollection(‘answers’); ¡ var ¡Answers ¡= ¡App.getDBCollection(‘answers’); ¡ � � action App.method(‘submit’, ¡function ¡(hw_id, ¡answer) ¡{ 
 App.method(‘submit’, ¡function ¡(hw_id, ¡answer) ¡{ 
 argument ¡ var ¡uid ¡= ¡App.getSessionUserId(); ¡ ¡ var ¡uid ¡= ¡App.getSessionUserId(); ¡ ¡ var ¡hw ¡= ¡Homework.findOne( ¡{_id: ¡hw_id} ¡); 
 ¡ var ¡hw ¡= ¡Homework.findOne( ¡{_id: ¡hw_id} ¡); 
 “call” � session 
 ¡ var ¡ctx ¡= ¡ Rail.inputContext (hw_id, ¡uid); ¡ ¡ ¡ action state ¡ if ¡(!uid ¡|| ¡!hw ¡|| ¡hw.dueDate ¡< ¡ ctx.date ()) ¡ ¡ if ¡(!uid ¡|| ¡!hw ¡|| ¡hw.dueDate ¡< ¡(new ¡ Date)) ¡ ¡ ¡ throw ¡new ¡Error(’Submission ¡failed’); ¡ ¡ ¡ throw ¡new ¡Error(’Submission ¡failed’); ¡ database 
 ¡ Answers.insert( ¡{_id: ¡Math.random(), ¡ ¡ Answers.insert( ¡{_id: ¡ ctx.random (), ¡ (hws) ¡ ¡ ¡ ¡hw: ¡hw_id, ¡user: ¡uid, ¡answer: ¡answer} ¡); ¡ ¡ ¡ ¡ ¡hw: ¡hw_id, ¡user: ¡uid, ¡answer: ¡answer} ¡); ¡ }); ¡ }); ¡ input 
 context database 
 (answers)

  21. Uniform Object API • Rail provides a uniform API for different types of objects • Rail takes care of dependency tracking and checkpointing inputs login RailObject global 
 states argument + getValue() ¡ // ¡accessor ¡ database + add(…,…) ¡ // ¡mutators ¡ + … context -­‑ rollback(ts) ¡ -­‑ equiv(ts) ¡ code -­‑ … view

  22. Uniform Object API • Rail provides a uniform API for different types of objects • Rail takes care of dependency tracking and checkpointing inputs login RailObject global 
 states argument + getValue() ¡ // ¡accessor ¡ database + add(…,…) ¡ // ¡mutators ¡ + … context -­‑ rollback(ts) ¡ -­‑ equiv(ts) ¡ code -­‑ … outputs view view

  23. Tracking data items in output

  24. Tracking data items in output • Rail maintains a view object for every session � • tracks all data items sent to the client

  25. Tracking data items in output • Rail maintains a view object for every session � • tracks all data items sent to the client • To do output book-keeping, one adds objects to the view • e.g., view.add(“db/users/admin”, ¡{“name”, ¡“email”}); ¡ • change the template rendering system

  26. Tracking data items in output • Rail maintains a view object for every session � • tracks all data items sent to the client • To do output book-keeping, one adds objects to the view • e.g., view.add(“db/users/admin”, ¡{“name”, ¡“email”}); ¡ • change the template rendering system • During replay, Rail reruns actions and re-compute the view objects for every session • if old_view − new_view ≠ ∅ ➜ Breach!

  27. Replay with non-deterministic inputs Goal: minimize state divergence

  28. Replay with non-deterministic inputs App.method(‘populate_admins’, ¡function ¡() ¡{ 
 ¡ var ¡admins ¡= ¡[‘Alice’, ¡‘Mallory’, ¡‘Bob’]; ¡ � ¡ for ¡(var ¡i ¡= ¡0; ¡i ¡< ¡admins.length; ¡++i) ¡{ 
 ¡ ¡ var ¡pwd ¡= ¡Math.random(); ¡ ¡ ¡ Users.insert({name: ¡admins[i], ¡passwd: ¡pwd}); ¡ ¡ } ¡ });

  29. Replay with non-deterministic inputs • How to handle randomness during replay? App.method(‘populate_admins’, ¡function ¡() ¡{ 
 App.method(‘populate_admins’, ¡function ¡() ¡{ ¡ ¡ var ¡admins ¡= ¡[‘Alice’, ¡‘Mallory’, ¡‘Bob’]; ¡ -­‑ ¡var ¡admins ¡= ¡[‘Alice’, ¡‘Mallory’, ¡‘Bob’]; ¡ � + ¡var ¡admins ¡= ¡[‘Alice’, ¡‘Bob’]; ¡ ¡ for ¡(var ¡i ¡= ¡0; ¡i ¡< ¡admins.length; ¡++i) ¡{ 
 ¡ for ¡(var ¡i ¡= ¡0; ¡i ¡< ¡admins.length; ¡++i) ¡{ ¡ ¡ ¡ var ¡pwd ¡= ¡Math.random(); ¡ ¡ ¡ var ¡pwd ¡= ¡Math.random(); ¡ ¡ ¡ Users.insert({name: ¡admins[i], ¡passwd: ¡pwd}); ¡ ¡ ¡ Users.insert({name: ¡admins[i], ¡passwd: ¡pwd}); ¡ ¡ } ¡ ¡ } ¡ }); });

  30. Replay with non-deterministic inputs • How to handle randomness during replay? • Strawman 1: return a new random number App.method(‘populate_admins’, ¡function ¡() ¡{ 
 App.method(‘populate_admins’, ¡function ¡() ¡{ ¡ ¡ var ¡admins ¡= ¡[‘Alice’, ¡‘Mallory’, ¡‘Bob’]; ¡ -­‑ ¡var ¡admins ¡= ¡[‘Alice’, ¡‘Mallory’, ¡‘Bob’]; ¡ � + ¡var ¡admins ¡= ¡[‘Alice’, ¡‘Bob’]; ¡ ¡ for ¡(var ¡i ¡= ¡0; ¡i ¡< ¡admins.length; ¡++i) ¡{ 
 ¡ for ¡(var ¡i ¡= ¡0; ¡i ¡< ¡admins.length; ¡++i) ¡{ ¡ ¡ ¡ var ¡pwd ¡= ¡Math.random(); ¡ ¡ ¡ var ¡pwd ¡= ¡Math.random(); ¡ ¡ ¡ Users.insert({name: ¡admins[i], ¡passwd: ¡pwd}); ¡ ¡ ¡ Users.insert({name: ¡admins[i], ¡passwd: ¡pwd}); ¡ ¡ } ¡ ¡ } ¡ }); });

  31. Replay with non-deterministic inputs • How to handle randomness during replay? • Strawman 1: return a new random number • Strawman 2: log and return random numbers in order App.method(‘populate_admins’, ¡function ¡() ¡{ ¡ App.method(‘populate_admins’, ¡function ¡() ¡{ 
 ¡ var ¡admins ¡= ¡[‘Alice’, ¡‘Mallory’, ¡‘Bob’]; ¡ -­‑ ¡var ¡admins ¡= ¡[‘Alice’, ¡‘Mallory’, ¡‘Bob’]; ¡ � + ¡var ¡admins ¡= ¡[‘Alice’, ¡‘Bob’]; ¡ ¡ for ¡(var ¡i ¡= ¡0; ¡i ¡< ¡admins.length; ¡++i) ¡{ 
 ¡ for ¡(var ¡i ¡= ¡0; ¡i ¡< ¡admins.length; ¡++i) ¡{ ¡ ¡ ¡ var ¡pwd ¡= ¡Math.random(); ¡ ¡ ¡ var ¡pwd ¡= ¡Math.random(); ¡ ¡ ¡ Users.insert({name: ¡admins[i], ¡passwd: ¡pwd}); ¡ ¡ ¡ Users.insert({name: ¡admins[i], ¡passwd: ¡pwd}); ¡ ¡ } ¡ ¡ } ¡ }); });

  32. Stabilize non-deterministic inputs with context identifiers • To avoid false report, Rail must reconcile state divergence of two executions w.r.t. non-deterministic inputs

  33. Stabilize non-deterministic inputs with context identifiers • To avoid false report, Rail must reconcile state divergence of two executions w.r.t. non-deterministic inputs • Solution: use input context object to access non- deterministic input

  34. Stabilize non-deterministic inputs with context identifiers • To avoid false report, Rail must reconcile state divergence of two executions w.r.t. non-deterministic inputs • Solution: use input context object to access non- deterministic input App.method(‘populate_admins’, ¡function ¡() ¡{ ¡ ¡ var ¡admins ¡= ¡[‘Alice’, ¡‘Mallory’, ¡‘Bob’]; ¡ ¡ for ¡(var ¡i ¡= ¡0; ¡i ¡< ¡admins.length; ¡++i) ¡{ ¡ -­‑ ¡ ¡ var ¡pwd ¡= ¡Math.random(); ¡ + ¡ ¡ var ¡pwd ¡= ¡Rail.inputContext( 
 + ¡ ¡ ¡ ¡ ‘populate’, ¡admins[i]).random(); ¡ ¡ ¡ Users.insert({name: ¡admins[i], 
 ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡passwd: ¡pwd}); ¡ ¡ } ¡ });

  35. Stabilize non-deterministic inputs with context identifiers • To avoid false report, Rail must reconcile state divergence of two executions w.r.t. non-deterministic inputs • Solution: use input context object to access non- deterministic input App.method(‘populate_admins’, ¡function ¡() ¡{ ¡ ¡ var ¡admins ¡= ¡[‘Alice’, ¡‘Mallory’, ¡‘Bob’]; ¡ • developer supplies 
 ¡ for ¡(var ¡i ¡= ¡0; ¡i ¡< ¡admins.length; ¡++i) ¡{ ¡ a stable context ID -­‑ ¡ ¡ var ¡pwd ¡= ¡Math.random(); ¡ + ¡ ¡ var ¡pwd ¡= ¡Rail.inputContext( 
 + ¡ ¡ ¡ ¡ ‘populate’, ¡admins[i]).random(); ¡ • during replay: 
 ¡ ¡ Users.insert({name: ¡admins[i], 
 same context ID ➜ 
 ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡passwd: ¡pwd}); ¡ return same value ¡ } ¡ });

  36. Stabilize non-deterministic inputs with context identifiers • To avoid false report, Rail must reconcile state divergence of two executions w.r.t. non-deterministic inputs • Solution: use input context object to access non- deterministic input App.method(‘populate_admins’, ¡function ¡() ¡{ ¡ ¡ var ¡admins ¡= ¡[‘Alice’, ¡‘Mallory’, ¡‘Bob’]; ¡ • developer supplies 
 ¡ for ¡(var ¡i ¡= ¡0; ¡i ¡< ¡admins.length; ¡++i) ¡{ ¡ a stable context ID -­‑ ¡ ¡ var ¡pwd ¡= ¡Math.random(); ¡ + ¡ ¡ var ¡pwd ¡= ¡Rail.inputContext( 
 + ¡ ¡ ¡ ¡ ‘populate’, ¡admins[i]).random(); ¡ • during replay: 
 ¡ ¡ Users.insert({name: ¡admins[i], 
 same context ID ➜ 
 ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡passwd: ¡pwd}); ¡ return same value ¡ } ¡ });

  37. Other issues • How to port other web frameworks to support Rail? • e.g., Django, Ruby, etc. • How to choose context identifiers? • What if developers misuse Rail API? • … …

  38. Evaluation

  39. Benchmarks Application Description Submit homework grading EndoApp medical survey social news Telescope (open source)

  40. Benchmarks Application Description Attack workload ACL error : administrator erroneously Submit homework grading granting “ staff ” privilege to a student Stolen password : attacker creating EndoApp medical survey a malicious root account using a surgeon’s weak password Code bugs : permission checks social news Telescope based on client-supplied user ID 
 (open source) —— a real bug in commit history

  41. Porting applications to Rail is easy LOC in JavaScript (only server-side code is changed) Application Changed Server Client Submit 24 769 891 EndoApp 2 599 900 Telescope 20 1,169 1,781 • Most of the changes are related to non-deterministic inputs

  42. Porting applications to Rail is easy LOC in JavaScript (only server-side code is changed) Application Changed Server Client Submit 24 769 891 EndoApp 2 599 900 Telescope 20 1,169 1,781 • Most of the changes are related to non-deterministic inputs • Framework wrappers (422 lines in Meteor) offload most burdens from the application developer

  43. Rail is more precise than 
 access log based approaches # of data items (run with benign workloads in the background) Workload Accessed Reported Missed False ACL error � 1,121 193 0 0 (Submit) Stolen password 
 3,521 197 0 1 (EndoApp) Code bugs � 23 10 0 0 (Telescope)

  44. Rail is more precise than 
 access log based approaches # of data items (run with benign workloads in the background) Workload Accessed Reported Missed False ACL error � 1,121 193 0 0 (Submit) Stolen password 
 3,521 197 0 1 (EndoApp) Code bugs � 23 10 0 0 (Telescope) The malicious account created by the attacker 
 (not a “breach”, but related to the attack)

  45. Rail replays only relevant requests Replayed Total ACL error 
 0.1% (Submit) Stolen password 
 3.1% (EndoApp) Code bugs 
 10.7% (Telescope) 0% 25% 50% 75% 100% Replayed request (%)

  46. Rail replays only relevant requests Replayed Total ACL error 
 0.1% (Submit) Stolen password 
 3.1% (EndoApp) Code bugs 
 10.7% (Telescope) 0% 25% 50% 75% 100% Replayed request (%) • Rail replays only a small fraction of original requests that are related to the attack

  47. Rail replays only relevant requests Replayed Total ACL error 
 0.1% (Submit) Stolen password 
 3.1% (EndoApp) Changed code is on the critical path of all login requests Code bugs 
 10.7% (Telescope) 0% 25% 50% 75% 100% Replayed request (%) • Rail replays only a small fraction of original requests that are related to the attack

  48. Rail replays only relevant requests Replayed Total Replay Recording 3.2 ACL error 
 0.1% (Submit) 664 10.0 Stolen password 
 3.1% (EndoApp) 640 61.2 Code bugs 
 10.7% (Telescope) 603 0% 25% 50% 75% 100% 0 200 400 600 800 Replayed request (%) Time (seconds) • Rail replays only a small fraction of original • Replay time is proportional to 
 requests that are related to the attack the number of replayed requests

  49. Rail’s recording overhead 
 is moderate • Performance � Throughput Overhead for “Submit” • 5% for an under- 50 loaded server 
 Throughput (req/sec) 42 (< 90% CPU utilization) 34 • 22% for an over- loaded server 26 Rail Stock 18 5% 22% 10 16 32 48 64 80 96 112 128 Number of clients

  50. Rail’s recording overhead 
 is moderate • Performance � Throughput Overhead for “Submit” • 5% for an under- 50 loaded server 
 Throughput (req/sec) 42 (< 90% CPU utilization) 34 • 22% for an over- loaded server 26 Rail Stock • Storage � 18 5% 22% 10 • ~ 0.5KB / request 16 32 48 64 80 96 112 128 • or 500GB / year for 
 Number of clients a full-loaded server

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend