To find format string bugs, we use a type qualifier system with two qualifiers, tainted and untainted. We mark the types of values that can be controlled by an untrusted adversary with tainted. All other values are given types marked untainted. This is similar to the concept of tainting in Perl [32,42].
Intuitively, cqual extends the type system of C to work over
qualified types, which are the combination of some number of
type qualifiers with a standard C type. We allow type qualifiers to
appear on every level of a type. Examples of qualified types are
,
,
(a
pointer to an untainted character), and
(an
untainted pointer to a character).
The key idea behind our framework is that type qualifiers naturally
induce a subtyping relationship on qualified types. The
notion of subtyping most commonly appears in object-oriented
programming. In Java, for example, if B is a subclass of A (which we
will write ), then an object of class B can be used wherever
an object of class A is expected.
Consider the following example program:
(1) |
|
Now consider another program:
(2) |
|
Putting these two examples together, we have the following subtyping relation: