SlideShare a Scribd company logo
What application security tools vendors don’t want you to know and holes they will never find! Mark Curphey John Viega
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
How Important is Context?
 
 
 
 
Mozilla vs. Klocwork  611 “defects”  72 “vulnerabilities”  3 verified bugs  99.5% useless?
 
 
 
What kind of talk is this? Tools that try to find security holes in software Way for us to understand and rationalize why they are so bad and unlikely to get much better soon It is a realistic state of the union about the current state of application security technology and how it is being marketed and applied Dr. Holger Peine http://fhgonline.fraunhofer.de/server?suche-publica&num=048.06/D&iese (N.B. about overly generous quote to Cenzic) Arian Evans http://www.owasp.org/index.php/Image:AppSec2005DC-Arian_Evans_Tools-Taxonomy.ppt
New Topic ,[object Object],[object Object],[object Object],[object Object]
 
 
 
How is security built in the real world?
 
 
 
How is security built in the real world?
How is security built in the real world?
 
Implementation Bugs  vs. Design Flaws
Security Frame of Reference Name Description Configuration Management Configs, security managers, web server settings etc. Authentication Knowing users and entities are who they claim to be Authorization Who can do what to whom, TOCTOU etc. Data Protection (Transit & Storage) Encrypted passwords, on-wire protection, channel sinks, encrypted configuration files etc. Data Validation Valid, well formed, free of malicious payloads etc. Auditing and Logging Knowing who does what to whom etc. Error & Exception Handling What happens when the pooh hits the fan etc. User Management Password reset, registration, licensing etc.
 
Scorecard * unscientific, based on experience ,[object Object],[object Object],[object Object],Security Reference Frame Effectiveness of Assessment Tools Web App Scanners Static Code Analysis Binary Analysis Bug Flaw Bug  Flaw Bug Flaw Configuration Management * * Authentication * * Authorization * * Data Protection (Transit & Storage) * * Data Validation * * Auditing and Logging * * Error & Exception Handling * * User Management * *
Configuration Management  ASP.NET application running in  partial trust Revert.ToSelf(); Implementation Bug Design Flaw * good at many web server config issues Web App Scanners Hard coded connection string in configuration files Use of common crypto keys across Implemntations Hosted Environment
Data Validation Implementation Bug Design Flaw Web App Scanners Canonicalization Internationalization Stored cross site scripting (even basic XSS in some cases) SQL injection (non ‘) Buffer overflows NOT HTTP 500’s! * Their strongest category
Data protection Implementation Bug Design Flaw Web App Scanners Clear text passwords stored  in database Weak algorithms * Reusing keys with stream ciphers Weak random number generators Secure memory management issues
User Management Clear text passwords in  the database Password expiry Password reset sent in clear Implementation Bug Design Flaw Web App Scanners Password generation on reset Weak session ID’s
Grep: Lack of Context … strcpy(dst, src);  // Generally a “high severity” error … strncpy(dst, src); // Generally a filtered out “low sev” …
Grep: Lack of Context … // Generally a “high severity” error strcpy(dst, src);  // Generally a “high severity” error … // Generally “low severity”, filtered out by default strncpy(dst, src, n);  …
Grep: Lack of Context void copy_20(char *src) { char dst[20]; int  n; if (strlen(src) > 19) { return 0; } strcpy(dst, src);  return strdup(dst); }
Grep: Lack of Context void copy(char *dst, char *src) { int  n = strlen(src); strncpy(dst, src, n);  return strdup(dst); } … char d[20]; copy(d, arbitrary_user_input);
Grep-style ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Let’s try to do better with “real” static analysis!
 
Sample program ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Another program ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
alloc(ARGV) [0,max] alloc(B1) [100,100] len(ARGV) [0,max] len(B1) [0,0] alloc(B2) [100,100] len(B2) [0,0] 4 len(ARGV)  -> len(B1) len(B2) -> len(B2) + 1 i [0,0] i <- i + 1
alloc(ARGV) [0,max] alloc(B1) [100,100] len(ARGV) [0,max] len(B1) [0,0] alloc(B2) [100,100] len(B2) [0,0] 4 len(ARGV)  -> len(B1) len(B2) -> len(B2) + 1 i [0,0] i <- i + 1
alloc(ARGV) [0,max] alloc(B1) [100,100] len(ARGV) [0,max] len(B1) [0,max] alloc(B2) [100,100] len(B2) [0,0] 4 len(ARGV)  -> len(B1) len(B2) -> len(B2) + 1 i [0,0] i <- i + 1
alloc(ARGV) [0,max] alloc(B1) [100,100] len(ARGV) [0,max] len(B1) [0,max] alloc(B2) [100,100] len(B2) [0,1] 4 len(ARGV)  -> len(B1) len(B2) -> len(B2) + 1 i [0,0] i <- i + 1
alloc(ARGV) [0,max] alloc(B1) [100,100] len(ARGV) [0,max] len(B1) [0,max] alloc(B2) [100,100] len(B2) [0,1] 4 len(ARGV)  -> len(B1) len(B2) -> len(B2) + 1 i [0,0] i <- i + 1
alloc(ARGV) [0,max] alloc(B1) [100,100] len(ARGV) [0,max] len(B1) [0,max] alloc(B2) [100,100] len(B2) [0,max] 4 len(ARGV)  -> len(B1) len(B2) -> len(B2) + 1 i [0,0] i <- i + 1
alloc(ARGV) [0,max] alloc(B1) [100,100] len(ARGV) [0,max] len(B1) [0,max] alloc(B2) [100,100] len(B2) [0,max] 4 len(ARGV)  -> len(B1) len(B2) -> len(B2) + 1 i [0,0] i <- i + 1
alloc(ARGV) [0,max] alloc(B1) [100,100] len(ARGV) [0,max] len(B1) [0,max] alloc(B2) [100,100] len(B2) [0,max] 4 len(ARGV)  -> len(B1) len(B2) -> len(B2) + 1 i [0,max] i <- i + 1
alloc(ARGV) [0,max] alloc(B1) [100,100] len(ARGV) [0,max] len(B1) [0,max] alloc(B2) [100,100] len(B2) [0,max] Okay: no incoming edges to len(ARGV) RANGE OVERLAPS: B1 MAY OVERFLOW RANGE OVERLAPS: B2 MAY OVERFLOW
The Program Again ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Is this the b2 vuln?
The Program Again ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Or is this?
The Program Again ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
A good analysis requires some understanding of control flow!
Many analyses aren’t worth it! ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Control Flow ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Entry argc: [0,max]  others: nil
Control Flow void main(int argc, char **argv) {  char *b = malloc(100);  int  i; strcpy(b, “foo”);  if(argc > 1 && len(argv[1]) < 100) strcpy(b, argv[1]);  for (i=0;i<3;i++) strcat(b, “.”); } Entry argc: [0,max]  others: nil alloc(b): 100
Control Flow void main(int argc, char **argv) {  char *b = malloc(100);  int  i; strcpy(b, “foo”);  if(argc > 1 && len(argv[1]) < 100) strcpy(b, argv[1]);  for (i=0;i<3;i++) strcat(b, “.”); } Entry argc: [0,max]  others: nil alloc(b): 100 len(b): 4
Control Flow void main(int argc, char **argv) {  char *b = malloc(100);  int  i; strcpy(b, “foo”);  if(argc > 1 && len(argv[1]) < 100) strcpy(b, argv[1]);  for (i=0;i<3;i++) strcat(b, “.”); } Entry argc: [0,max]  others: nil Write to B.  Does it overflow? alloc(b): 100 len(b): 4
Control Flow void main(int argc, char **argv) {  char *b = malloc(100);  int  i; strcpy(b, “foo”);  if(argc > 1 && len(argv[1]) < 100) strcpy(b, argv[1]);  for (i=0;i<3;i++) strcat(b, “.”); } Entry argc: [0,max]  others: nil No.  At this node, B is alloc’d to 100, actual len of 4. alloc(b): 100 len(b): 4
Control Flow B: alloc(100) B: len(4) void main(int argc, char **argv) {  char *b = malloc(100);  int  i; strcpy(b, “foo”);  if(argc > 1 && len(argv[1]) < 100) strcpy(b, argv[1]);  for (i=0;i<3;i++) strcat(b, “.”); } Entry argc: [0,max]  others: nil
Control Flow void main(int argc, char **argv) {  char *b = malloc(100);  int  i; strcpy(b, “foo”);  if(argc > 1 && len(argv[1]) < 100) strcpy(b, argv[1]);  for (i=0;i<3;i++) strcat(b, “.”); } True False Entry argc: [0,max]  others: nil alloc(b): 100 len(b): 4
Control Flow argc: [2, max] Entry argc: [0,max]  others: nil void main(int argc, char **argv) {  char *b = malloc(100);  int  i; strcpy(b, “foo”);  if( argc > 1  && len(argv[1]) < 100) strcpy(b, argv[1]);  for (i=0;i<3;i++) strcat(b, “.”); } True False alloc(b): 100 len(b): 4
Control Flow argc: [2, max] len(argv): [0, 100] alloc(b): 100 len(b): 4 Entry argc: [0,max]  others: nil void main(int argc, char **argv) {  char *b = malloc(100);  int  i; strcpy(b, “foo”);  if(argc > 1 &&  len(argv[1]) < 100 ) strcpy(b, argv[1]);  for (i=0;i<3;i++) strcat(b, “.”); } True False
Control Flow alloc(b): 100 len(b): 4 Entry argc: [0,max]  others: nil void main(int argc, char **argv) {  char *b = malloc(100);  int  i; strcpy(b, “foo”);  if(argc > 1 && len(argv[1]) < 100) strcpy(b, argv[1]);  for (i=0;i<3;i++) strcat(b, “.”); } True False argc: [2, max] len(argv): [0, 100] len(b): [0, 100]
Control Flow alloc(b): 100 len(b): 4 Entry argc: [0,max]  others: nil void main(int argc, char **argv) {  char *b = malloc(100);  int  i; strcpy(b, “foo”);  if(argc > 1 && len(argv[1]) < 100) strcpy(b, argv[1]);  for (i=0;i<3;i++) strcat(b, “.”); } True False argc: [2, max] len(argv): [0, 100] len(b): [0, 100]  No overflow.  b is alloc’d to 100, len can be no more than 100 after null is added.
Control Flow alloc(b): 100 len(b): 4 Entry argc: [0,max]  others: nil void main(int argc, char **argv) {  char *b = malloc(100);  int  i; strcpy(b, “foo”);  if(argc > 1 && len(argv[1]) < 100) strcpy(b, argv[1]);  for ( i=0 ;i<3;i++) strcat(b, “.”); } True False argc: [2, max] len(argv): [0, 100] len(b): [0, 100]   i = 0
Control Flow alloc(b): 100 len(b): 4 Entry argc: [0,max]  others: nil void main(int argc, char **argv) {  char *b = malloc(100);  int  i; strcpy(b, “foo”);  if(argc > 1 && len(argv[1]) < 100) strcpy(b, argv[1]);  for (i=0;i<3;i++) strcat(b, “.”); } True False argc: [2, max] len(argv): [0, 100] len(b): [0, 100]   i = 0 len(b): [0, 100] Use the worst case assumption for the length of b.
Control Flow alloc(b): 100 len(b): 4 Entry argc: [0,max]  others: nil void main(int argc, char **argv) {  char *b = malloc(100);  int  i; strcpy(b, “foo”);  if(argc > 1 && len(argv[1]) < 100) strcpy(b, argv[1]);  for (i=0;i<3;i++) strcat(b, “.”); } True False argc: [2, max] len(argv): [0, 100] len(b): [0, 100]   i = 0 len(b): [0, 100] len(b): [0, 101]
Control Flow alloc(b): 100 len(b): 4 Entry argc: [0,max]  others: nil void main(int argc, char **argv) {  char *b = malloc(100);  int  i; strcpy(b, “foo”);  if(argc > 1 && len(argv[1]) < 100) strcpy(b, argv[1]);  for (i=0;i<3;i++) strcat(b, “.”); } True False argc: [2, max] len(argv): [0, 100] len(b): [0, 100]   i = 0 len(b): [0, 100] len(b): [0, 101] ERROR:  len(b) > alloc(b)!!!
Control Flow alloc(b): 100 len(b): 4 Entry argc: [0,max]  others: nil True False argc: [2, max] len(argv): [0, 100] len(b): [0, 100]   i = 0 len(b): [0, 100] len(b): [0, 101] Could show you the graph to help you debug…
Control Flow alloc(b): 100 len(b): 4 Entry argc: [0,max]  others: nil True False argc: [2, max] len(argv): [0, 100] len(b): [0, 100]   i = 0 len(b): [0, 100] len(b): [0, 101] If you’re a rocket scientist   (graphs get big and complex in real programs)
Control Flow ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Though, we could show you (one possible) “stack trace” instead… (far better than dynamic analysis tools!)
Control Flow ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Or, we could show where the data came from
Not just memory stuff… ,[object Object],[object Object],[object Object],[object Object]
Issue 1 void main(int argc, char **argv) {  char *b = malloc( 100000 );  int  n = argc; for (i=0;i<n;i++) strcat(b, “.”); }
Issue 1 void main(int argc, char **argv) {  char *b = malloc(100000);  int  n = argc; for (i=0;i<n;i++) strcat(b, “.”); } In a more complex example, would we really have to “run” the loop MAX_INT times?
Issue 1 void main(int argc, char **argv) {  char *b = malloc(100000);  int  n = argc; for (i=0;i<n;i++) strcat(b, “.”); } In this case, we could multiply the effect by the maximum value of n.
Issue 1 void main(int argc, char **argv) {  char *b = malloc(100000);  int  n = argc; for (i=0;i<n;i++) strcat(b, “.”); } More complex cases aren’t that easy, and require approximations!
Issue 2 alloc(b): 100 len(b): 4 Entry argc: [0,max]  others: nil True False argc: [2, max] len(argv): [0, 100] len(b): [0, 100]   i = 0 len(b): [0, 100] We lost accuracy when we merged.
Issue 2 alloc(b): 100 len(b): 4 Entry argc: [0,max]  others: nil True False argc: [2, max] len(argv): [0, 100] len(b): [0, 100]   i = 0 len(b): [0, 101] i = 0 len(b): 4
Issue 2 alloc(b): 100 len(b): 4 Entry argc: [0,max]  others: nil True False argc: [2, max] len(argv): [0, 100] len(b): [0, 100]   i = 0 We can show which path is bad! And, future calculations become much more accurate. len(b): [0, 101] i = 0 len(b): 4
Issue 2 alloc(b): 100 len(b): 4 Entry argc: [0,max]  others: nil True False argc: [2, max] len(argv): [0, 100] len(b): [0, 100]   i = 0 len(b): [0, 101] i = 0 len(b): 4 An exponential explosion of nodes Only feasible for single functions (intraprocedural analysis)
Issue 2 alloc(b): 100 len(b): 4 Entry argc: [0,max]  others: nil True False argc: [2, max] len(argv): [0, 100] len(b): [0, 100]   i = 0 len(b): [0, 101] i = 0 len(b): 4 Full path analysis is even less feasible when we consider exits from complex loops
The problem with intraprocedural char *magic_function(char *a, char *b) { char *p1 = a; char *p2 = b; while (*p2) *p1++ = *p2++; return a; }
The problem with intraprocedural char *magic_function(char *a, char *b) { char *p1 = a; char *p2 = b; while (*p2) *p1++ = *p2++; return a; } No matter how accurate we get inside the procedure, we are in a catch-22 (spam vs. ignore)
The problem with intraprocedural char *magic_function(char *a, char *b) { char *p1 = a; char *p2 = b; while (*p2) *p1++ = *p2++; return a; } Instead of erroring, we can “summarize” the generic properties.
The problem with intraprocedural char *magic_function(char *a, char *b) { char *p1 = a; char *p2 = b; while (*p2) *p1++ = *p2++; return a; } e.g., len(a) <- len(b)
The problem with intraprocedural char *magic_function(char *a, char *b) { char *p1 = a; char *p2 = b; while (*p2) *p1++ = *p2++; return a; } Scaling algorithms to an entire program can greatly improve accuracy… and decrease efficiency!
Using environmental knowledge ,[object Object],[object Object],[object Object]
There will always be falses ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Building good tools is hard! ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Everybody gets this right… for the wrong reasons secureConnect (host, port): s = sslConnect(gethostbyaddr(host), port) cert = get_cert(s) if ! certSignedByTrustedRoot(cert): raise “SSLError” if  cert.DN <> host: raise “SSLError” if ! subjAltNameMatches(cert, host): raise “SSLError” if certRevoked(cert): raise “SSLError” return s
If you’re not an auditor, it probably isn’t cost effective!
Notes on Buying Automated Tools Trials are limited for a reason (as are the EULA’s) Make sure you test them on your own site / code
“ The height of mediocrity is still low” Basic Conclusion
Accuracy on basic software today is mediocre at best It is really easy to write an application that can’t be automatically scanned It is really hard to write an automated scanner than can effectively analyze software Basic Conclusion
 
PCI Data Security Standards
 
6.6 Ensure that all web-facing applications are protected against known  attacks by applying either of the following methods:  •  Having all custom application code reviewed for  common vulnerabilities  by an  organization that specializes in application security  •  Installing an  application layer firewall  in front of web-facing applications.    Note: This method is considered a best practice until June 30, 2008,  after which it becomes a requirement.    Full document at  https://www.pcisecuritystandards.org/tech/download_the_pci_dss.htm PCI-DSS is now managed by an industry consortium at  www.pcisecuritystandards.org
…… or go straight to the document here! https://www.pcisecuritystandards.org/pdfs/pci_dss_v1-1.pdf
 
Introducing the only tool in the world that really works effectively today……
 
News for people who run tools
A fool with a tool … .is still a fool
China!
China!
China!
People Process Technology
Fair and Balance ,[object Object],[object Object]
What sort of tool do we want? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
 
That’s all folks!

More Related Content

What's hot

Writing Friendly libraries for CodeIgniter
Writing Friendly libraries for CodeIgniterWriting Friendly libraries for CodeIgniter
Writing Friendly libraries for CodeIgniterCodeIgniter Conference
 
jQuery Plugin Creation
jQuery Plugin CreationjQuery Plugin Creation
jQuery Plugin Creationbenalman
 
Evolving Software with Moose
Evolving Software with MooseEvolving Software with Moose
Evolving Software with MooseDave Cross
 
Modern Web Development with Perl
Modern Web Development with PerlModern Web Development with Perl
Modern Web Development with PerlDave Cross
 
SPL to the Rescue - Tek 09
SPL to the Rescue - Tek 09SPL to the Rescue - Tek 09
SPL to the Rescue - Tek 09Elizabeth Smith
 
Let's write secure Drupal code! DUG Belgium - 08/08/2019
Let's write secure Drupal code! DUG Belgium - 08/08/2019Let's write secure Drupal code! DUG Belgium - 08/08/2019
Let's write secure Drupal code! DUG Belgium - 08/08/2019Balázs Tatár
 
With a Mighty Hammer
With a Mighty HammerWith a Mighty Hammer
With a Mighty HammerBen Scofield
 
New Features in PHP 5.3
New Features in PHP 5.3New Features in PHP 5.3
New Features in PHP 5.3Bradley Holt
 
Php on the desktop and php gtk2
Php on the desktop and php gtk2Php on the desktop and php gtk2
Php on the desktop and php gtk2Elizabeth Smith
 

What's hot (20)

Writing Friendly libraries for CodeIgniter
Writing Friendly libraries for CodeIgniterWriting Friendly libraries for CodeIgniter
Writing Friendly libraries for CodeIgniter
 
jQuery Plugin Creation
jQuery Plugin CreationjQuery Plugin Creation
jQuery Plugin Creation
 
Modern Perl
Modern PerlModern Perl
Modern Perl
 
Django Heresies
Django HeresiesDjango Heresies
Django Heresies
 
Evolving Software with Moose
Evolving Software with MooseEvolving Software with Moose
Evolving Software with Moose
 
Modern Web Development with Perl
Modern Web Development with PerlModern Web Development with Perl
Modern Web Development with Perl
 
TDD with PhpSpec
TDD with PhpSpecTDD with PhpSpec
TDD with PhpSpec
 
4.2 PHP Function
4.2 PHP Function4.2 PHP Function
4.2 PHP Function
 
RSpec 2 Best practices
RSpec 2 Best practicesRSpec 2 Best practices
RSpec 2 Best practices
 
Spl in the wild
Spl in the wildSpl in the wild
Spl in the wild
 
SPL to the Rescue - Tek 09
SPL to the Rescue - Tek 09SPL to the Rescue - Tek 09
SPL to the Rescue - Tek 09
 
Let's write secure Drupal code! DUG Belgium - 08/08/2019
Let's write secure Drupal code! DUG Belgium - 08/08/2019Let's write secure Drupal code! DUG Belgium - 08/08/2019
Let's write secure Drupal code! DUG Belgium - 08/08/2019
 
New in php 7
New in php 7New in php 7
New in php 7
 
With a Mighty Hammer
With a Mighty HammerWith a Mighty Hammer
With a Mighty Hammer
 
New Features in PHP 5.3
New Features in PHP 5.3New Features in PHP 5.3
New Features in PHP 5.3
 
Php go vrooom!
Php go vrooom!Php go vrooom!
Php go vrooom!
 
Getting testy with Perl
Getting testy with PerlGetting testy with Perl
Getting testy with Perl
 
