Model Checking an Entire Linux Distribution for Security Violations

Model Checking an Entire Linux Distribution for Security Violations

Model Checking An Entire Linux Distribution for Security Violations Benjamin Schwarz Hao Chen David Wagner fbschwarz, hchen, [email protected] Geoff Morrison Jacob West fgmorrison, [email protected] Jeremy Lin ([email protected]) Wei Tu ([email protected]) University of California, Berkeley Abstract and use MOPS to decide which programs violate the prop- erty. We have developed six security properties—expressed Software model checking has become a popular tool for as finite state automata (FSAs)—and refined them to min- verifying programs’ behavior. Recent results suggest that it imize false positives while preserving high effectiveness. is viable for finding and eradicating security bugs quickly. These properties aim at finding security bugs that arise from However, even state-of-the-art model checkers are limited the misuse of system calls, often vulnerable interaction in use when they report an overwhelming number of false among these calls. For example, time-of-check-to-time-of- positives, or when their lengthy running time dwarfs other use (TOCTTOU) bugs involve a sequence of two or more software development processes. In this paper we report system calls acting on the same file (see Section 3.1). our experiences with software model checking for security Our primary contribution is the scale of our experiment. properties on an extremely large scale—an entire Linux dis- We ran MOPS on the entire Red Hat Linux 9 distribution, tribution consisting of 839 packages and 60 million lines of which contains 839 packages totaling 60.0 million lines code. To date, we have discovered 108 exploitable bugs. of code (counting total lines in all .h, .c, and .cc files). Our results indicate that model checking can be both a fea- MOPS successfully analyzed 87% (732) of these packages; sible and integral part of the software development process. the remaining 107 packages could not be analyzed because MOPS's parser cannot parse some files in these packages1. To the best of our knowledge, our experiment is the largest 1 Introduction security audit of software using automated tools reported in the literature. Model checking at this scale introduces major Software bugs are frequent sources of security vulnera- challenges in error reporting, build integration, and scalabil- bilities. Moreover, they can be incredibly difficult to track ity. Many of these technical challenges have been addressed down. Automated detection of possible security violations in our work; we show how to surmount them, and demon- has become a quickly-expanding area, due in part to the ad- strate that model checking is feasible and effective even for vent of model checking tools that can analyze millions of very large software systems. lines of code [5]. One may argue that the bottleneck is As part of this experiment, we have worked out how to no longer the computer, which runs the model checker, but express several new security properties in a form that can be rather the human, who specifies secure and insecure behav- readily model checked by existing tools. Earlier work de- iors of programs and identifies bugs based on the output veloped simple versions of some of these properties [5], but from the model checker. For this reason, model checkers in the process of applying them at scale we discovered that that are intended to be used on real-world programs on a major revisions and refinements were necessary to capture large scale should allow users to describe properties easily the full breadth of programming idioms seen in the wild. and should report errors concisely. Some of the properties checked in this paper are novel; for In this paper we describe our experience using MOPS, instance, we introduce a TOCTTOU property that turned a static analyzer, to verify security properties in an entire out to be very effective in finding bugs. In our experiments, Linux distribution. We use the following recipe for finding 1 security bugs: identify an important class of security vul- The parser failed on 73 packages because they contain C++ code (the parser currently parses only C programs, although we are developing a nerabilities, specify a temporal safety property expressing new C++ parser), and on 34 packages because they contain certain C99 the condition when programs are free of this class of bugs, constructs. we focused on finding bugs rather than proving their ab- f(X) g(X) sence. Verification is difficult, especially since MOPS is not completely sound because it does not yet analyze func- tion pointers and signals. However, we expect that our tech- niques could point the way to formal verification of the ab- sence of certain classes of bugs, as better model checkers are developed in the future. Figure 1. An FSA illustrating the use of pat- The technical contributions of this paper are threefold: 1) tern variables. We show how to express six important security properties in a form that can be model checked by off-the-shelf tools; 2) a real security hole. We report on practical experience with model checking at a very large scale, and demonstrate for the first time that Specification of Security Properties. MOPS provides a these approaches are feasible and useful; 3) We measure custom property language for specifying security proper- the effectiveness of MOPS on a very large corpus of code, ties. The MOPS user describes each security-relevant op- characterizing the false positive and bug detection rates for eration using a syntactic pattern similar to a program's ab- different classes of security bugs. stract syntax tree (AST). With wildcards, these patterns can Section 2 provides an overview of MOPS and the chal- describe fairly general or complex syntactic expressions in lenges in handling such a large number of diverse programs. the program. The user then labels each FSA transition us- Section 3 describes our security properties and the bugs that ing a pattern: if the pattern matches an AST in the program we have found in checking these properties. Section 4 re- during model checking, the FSA takes this transition. views related work in model checking, software verifica- To extend the expressiveness of these patterns, we intro- tion, and security. We conclude in Section 5. MOPS is duced pattern variables, which can describe repeated oc- freely available from mopscode.sourceforge.net. currences of the same syntactic expression. For instance, if X denotes an pattern variable, the pattern f(X; X) matches f 2 The MOPS Model Checker any call to the function with two syntactically identical ar- guments. In any error trace accepted by an FSA, the pattern variable X has a single, consistent instantiation throughout MOPS is a static (compile time) analysis tool that model the trace. checks whether programs violate security properties [6]. Formally, let Σ denote the set of ASTs. We may view a Given a security property—expressed as a finite-state au- program trace as a string in Σ∗, and a property B as a reg- tomaton (FSA) by the user—and the source code for a ular language on Σ∗.2 Pattern variables provide existential program, MOPS determines whether any execution path quantification over the set of ASTs. For instance, the pattern through the program might violate the security property. 9X:f(X; X) matches any call to f whose two arguments, In more detail, the MOPS process works as follows. once parsed, yield the same syntax subtree. If B(X) is a First, the user identifies a set of security-relevant operations language with an unbound pattern variable X, the language (e.g., a set of system calls relevant to the desired property). 9X:B(X) accepts any trace t 2 Σ∗ where there exists an Then, the user finds all the sequences of these operations AST A0 so that B(A0) accepts t. In other words, if L(B) that violate the property, and encodes them using an FSA. denotes the set of error traces accepted by the language B, 0 Meanwhile, any execution of a program defines a trace, the we define L(9X:B(X)) = [A0 L(B(A )). We use the con- sequence of security-relevant operations performed during vention that unbound pattern variables are implicitly exis- that execution. MOPS uses the FSA to monitor program ex- tentially quantified at the outermost scope. ecution: as the program executes a security-relevant opera- For instance, the FSA shown in Figure 1 accepts tion, the FSA transitions to a new state. If the FSA enters an any trace containing a call to f followed by a call error state, the program violates the security property, and to g with the same syntactic argument. This property this execution defines an error trace. would accept traces such as hf(0); g(0)i, hf(a); g(a)i, or At its core, MOPS determines whether a program con- hf(0); f(1); h(3); g(1)i as error traces, but not hf(0); g(1)i. tains any feasible traces (according to the program's source See Appendix A for the algorithm we use to implement pat- code) that violate a security property (according to the tern variables. FSA). Since this question is generally undecidable, MOPS errs on the conservative side: MOPS will catch all the bugs Scalability. Since we aim at analyzing hundreds of large, for this property (in other words, it is sound, subject to real application, MOPS must be scalable in several senses. certain requirements [6]), but it might also report spuri- First, MOPS must run quickly on large programs. Second, ous warnings. This requires the user to determine manu- 2Because the property can be described by an FSA, it is a regular lan- ally whether each error trace reported by MOPS represents guage.

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    19 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us