Check out the new USENIX Web site. next up previous
Next: Resilience to Buffer Overflow Up: Macro-Benchmark Results Previous: Disassembly Accuracy

Run-Time Overhead

An important consideration in the design of RAD is the minimization of performance overhead due to per-function prologue and epilogue RAD code. The relative performance overhead of RAD with respect to a test application is defined as

\begin{displaymath}
Penalty = \frac{fn's\ additional\ cost\ due\ to\ RAD}{fn's\ original\ cost}
\end{displaymath}


The results are in Table 6, which shows the run-time performance overhead of binary-rewriting RAD for typical Internet applications is quite small, around 1%. The space overhead of binary-rewriting RAD for real applications is also quite reasonable, as shown in Table 7. The highest percentage is still smaller than 35%. Both results demonstrate that the overhead of binary-rewriting RAD is quite reasonable for practical applications, given the additional protection it provides.

Table 6: Whole program performance overhead due to the insertion of binary-rewriting RAD code. For BIND, the response time measurement is averaged over 10 queries issued using the client program dig.exe. For the DHCP server, the measurement is the startup and initialization time averaged over 6 runs. For PowerPoint, the measurement is the time taken to render a 90Kbyte presentation averaged over 6 runs. For Outlook Express, the measurement is the startup and initialization time averaged over 6 runs.
Application Original execution Binary RAD execution % Overhead
  time (msec) time (msec)  
BIND 122.56 123.85 1.05%
DHCP server 122 123.5 1.23%
PowerPoint 145 150 3.44%
Outlook Express 138.2 140 1.29%



Table 7: Column 2 shows the space overhead of binary-rewriting RAD for different test applications in terms of percentage increase in size of the executable file after rewriting. Column 3 shows the percentage of functions among those identified that need to invoke RAD epilogue code through the INT 3 handler
Application Percentage Increase in size Percentage of functions that need INT 3 software interrupt
WFtpd (Ftp server) 34.06% 2.57%
BIND (DNS server) 32.65% 0.00%
MS Access 11.29% 2.61%
MS Powerpoint 9.74% 0.83%
Windows Help 32.79% 0.098%
MS FrontPage 16.45% 0.031%
MS Publisher 10.84% 1.58%


Because the cost of invoking an epilogue RAD code through an exception handler is around four times as expensive as that through a jump instruction, it is important to find out how frequent epilogue RAD code is invoked through an exception handling mechanism. If it occurs frequently, then perhaps a more sophisticated mechanism needs to be developed. Table 7 also shows the percentage of functions in the test applications whose epilogue RAD code is triggered via an exception handler. The statistics in Table 7 show that the percentage of functions that do not have enough instruction space for a jump instruction is fairly low, less than 3%, which justifies our design decision of using this expensive solution in these infrequent cases. Please note that, these are results of static analysis. It is possible that, at run-time one of these functions get invoked 50% of the times, in which case the performance might get seriously hit. While it is possible to instrument binaries to report the % of functions called at run-time which need the use of the INT 3 software interrupt, we are not clear if that would say much, since at the end of the day, we can still just say that, since the % of such functions (from our experiments) is typically 0.03% to 2.5%, probabilistically the % of such functions among those called at run-time would be of a similar order.
next up previous
Next: Resilience to Buffer Overflow Up: Macro-Benchmark Results Previous: Disassembly Accuracy
Manish Prasad
2003-04-05