This thesis contributes to three research areas in software security, namely security requirements and intrusion prevention via static analysis and runtime detection.We have investigated current practice in security requirements by doing a field study of eleven requirement specifications on IT systems. The conclusion is that security requirements are poorly specified due to three things: inconsistency in the selection of requirements, inconsistency in level of detail, and almost no requirements on standard security solutions. A follow-up interview study addressed the reasons for the inconsistencies and the impact of poor security requirements. It shows that the projects had relied heavily on in-house security competence and that mature producers of software compensate for poor requirements in general but not in the case of security and privacy requirements specific to the customer domain.Further, we have investigated the effectiveness of five publicly available static analysis tools for security. The test results show high rates of false positives for the tools building on lexical analysis and low rates of true positives for the tools building on syntactical and semantical analysis. As a first step toward a more effective and generic solution we propose decorated dependence graphs as a way of modeling and pattern matching security properties of code. The models can be used to characterize both good and bad programming practice as well as visually explain code properties to programmers. We have implemented a prototype tool that demonstrates how such models can be used to detect integer input validation flaws.Finally, we investigated the effectiveness of publicly available tools for runtime prevention of buffer overflow attacks. Our initial comparison showed that the best tool as of 2003 was effective against only 50 % of the attacks and there were six attack forms which none of the tools could handle. A follow-up study includes the release of a buffer overflow testbed which covers 850 attack forms. Our evaluation results show that the most popular, publicly available countermeasures cannot prevent all of these buffer overflow attack forms.
[1]
Leslie Lamport,et al.
Proving the Correctness of Multiprocess Programs
,
1977,
IEEE Transactions on Software Engineering.
[2]
David A. Wheeler,et al.
Secure Programming for Linux and Unix HOWTO
,
2003
.
[3]
Dawson R. Engler,et al.
Using programmer-written compiler extensions to catch security holes
,
2002,
Proceedings 2002 IEEE Symposium on Security and Privacy.
[4]
David A. Wagner,et al.
MOPS: an infrastructure for examining security properties of software
,
2002,
CCS '02.
[5]
John Wilander,et al.
Modeling and Visualizing Security Properties of Code using Dependence Graphs
,
2005
.
[6]
David W. Binkley,et al.
Program slicing
,
2008,
2008 Frontiers of Software Maintenance.
[7]
Brian Chess,et al.
Improving computer security using extended static checking
,
2002,
Proceedings 2002 IEEE Symposium on Security and Privacy.
[8]
David W. Binkley,et al.
Interprocedural slicing using dependence graphs
,
1990,
TOPL.
[9]
David S. Johnson,et al.
Computers and Intractability: A Guide to the Theory of NP-Completeness
,
1978
.
[10]
Michael Howard,et al.
Reviewing Code for Integer Manipulation Vulnerabilities
,
2003
.
[11]
Dawson R. Engler,et al.
Some Lessons from Using Static Analysis and Software Model Checking for Bug Finding
,
2003,
SoftMC@CAV.
[12]
Benjamin Livshits,et al.
Tracking pointers with path and context sensitivity for bug detection in C programs
,
2003,
ESEC/FSE-11.
[13]
Karl J. Ottenstein,et al.
The program dependence graph in a software development environment
,
1984,
SDE 1.
[14]
M. Weber,et al.
A case study in detecting software security vulnerabilities using constraint optimization
,
2001,
Proceedings First IEEE International Workshop on Source Code Analysis and Manipulation.