Php on the desktop and php gtk2
Php on the desktop and php gtk2Php on the desktop and php gtk2
Php on the desktop and php gtk2
 
PHP - Introduction to PHP Functions
PHP -  Introduction to PHP FunctionsPHP -  Introduction to PHP Functions
PHP - Introduction to PHP Functions
 
Modern Perl
Modern PerlModern Perl
Modern Perl
 

Similar to Hack in the Box Keynote 2006

Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Guillaume Laforge
 
Computer Networks Lab File
Computer Networks Lab FileComputer Networks Lab File
Computer Networks Lab FileKandarp Tiwari
 
Secure Programming
Secure ProgrammingSecure Programming
Secure Programmingalpha0
 
The bones of a nice Python script
The bones of a nice Python scriptThe bones of a nice Python script
The bones of a nice Python scriptsaniac
 
Mouse programming in c
Mouse programming in cMouse programming in c
Mouse programming in cgkgaur1987
 
Unit 5 Foc
Unit 5 FocUnit 5 Foc
Unit 5 FocJAYA
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with ClojureDmitry Buzdin
 
JavaScript and jQuery Fundamentals
JavaScript and jQuery FundamentalsJavaScript and jQuery Fundamentals
JavaScript and jQuery FundamentalsBG Java EE Course
 
Network lap pgms 7th semester
Network lap pgms 7th semesterNetwork lap pgms 7th semester
Network lap pgms 7th semesterDOSONKA Group
 
PesterSec: Using Pester & ScriptAnalyzer to Detect Obfuscated PowerShell
PesterSec: Using Pester & ScriptAnalyzer to Detect Obfuscated PowerShellPesterSec: Using Pester & ScriptAnalyzer to Detect Obfuscated PowerShell
PesterSec: Using Pester & ScriptAnalyzer to Detect Obfuscated PowerShellDaniel Bohannon
 
Hooking signals and dumping the callstack
Hooking signals and dumping the callstackHooking signals and dumping the callstack
Hooking signals and dumping the callstackThierry Gayet
 
Introduction to Snort Rule Writing
Introduction to Snort Rule WritingIntroduction to Snort Rule Writing
Introduction to Snort Rule WritingCisco DevNet
 
Object Orientation vs. Functional Programming in Python
Object Orientation vs. Functional Programming in PythonObject Orientation vs. Functional Programming in Python
Object Orientation vs. Functional Programming in PythonPython Ireland
 
My First Rails Plugin - Usertext
My First Rails Plugin - UsertextMy First Rails Plugin - Usertext
My First Rails Plugin - Usertextfrankieroberto
 

Similar to Hack in the Box Keynote 2006 (20)

Buffer OverFlow
Buffer OverFlowBuffer OverFlow
Buffer OverFlow
 
Price of an Error
Price of an ErrorPrice of an Error
Price of an Error
 
Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008
 
Computer Networks Lab File
Computer Networks Lab FileComputer Networks Lab File
Computer Networks Lab File
 
Secure Programming
Secure ProgrammingSecure Programming
Secure Programming
 
The bones of a nice Python script
The bones of a nice Python scriptThe bones of a nice Python script
The bones of a nice Python script
 
Mouse programming in c
Mouse programming in cMouse programming in c
Mouse programming in c
 
Unit 5 Foc
Unit 5 FocUnit 5 Foc
Unit 5 Foc
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with Clojure
 
Effective Object Oriented Design in Cpp
Effective Object Oriented Design in CppEffective Object Oriented Design in Cpp
Effective Object Oriented Design in Cpp
 
PHP Secure Programming
PHP Secure ProgrammingPHP Secure Programming
PHP Secure Programming
 
JavaScript and jQuery Fundamentals
JavaScript and jQuery FundamentalsJavaScript and jQuery Fundamentals
JavaScript and jQuery Fundamentals
 
Network lap pgms 7th semester
Network lap pgms 7th semesterNetwork lap pgms 7th semester
Network lap pgms 7th semester
 
PesterSec: Using Pester & ScriptAnalyzer to Detect Obfuscated PowerShell
PesterSec: Using Pester & ScriptAnalyzer to Detect Obfuscated PowerShellPesterSec: Using Pester & ScriptAnalyzer to Detect Obfuscated PowerShell
PesterSec: Using Pester & ScriptAnalyzer to Detect Obfuscated PowerShell
 
Hooking signals and dumping the callstack
Hooking signals and dumping the callstackHooking signals and dumping the callstack
Hooking signals and dumping the callstack
 
Introduction to Snort Rule Writing
Introduction to Snort Rule WritingIntroduction to Snort Rule Writing
Introduction to Snort Rule Writing
 
Object Orientation vs. Functional Programming in Python
Object Orientation vs. Functional Programming in PythonObject Orientation vs. Functional Programming in Python
Object Orientation vs. Functional Programming in Python
 
Code optimization
Code optimization Code optimization
Code optimization
 
Code optimization
Code optimization Code optimization
Code optimization
 
My First Rails Plugin - Usertext
My First Rails Plugin - UsertextMy First Rails Plugin - Usertext
My First Rails Plugin - Usertext
 

More from Mark Curphey

Curphey AppSecUSA - Community The Killer Application
Curphey AppSecUSA - Community The Killer ApplicationCurphey AppSecUSA - Community The Killer Application
Curphey AppSecUSA - Community The Killer ApplicationMark Curphey
 
Software Security in the Real World
Software Security in the Real WorldSoftware Security in the Real World
Software Security in the Real WorldMark Curphey
 
Product Definition
Product DefinitionProduct Definition
Product DefinitionMark Curphey
 
Product Positioning and Lifecycle
Product Positioning and LifecycleProduct Positioning and Lifecycle
Product Positioning and LifecycleMark Curphey
 
Marketing Introduction
Marketing IntroductionMarketing Introduction
Marketing IntroductionMark Curphey
 
Advertising Theory
Advertising TheoryAdvertising Theory
Advertising TheoryMark Curphey
 
Innovators Dilemma Slides
Innovators Dilemma SlidesInnovators Dilemma Slides
Innovators Dilemma SlidesMark Curphey
 
Managing Corporate Information Security Risk in Financial Institutions
Managing Corporate Information Security Risk in Financial InstitutionsManaging Corporate Information Security Risk in Financial Institutions
Managing Corporate Information Security Risk in Financial InstitutionsMark Curphey
 

More from Mark Curphey (12)

Curphey AppSecUSA - Community The Killer Application
Curphey AppSecUSA - Community The Killer ApplicationCurphey AppSecUSA - Community The Killer Application
Curphey AppSecUSA - Community The Killer Application
 
Software Security in the Real World
Software Security in the Real WorldSoftware Security in the Real World
Software Security in the Real World
 
Research
ResearchResearch
Research
 
Product Definition
Product DefinitionProduct Definition
Product Definition
 
Product and Brand
Product and BrandProduct and Brand
Product and Brand
 
Product Positioning and Lifecycle
Product Positioning and LifecycleProduct Positioning and Lifecycle
Product Positioning and Lifecycle
 
New product Offer
New product OfferNew product Offer
New product Offer
 
Marketing Introduction
Marketing IntroductionMarketing Introduction
Marketing Introduction
 
