
|
More Information
Book
Description
"The
security of information systems has not improved at a rate consistent
with the growth and sophistication of the attacks being made against
them. To address this problem, we must improve the underlying
strategies and techniques used to create our systems. Specifically, we
must build security in from the start, rather than append it as an
afterthought. That's the point of Secure Coding in C
and C++. In
careful detail, this book shows software developers how to build
high-quality systems that are less vulnerable to costly and even
catastrophic attack. It's a book that every developer should read
before the start of any serious project."
--Frank
Abagnale, author, lecturer, and leading consultant on fraud prevention
and secure documents
Learn the
Root Causes of Software Vulnerabilities and How to Avoid Them
Commonly
exploited software vulnerabilities are usually caused by avoidable
software defects. Having analyzed nearly 18,000 vulnerability reports
over the past ten years, the CERT/Coordination Center (CERT/CC) has
determined that a relatively small number of root causes account for
most of them. This book identifies and explains these causes and shows
the steps that can be taken to prevent exploitation. Moreover, this
book encourages programmers to adopt security best practices and
develop a security mindset that can help protect software from
tomorrow's attacks, not just today's.
Drawing on
the CERT/CC's
reports and conclusions, Robert Seacord systematically identifies the
program errors most likely to lead to security breaches, shows how they
can be exploited, reviews the potential consequences, and presents
secure alternatives.
Coverage
includes technical detail on how to
- Improve the overall security of any C/C++ application
- Thwart buffer overflows and stack-smashing attacks that
exploit insecure string manipulation logic
- Avoid vulnerabilities and security flaws resulting from the
incorrect use of dynamic memory management functions
- Eliminate integer-related problems: integer overflows, sign
errors, and truncation errors
- Correctly use formatted output functions without
introducing format-string vulnerabilities
- Avoid I/O vulnerabilities, including race conditions
Secure
Coding in C and C++ presents hundreds of examples of secure code,
insecure code, and exploits, implemented for Windows and Linux. If
you're responsible for creating secure C or C++ software--or for
keeping it safe--no other book offers you this much detailed, expert
assistance.
Table
of Contents
Foreword.
Preface.
About the Author.
1. Running with Scissors.
Gauging the Threat
Security Concepts
C and C++
Development Platforms
Summary
Further Reading
2. Strings.
String Characteristics
Common String Manipulation Errors
String Vulnerabilities
Process Memory Organization
Stack Smashing
Code Injection
Arc Injection
Mitigation Strategies
Notable Vulnerabilities
Summary
Further Reading
3. Pointer Subterfuge.
Data Locations
Function Pointers
Data Pointers
Modifying the Instruction Pointer
Global Offset Table
The .dtors Section
Virtual Pointers
The atexit() and on_exit() Functions
The longjmp() Function
Exception Handling
Mitigation Strategies
Summary
Further Reading
4. Dynamic Memory Management.
Dynamic Memory Management
Common Dynamic Memory Management
Errors
Doug Lea's Memory Allocator
RtlHeap
Mitigation Strategies
Notable Vulnerabilities
Summary
Further Reading
5. Integer Security.
Integers
Integer Conversions
Integer Error Conditions
Integer Operations
Vulnerabilities
Nonexceptional Integer Logic Errors
Mitigation Strategies
Notable Vulnerabilities
Summary
Further Reading
6. Formatted Output.
Variadic Functions
Formatted Output Functions
Exploiting Formatted Output Functions
Stack Randomization
Mitigation Strategies
Notable Vulnerabilities
Summary
Further Reading
7. File I/O.
Concurrency
Time of Check, Time of Use
Files as Locks and File Locking
File System Exploits
Mitigation Strategies
Summary
8. Recommended Practices.
Secure Software Development
Principles
Systems Quality Requirements
Engineering
Threat Modeling
Use/Misuse Cases
Architecture and Design
Off-the-Shelf Software
Compiler Checks
Input Validation
Data Sanitization
Static Analysis
Quality Assurance
Memory Permissions
Defense in Depth
TSP-Secure
Summary
Further Reading
References.
Acronyms.
Index.
Preface
The CERT Coordination Center (CERT/CC) was formed by the
Defense Advanced Research Projects Agency (DARPA) in November 1988 in
response to the Morris worm incident, which brought ten percent of
Internet systems to a halt in November 1988. The CERT/CC is located in
Pittsburgh, Pennsylvania, at the Software Engineering Institute (SEI),
a federally funded research and development center sponsored by the
U.S. Department of Defense.
The initial focus of the CERT/CC was incident response and
analysis. Incidents include successful attacks such as compromises and
denial of service, as well as attack attempts, probes, and scans. Since
1988, the CERT/CC has received more than 22,665 hotline calls reporting
computer security incidents or requesting information, and has handled
more than 319,992 computer security incidents. The number of incidents
reported each year continues to grow.
Responding to incidents, while necessary, is insufficient to
secure the Internet and interconnected information systems. Analysis
indicates that the majority of incidents are caused by trojans, social
engineering, and the exploitation of software vulnerabilities,
including software defects, design decisions, configuration decisions,
and unexpected interactions between systems. The CERT/CC monitors
public sources of vulnerability information and regularly receives
reports of vulnerabilities. Since 1995, more than 16,726
vulnerabilities have been reported. When a report is received, the
CERT/CC analyzes the potential vulnerability and works with technology
producers to inform them of security deficiencies in their products and
to facilitate and track their response to those problems.
Similar to incident reports, vulnerability reports continue to
grow at an alarming rate. While managing vulnerabilities pushes the
process upstream, it is again insufficient to address the issues of
Internet and information system security. To address the growing number
of both vulnerabilities and incidents, it is increasingly apparent that
the problem must be attacked at the source by working to prevent the
introduction of software vulnerabilities during software development
and ongoing maintenance. Analysis of existing vulnerabilities indicates
that a relatively small number of root causes account for the majority
of vulnerabilities. The goal of this book is to educate developers
about these root causes and the steps that can be taken so that
vulnerabilities are not introduced.
Audience
Secure Coding in C and C++ should be useful to anyone
involved in the development or maintenance of software in C and C++.
- For a C/C++ programmer, this book will teach you
how to identify common programming errors that result in software
vulnerabilities, understand how these errors are exploited, and
implement a solution in a secure fashion.
- For a software project manager, this book
identifies the risks and consequences of software vulnerabilities to
guide investments in developing secure software.
- For a computer science student, this book will
teach you programming practices that will help you to avoid developing
bad habits and enable you to develop secure programs during your
professional career.
- For a security analyst, this book provides a
detailed description of common vulnerabilities, identifies ways to
detect these vulnerabilities, and offers practical avoidance strategies.
Organization and Content
Secure Coding in C and C++ provides practical advice on
secure practices in C and C++ programming. Producing secure programs
requires secure designs. However, even the best designs can lead to
insecure programs if developers are unaware of the many security
pitfalls inherent in C and C++ programming. This book provides a
detailed explanation of common programming errors in C and C++ and
describes how these errors can lead to code that is vulnerable to
exploitation. The book concentrates on security issues intrinsic to the
C and C++ programming languages and associated libraries. It does not
emphasize security issues involving interactions with external systems
such as databases and web servers, as these are rich topics on their
own. The intent is that this book be useful to anyone involved in
developing secure C and C++ programs regardless of the specific
application.
Secure Coding in C and C++ is organized around
functional capabilities commonly implemented by software engineers that
have potential security consequences, such as formatted output and
arithmetic operations. Each chapter describes insecure programming
practices and common errors that can lead to vulnerabilities, how these
programming flaws can be exploited, the potential consequences of
exploitation, and secure alternatives. Root causes of software
vulnerabilities, such as buffer overflows, integer type range errors,
and invalid format strings, are identified and explained where
applicable. Strategies for securely implementing functional
capabilities are described in each chapter, as well as techniques for
discovering vulnerabilities in existing code.
This book contains the following chapters:
- Chapter 1 provides an overview of the problem,
introduces security terms and concepts, and provides insight as to why
so many vulnerabilities are found in C and C++ programs.
- Chapter 2 describes string manipulation in C and
C++, common security flaws, and resulting vulnerabilities including
buffer overflow and stack smashing. Both code and arc injection
exploits are examined.
- Chapter 3 introduces arbitrary memory write
exploits that allows an attacker to write a single address to any
location in memory. This chapter describes how these exploits can be
used to execute arbitrary code on a compromised machine.
Vulnerabilities resulting from arbitrary memory writes are
discussed in later chapters.
- Chapter 4 describes dynamic memory management.
Dynamically allocated buffer overflows, writing to freed memory, and
double-free vulnerabilities are described.
- Chapter 5 covers integral security issues (security
issues dealing with integers) including integer overflows, sign errors,
and truncation errors.
- Chapter 6 describes the correct and incorrect use of
formatted output functions. Both format string and buffer overflows
vulnerabilities resulting from the incorrect use of these functions are
described.
- Chapter 7 describes common vulnerabilities
associated with file I/O including race conditions and time of
creation, time of use (TOCTOU) vulnerabilities.
- Chapter 8 recommends specific development practices
for improving the overall security of your C / C++ application. These
recommendations are in addition to the recommendations included in each
chapter for addressing specific vulnerability classes.
Secure Coding in C and C++ contains hundreds of
examples of secure and insecure code as well as sample exploits. Almost
all of these examples are in C and C++, although comparisons are drawn
with other languages. The examples are implemented for Windows and
Linux operating systems. Unless otherwise stated, Microsoft Windows
examples are compiled using Visual C++ .NET and tested on Windows 2000
Professional platform with an Intel Pentium 4 processor while Linux
examples are compiled with GNU gcc/g++ and tested running Red Hat Linux
9 on an Intel Pentium 4 processor.
While the specific examples have typically been compiled and
tested in one or more of these environments, vulnerabilities are
evaluated to determine whether they are specific to or generalizable
across compiler version, operating system, microprocessor, applicable C
or C++ standards, little or big endian architectures, and execution
stack architecture.
This book focuses on programming flaws in C and C++ that are
the most common causes of software vulnerabilities. However, because of
size and space constraints, not every potential source of
vulnerabilities is covered. Vulnerabilities discussed in the book are
also cross-referenced with real-world examples from the US-CERT
Vulnerability Notes Database at www.kb.cert.org/vuls/.
Sample Chapter
Foreword
Download
the Foreword.
Index
Download the Index
file.
|