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

Recommend


More recommend