Advertising Theory
Advertising TheoryAdvertising Theory
Advertising Theory
 
Innovators Dilemma Slides
Innovators Dilemma SlidesInnovators Dilemma Slides
Innovators Dilemma Slides
 
Managing Corporate Information Security Risk in Financial Institutions
Managing Corporate Information Security Risk in Financial InstitutionsManaging Corporate Information Security Risk in Financial Institutions
Managing Corporate Information Security Risk in Financial Institutions
 
Naked Security
Naked SecurityNaked Security
Naked Security
 

Recently uploaded

Putting the SPARK into Virtual Training.pptx
Putting the SPARK into Virtual Training.pptxPutting the SPARK into Virtual Training.pptx
Putting the SPARK into Virtual Training.pptxCynthia Clay
 
Global Interconnection Group Joint Venture[960] (1).pdf
Global Interconnection Group Joint Venture[960] (1).pdfGlobal Interconnection Group Joint Venture[960] (1).pdf
Global Interconnection Group Joint Venture[960] (1).pdfHenry Tapper
 
Unveiling the Secrets How Does Generative AI Work.pdf
Unveiling the Secrets How Does Generative AI Work.pdfUnveiling the Secrets How Does Generative AI Work.pdf
Unveiling the Secrets How Does Generative AI Work.pdfSam H
 
NewBase 24 May 2024 Energy News issue - 1727 by Khaled Al Awadi_compresse...
NewBase   24 May  2024  Energy News issue - 1727 by Khaled Al Awadi_compresse...NewBase   24 May  2024  Energy News issue - 1727 by Khaled Al Awadi_compresse...
NewBase 24 May 2024 Energy News issue - 1727 by Khaled Al Awadi_compresse...Khaled Al Awadi
 
falcon-invoice-discounting-a-premier-platform-for-investors-in-india
falcon-invoice-discounting-a-premier-platform-for-investors-in-indiafalcon-invoice-discounting-a-premier-platform-for-investors-in-india
falcon-invoice-discounting-a-premier-platform-for-investors-in-indiaFalcon Invoice Discounting
 
Taurus Zodiac Sign_ Personality Traits and Sign Dates.pptx
Taurus Zodiac Sign_ Personality Traits and Sign Dates.pptxTaurus Zodiac Sign_ Personality Traits and Sign Dates.pptx
Taurus Zodiac Sign_ Personality Traits and Sign Dates.pptxmy Pandit
 
20240425_ TJ Communications Credentials_compressed.pdf
20240425_ TJ Communications Credentials_compressed.pdf20240425_ TJ Communications Credentials_compressed.pdf
20240425_ TJ Communications Credentials_compressed.pdftjcomstrang
 
IPTV Subscription in Ireland: Elevating Your Entertainment Experience
IPTV Subscription in Ireland: Elevating Your Entertainment ExperienceIPTV Subscription in Ireland: Elevating Your Entertainment Experience
IPTV Subscription in Ireland: Elevating Your Entertainment ExperienceDragon Dream Bar
 
Filing Your Delaware Franchise Tax A Detailed Guide
Filing Your Delaware Franchise Tax A Detailed GuideFiling Your Delaware Franchise Tax A Detailed Guide
Filing Your Delaware Franchise Tax A Detailed GuideYourLegal Accounting
 
sales plan presentation by mckinsey alum
sales plan presentation by mckinsey alumsales plan presentation by mckinsey alum
sales plan presentation by mckinsey alumzyqmx62fgm
 
Maximizing Efficiency Migrating AccountEdge Data to QuickBooks.pdf
Maximizing Efficiency Migrating AccountEdge Data to QuickBooks.pdfMaximizing Efficiency Migrating AccountEdge Data to QuickBooks.pdf
Maximizing Efficiency Migrating AccountEdge Data to QuickBooks.pdfPaulBryant58
 
Equinox Gold Corporate Deck May 24th 2024
Equinox Gold Corporate Deck May 24th 2024Equinox Gold Corporate Deck May 24th 2024
Equinox Gold Corporate Deck May 24th 2024Equinox Gold Corp.
 
April 2024 Nostalgia Products Newsletter
April 2024 Nostalgia Products NewsletterApril 2024 Nostalgia Products Newsletter
April 2024 Nostalgia Products NewsletterNathanBaughman3
 
Enterprise Excellence is Inclusive Excellence.pdf
Enterprise Excellence is Inclusive Excellence.pdfEnterprise Excellence is Inclusive Excellence.pdf
Enterprise Excellence is Inclusive Excellence.pdfKaiNexus
 
BeMetals Presentation_May_22_2024 .pdf
BeMetals Presentation_May_22_2024   .pdfBeMetals Presentation_May_22_2024   .pdf
BeMetals Presentation_May_22_2024 .pdfDerekIwanaka1
 
Memorandum Of Association Constitution of Company.ppt
Memorandum Of Association Constitution of Company.pptMemorandum Of Association Constitution of Company.ppt
Memorandum Of Association Constitution of Company.pptseri bangash
 
FINAL PRESENTATION.pptx12143241324134134
FINAL PRESENTATION.pptx12143241324134134FINAL PRESENTATION.pptx12143241324134134
FINAL PRESENTATION.pptx12143241324134134LR1709MUSIC
 
HR and Employment law update: May 2024.
HR and Employment law update:  May 2024.HR and Employment law update:  May 2024.
HR and Employment law update: May 2024.FelixPerez547899
 
Lookback Analysis
Lookback AnalysisLookback Analysis
Lookback AnalysisSafe PaaS
 

Recently uploaded (20)

Putting the SPARK into Virtual Training.pptx
Putting the SPARK into Virtual Training.pptxPutting the SPARK into Virtual Training.pptx
Putting the SPARK into Virtual Training.pptx
 
Global Interconnection Group Joint Venture[960] (1).pdf
Global Interconnection Group Joint Venture[960] (1).pdfGlobal Interconnection Group Joint Venture[960] (1).pdf
Global Interconnection Group Joint Venture[960] (1).pdf
 
Unveiling the Secrets How Does Generative AI Work.pdf
Unveiling the Secrets How Does Generative AI Work.pdfUnveiling the Secrets How Does Generative AI Work.pdf
Unveiling the Secrets How Does Generative AI Work.pdf
 
NewBase 24 May 2024 Energy News issue - 1727 by Khaled Al Awadi_compresse...
NewBase   24 May  2024  Energy News issue - 1727 by Khaled Al Awadi_compresse...NewBase   24 May  2024  Energy News issue - 1727 by Khaled Al Awadi_compresse...
NewBase 24 May 2024 Energy News issue - 1727 by Khaled Al Awadi_compresse...
 
falcon-invoice-discounting-a-premier-platform-for-investors-in-india
falcon-invoice-discounting-a-premier-platform-for-investors-in-indiafalcon-invoice-discounting-a-premier-platform-for-investors-in-india
falcon-invoice-discounting-a-premier-platform-for-investors-in-india
 
Taurus Zodiac Sign_ Personality Traits and Sign Dates.pptx
Taurus Zodiac Sign_ Personality Traits and Sign Dates.pptxTaurus Zodiac Sign_ Personality Traits and Sign Dates.pptx
Taurus Zodiac Sign_ Personality Traits and Sign Dates.pptx
 
20240425_ TJ Communications Credentials_compressed.pdf
20240425_ TJ Communications Credentials_compressed.pdf20240425_ TJ Communications Credentials_compressed.pdf
20240425_ TJ Communications Credentials_compressed.pdf
 
IPTV Subscription in Ireland: Elevating Your Entertainment Experience
IPTV Subscription in Ireland: Elevating Your Entertainment ExperienceIPTV Subscription in Ireland: Elevating Your Entertainment Experience
IPTV Subscription in Ireland: Elevating Your Entertainment Experience
 
Filing Your Delaware Franchise Tax A Detailed Guide
Filing Your Delaware Franchise Tax A Detailed GuideFiling Your Delaware Franchise Tax A Detailed Guide
Filing Your Delaware Franchise Tax A Detailed Guide
 
sales plan presentation by mckinsey alum
sales plan presentation by mckinsey alumsales plan presentation by mckinsey alum
sales plan presentation by mckinsey alum
 
Maximizing Efficiency Migrating AccountEdge Data to QuickBooks.pdf
Maximizing Efficiency Migrating AccountEdge Data to QuickBooks.pdfMaximizing Efficiency Migrating AccountEdge Data to QuickBooks.pdf
Maximizing Efficiency Migrating AccountEdge Data to QuickBooks.pdf
 
Equinox Gold Corporate Deck May 24th 2024
Equinox Gold Corporate Deck May 24th 2024Equinox Gold Corporate Deck May 24th 2024
Equinox Gold Corporate Deck May 24th 2024
 
April 2024 Nostalgia Products Newsletter
April 2024 Nostalgia Products NewsletterApril 2024 Nostalgia Products Newsletter
April 2024 Nostalgia Products Newsletter
 
Sustainability: Balancing the Environment, Equity & Economy
Sustainability: Balancing the Environment, Equity & EconomySustainability: Balancing the Environment, Equity & Economy
Sustainability: Balancing the Environment, Equity & Economy
 
Enterprise Excellence is Inclusive Excellence.pdf
Enterprise Excellence is Inclusive Excellence.pdfEnterprise Excellence is Inclusive Excellence.pdf
Enterprise Excellence is Inclusive Excellence.pdf
 
BeMetals Presentation_May_22_2024 .pdf
BeMetals Presentation_May_22_2024   .pdfBeMetals Presentation_May_22_2024   .pdf
BeMetals Presentation_May_22_2024 .pdf
 
Memorandum Of Association Constitution of Company.ppt
Memorandum Of Association Constitution of Company.pptMemorandum Of Association Constitution of Company.ppt
Memorandum Of Association Constitution of Company.ppt
 
FINAL PRESENTATION.pptx12143241324134134
FINAL PRESENTATION.pptx12143241324134134FINAL PRESENTATION.pptx12143241324134134
FINAL PRESENTATION.pptx12143241324134134
 
HR and Employment law update: May 2024.
HR and Employment law update:  May 2024.HR and Employment law update:  May 2024.
HR and Employment law update: May 2024.
 
Lookback Analysis
Lookback AnalysisLookback Analysis
Lookback Analysis
 

Hack in the Box Keynote 2006

  • 1. What application security tools vendors don’t want you to know and holes they will never find! Mark Curphey John Viega
  • 2.  
  • 3.  
  • 4.  
  • 5.  
  • 6.  
  • 7.  
  • 8.  
  • 9.  
  • 10.  
  • 11.  
  • 12.  
  • 13.  
  • 14.  
  • 15.  
  • 16.  
  • 17.  
  • 18.  
  • 19.  
  • 20.  
  • 21.  
  • 22.  
  • 23.  
  • 24.  
  • 25.  
  • 26.  
  • 27.  
  • 28.  
  • 29.  
  • 30.  
  • 31.  
  • 32.  
  • 33.  
  • 34.  
  • 35.  
  • 36.  
  • 37.  
  • 38.  
  • 39.  
  • 40.  
  • 41.  
  • 42. How Important is Context?
  • 43.  
  • 44.  
  • 45.  
  • 46.  
  • 47. Mozilla vs. Klocwork 611 “defects” 72 “vulnerabilities” 3 verified bugs 99.5% useless?
  • 48.  
  • 49.  
  • 50.  
  • 51. What kind of talk is this? Tools that try to find security holes in software Way for us to understand and rationalize why they are so bad and unlikely to get much better soon It is a realistic state of the union about the current state of application security technology and how it is being marketed and applied Dr. Holger Peine http://fhgonline.fraunhofer.de/server?suche-publica&num=048.06/D&iese (N.B. about overly generous quote to Cenzic) Arian Evans http://www.owasp.org/index.php/Image:AppSec2005DC-Arian_Evans_Tools-Taxonomy.ppt
  • 52.
  • 53.  
  • 54.  
  • 55.  
  • 56. How is security built in the real world?
  • 57.  
  • 58.  
  • 59.  
  • 60. How is security built in the real world?
  • 61. How is security built in the real world?
  • 62.  
  • 63. Implementation Bugs vs. Design Flaws
  • 64. Security Frame of Reference Name Description Configuration Management Configs, security managers, web server settings etc. Authentication Knowing users and entities are who they claim to be Authorization Who can do what to whom, TOCTOU etc. Data Protection (Transit & Storage) Encrypted passwords, on-wire protection, channel sinks, encrypted configuration files etc. Data Validation Valid, well formed, free of malicious payloads etc. Auditing and Logging Knowing who does what to whom etc. Error & Exception Handling What happens when the pooh hits the fan etc. User Management Password reset, registration, licensing etc.
  • 65.  
  • 66.
  • 67. Configuration Management ASP.NET application running in partial trust Revert.ToSelf(); Implementation Bug Design Flaw * good at many web server config issues Web App Scanners Hard coded connection string in configuration files Use of common crypto keys across Implemntations Hosted Environment
  • 68. Data Validation Implementation Bug Design Flaw Web App Scanners Canonicalization Internationalization Stored cross site scripting (even basic XSS in some cases) SQL injection (non ‘) Buffer overflows NOT HTTP 500’s! * Their strongest category
  • 69. Data protection Implementation Bug Design Flaw Web App Scanners Clear text passwords stored in database Weak algorithms * Reusing keys with stream ciphers Weak random number generators Secure memory management issues
  • 70. User Management Clear text passwords in the database Password expiry Password reset sent in clear Implementation Bug Design Flaw Web App Scanners Password generation on reset Weak session ID’s
  • 71. Grep: Lack of Context … strcpy(dst, src); // Generally a “high severity” error … strncpy(dst, src); // Generally a filtered out “low sev” …
  • 72. Grep: Lack of Context … // Generally a “high severity” error strcpy(dst, src); // Generally a “high severity” error … // Generally “low severity”, filtered out by default strncpy(dst, src, n); …
  • 73. Grep: Lack of Context void copy_20(char *src) { char dst[20]; int n; if (strlen(src) > 19) { return 0; } strcpy(dst, src); return strdup(dst); }
  • 74. Grep: Lack of Context void copy(char *dst, char *src) { int n = strlen(src); strncpy(dst, src, n); return strdup(dst); } … char d[20]; copy(d, arbitrary_user_input);
  • 75.
  • 76. Let’s try to do better with “real” static analysis!
  • 77.  
  • 78.
  • 79.
  • 80. alloc(ARGV) [0,max] alloc(B1) [100,100] len(ARGV) [0,max] len(B1) [0,0] alloc(B2) [100,100] len(B2) [0,0] 4 len(ARGV) -> len(B1) len(B2) -> len(B2) + 1 i [0,0] i <- i + 1
  • 81. alloc(ARGV) [0,max] alloc(B1) [100,100] len(ARGV) [0,max] len(B1) [0,0] alloc(B2) [100,100] len(B2) [0,0] 4 len(ARGV) -> len(B1) len(B2) -> len(B2) + 1 i [0,0] i <- i + 1
  • 82. alloc(ARGV) [0,max] alloc(B1) [100,100] len(ARGV) [0,max] len(B1) [0,max] alloc(B2) [100,100] len(B2) [0,0] 4 len(ARGV) -> len(B1) len(B2) -> len(B2) + 1 i [0,0] i <- i + 1
  • 83. alloc(ARGV) [0,max] alloc(B1) [100,100] len(ARGV) [0,max] len(B1) [0,max] alloc(B2) [100,100] len(B2) [0,1] 4 len(ARGV) -> len(B1) len(B2) -> len(B2) + 1 i [0,0] i <- i + 1
  • 84. alloc(ARGV) [0,max] alloc(B1) [100,100] len(ARGV) [0,max] len(B1) [0,max] alloc(B2) [100,100] len(B2) [0,1] 4 len(ARGV) -> len(B1) len(B2) -> len(B2) + 1 i [0,0] i <- i + 1
  • 85. alloc(ARGV) [0,max] alloc(B1) [100,100] len(ARGV) [0,max] len(B1) [0,max] alloc(B2) [100,100] len(B2) [0,max] 4 len(ARGV) -> len(B1) len(B2) -> len(B2) + 1 i [0,0] i <- i + 1
  • 86. alloc(ARGV) [0,max] alloc(B1) [100,100] len(ARGV) [0,max] len(B1) [0,max] alloc(B2) [100,100] len(B2) [0,max] 4 len(ARGV) -> len(B1) len(B2) -> len(B2) + 1 i [0,0] i <- i + 1
  • 87. alloc(ARGV) [0,max] alloc(B1) [100,100] len(ARGV) [0,max] len(B1) [0,max] alloc(B2) [100,100] len(B2) [0,max] 4 len(ARGV) -> len(B1) len(B2) -> len(B2) + 1 i [0,max] i <- i + 1
  • 88. alloc(ARGV) [0,max] alloc(B1) [100,100] len(ARGV) [0,max] len(B1) [0,max] alloc(B2) [100,100] len(B2) [0,max] Okay: no incoming edges to len(ARGV) RANGE OVERLAPS: B1 MAY OVERFLOW RANGE OVERLAPS: B2 MAY OVERFLOW
  • 89.
  • 90.
  • 91.
  • 92. A good analysis requires some understanding of control flow!
  • 93.
  • 94.
  • 95. Control Flow void main(int argc, char **argv) { char *b = malloc(100); int i; strcpy(b, “foo”); if(argc > 1 && len(argv[1]) < 100) strcpy(b, argv[1]); for (i=0;i<3;i++) strcat(b, “.”); } Entry argc: [0,max] others: nil alloc(b): 100
  • 96. Control Flow void main(int argc, char **argv) { char *b = malloc(100); int i; strcpy(b, “foo”); if(argc > 1 && len(argv[1]) < 100) strcpy(b, argv[1]); for (i=0;i<3;i++) strcat(b, “.”); } Entry argc: [0,max] others: nil alloc(b): 100 len(b): 4
  • 97. Control Flow void main(int argc, char **argv) { char *b = malloc(100); int i; strcpy(b, “foo”); if(argc > 1 && len(argv[1]) < 100) strcpy(b, argv[1]); for (i=0;i<3;i++) strcat(b, “.”); } Entry argc: [0,max] others: nil Write to B. Does it overflow? alloc(b): 100 len(b): 4
  • 98. Control Flow void main(int argc, char **argv) { char *b = malloc(100); int i; strcpy(b, “foo”); if(argc > 1 && len(argv[1]) < 100) strcpy(b, argv[1]); for (i=0;i<3;i++) strcat(b, “.”); } Entry argc: [0,max] others: nil No. At this node, B is alloc’d to 100, actual len of 4. alloc(b): 100 len(b): 4
  • 99. Control Flow B: alloc(100) B: len(4) void main(int argc, char **argv) { char *b = malloc(100); int i; strcpy(b, “foo”); if(argc > 1 && len(argv[1]) < 100) strcpy(b, argv[1]); for (i=0;i<3;i++) strcat(b, “.”); } Entry argc: [0,max] others: nil
  • 100. Control Flow void main(int argc, char **argv) { char *b = malloc(100); int i; strcpy(b, “foo”); if(argc > 1 && len(argv[1]) < 100) strcpy(b, argv[1]); for (i=0;i<3;i++) strcat(b, “.”); } True False Entry argc: [0,max] others: nil alloc(b): 100 len(b): 4
  • 101. Control Flow argc: [2, max] Entry argc: [0,max] others: nil void main(int argc, char **argv) { char *b = malloc(100); int i; strcpy(b, “foo”); if( argc > 1 && len(argv[1]) < 100) strcpy(b, argv[1]); for (i=0;i<3;i++) strcat(b, “.”); } True False alloc(b): 100 len(b): 4
  • 102. Control Flow argc: [2, max] len(argv): [0, 100] alloc(b): 100 len(b): 4 Entry argc: [0,max] others: nil void main(int argc, char **argv) { char *b = malloc(100); int i; strcpy(b, “foo”); if(argc > 1 && len(argv[1]) < 100 ) strcpy(b, argv[1]); for (i=0;i<3;i++) strcat(b, “.”); } True False
  • 103. Control Flow alloc(b): 100 len(b): 4 Entry argc: [0,max] others: nil void main(int argc, char **argv) { char *b = malloc(100); int i; strcpy(b, “foo”); if(argc > 1 && len(argv[1]) < 100) strcpy(b, argv[1]); for (i=0;i<3;i++) strcat(b, “.”); } True False argc: [2, max] len(argv): [0, 100] len(b): [0, 100]
  • 104. Control Flow alloc(b): 100 len(b): 4 Entry argc: [0,max] others: nil void main(int argc, char **argv) { char *b = malloc(100); int i; strcpy(b, “foo”); if(argc > 1 && len(argv[1]) < 100) strcpy(b, argv[1]); for (i=0;i<3;i++) strcat(b, “.”); } True False argc: [2, max] len(argv): [0, 100] len(b): [0, 100] No overflow. b is alloc’d to 100, len can be no more than 100 after null is added.
  • 105. Control Flow alloc(b): 100 len(b): 4 Entry argc: [0,max] others: nil void main(int argc, char **argv) { char *b = malloc(100); int i; strcpy(b, “foo”); if(argc > 1 && len(argv[1]) < 100) strcpy(b, argv[1]); for ( i=0 ;i<3;i++) strcat(b, “.”); } True False argc: [2, max] len(argv): [0, 100] len(b): [0, 100] i = 0
  • 106. Control Flow alloc(b): 100 len(b): 4 Entry argc: [0,max] others: nil void main(int argc, char **argv) { char *b = malloc(100); int i; strcpy(b, “foo”); if(argc > 1 && len(argv[1]) < 100) strcpy(b, argv[1]); for (i=0;i<3;i++) strcat(b, “.”); } True False argc: [2, max] len(argv): [0, 100] len(b): [0, 100] i = 0 len(b): [0, 100] Use the worst case assumption for the length of b.
  • 107. Control Flow alloc(b): 100 len(b): 4 Entry argc: [0,max] others: nil void main(int argc, char **argv) { char *b = malloc(100); int i; strcpy(b, “foo”); if(argc > 1 && len(argv[1]) < 100) strcpy(b, argv[1]); for (i=0;i<3;i++) strcat(b, “.”); } True False argc: [2, max] len(argv): [0, 100] len(b): [0, 100] i = 0 len(b): [0, 100] len(b): [0, 101]
  • 108. Control Flow alloc(b): 100 len(b): 4 Entry argc: [0,max] others: nil void main(int argc, char **argv) { char *b = malloc(100); int i; strcpy(b, “foo”); if(argc > 1 && len(argv[1]) < 100) strcpy(b, argv[1]); for (i=0;i<3;i++) strcat(b, “.”); } True False argc: [2, max] len(argv): [0, 100] len(b): [0, 100] i = 0 len(b): [0, 100] len(b): [0, 101] ERROR: len(b) > alloc(b)!!!
  • 109. Control Flow alloc(b): 100 len(b): 4 Entry argc: [0,max] others: nil True False argc: [2, max] len(argv): [0, 100] len(b): [0, 100] i = 0 len(b): [0, 100] len(b): [0, 101] Could show you the graph to help you debug…
  • 110. Control Flow alloc(b): 100 len(b): 4 Entry argc: [0,max] others: nil True False argc: [2, max] len(argv): [0, 100] len(b): [0, 100] i = 0 len(b): [0, 100] len(b): [0, 101] If you’re a rocket scientist  (graphs get big and complex in real programs)
  • 111.
  • 112.
  • 113.
  • 114. Issue 1 void main(int argc, char **argv) { char *b = malloc( 100000 ); int n = argc; for (i=0;i<n;i++) strcat(b, “.”); }
  • 115. Issue 1 void main(int argc, char **argv) { char *b = malloc(100000); int n = argc; for (i=0;i<n;i++) strcat(b, “.”); } In a more complex example, would we really have to “run” the loop MAX_INT times?
  • 116. Issue 1 void main(int argc, char **argv) { char *b = malloc(100000); int n = argc; for (i=0;i<n;i++) strcat(b, “.”); } In this case, we could multiply the effect by the maximum value of n.
  • 117. Issue 1 void main(int argc, char **argv) { char *b = malloc(100000); int n = argc; for (i=0;i<n;i++) strcat(b, “.”); } More complex cases aren’t that easy, and require approximations!
  • 118. Issue 2 alloc(b): 100 len(b): 4 Entry argc: [0,max] others: nil True False argc: [2, max] len(argv): [0, 100] len(b): [0, 100] i = 0 len(b): [0, 100] We lost accuracy when we merged.
  • 119. Issue 2 alloc(b): 100 len(b): 4 Entry argc: [0,max] others: nil True False argc: [2, max] len(argv): [0, 100] len(b): [0, 100] i = 0 len(b): [0, 101] i = 0 len(b): 4
  • 120. Issue 2 alloc(b): 100 len(b): 4 Entry argc: [0,max] others: nil True False argc: [2, max] len(argv): [0, 100] len(b): [0, 100] i = 0 We can show which path is bad! And, future calculations become much more accurate. len(b): [0, 101] i = 0 len(b): 4
  • 121. Issue 2 alloc(b): 100 len(b): 4 Entry argc: [0,max] others: nil True False argc: [2, max] len(argv): [0, 100] len(b): [0, 100] i = 0 len(b): [0, 101] i = 0 len(b): 4 An exponential explosion of nodes Only feasible for single functions (intraprocedural analysis)
  • 122. Issue 2 alloc(b): 100 len(b): 4 Entry argc: [0,max] others: nil True False argc: [2, max] len(argv): [0, 100] len(b): [0, 100] i = 0 len(b): [0, 101] i = 0 len(b): 4 Full path analysis is even less feasible when we consider exits from complex loops
  • 123. The problem with intraprocedural char *magic_function(char *a, char *b) { char *p1 = a; char *p2 = b; while (*p2) *p1++ = *p2++; return a; }
  • 124. The problem with intraprocedural char *magic_function(char *a, char *b) { char *p1 = a; char *p2 = b; while (*p2) *p1++ = *p2++; return a; } No matter how accurate we get inside the procedure, we are in a catch-22 (spam vs. ignore)
  • 125. The problem with intraprocedural char *magic_function(char *a, char *b) { char *p1 = a; char *p2 = b; while (*p2) *p1++ = *p2++; return a; } Instead of erroring, we can “summarize” the generic properties.
  • 126. The problem with intraprocedural char *magic_function(char *a, char *b) { char *p1 = a; char *p2 = b; while (*p2) *p1++ = *p2++; return a; } e.g., len(a) <- len(b)
  • 127. The problem with intraprocedural char *magic_function(char *a, char *b) { char *p1 = a; char *p2 = b; while (*p2) *p1++ = *p2++; return a; } Scaling algorithms to an entire program can greatly improve accuracy… and decrease efficiency!
  • 128.
  • 129.
  • 130.
  • 131. Everybody gets this right… for the wrong reasons secureConnect (host, port): s = sslConnect(gethostbyaddr(host), port) cert = get_cert(s) if ! certSignedByTrustedRoot(cert): raise “SSLError” if cert.DN <> host: raise “SSLError” if ! subjAltNameMatches(cert, host): raise “SSLError” if certRevoked(cert): raise “SSLError” return s
  • 132. If you’re not an auditor, it probably isn’t cost effective!
  • 133. Notes on Buying Automated Tools Trials are limited for a reason (as are the EULA’s) Make sure you test them on your own site / code
  • 134. “ The height of mediocrity is still low” Basic Conclusion
  • 135. Accuracy on basic software today is mediocre at best It is really easy to write an application that can’t be automatically scanned It is really hard to write an automated scanner than can effectively analyze software Basic Conclusion
  • 136.  
  • 137. PCI Data Security Standards
  • 138.  
  • 139. 6.6 Ensure that all web-facing applications are protected against known attacks by applying either of the following methods: • Having all custom application code reviewed for common vulnerabilities by an organization that specializes in application security • Installing an application layer firewall in front of web-facing applications.   Note: This method is considered a best practice until June 30, 2008, after which it becomes a requirement.   Full document at https://www.pcisecuritystandards.org/tech/download_the_pci_dss.htm PCI-DSS is now managed by an industry consortium at www.pcisecuritystandards.org
  • 140. …… or go straight to the document here! https://www.pcisecuritystandards.org/pdfs/pci_dss_v1-1.pdf
  • 141.  
  • 142. Introducing the only tool in the world that really works effectively today……
  • 143.  
  • 144. News for people who run tools
  • 145. A fool with a tool … .is still a fool
  • 146. China!
  • 147. China!
  • 148. China!
  • 150.
  • 151.
  • 152.