Model Checking One Million Lines of C Code Hao Chen, UC Berkeley Drew Dean, SRI International David Wagner, UC Berkeley.
Download ReportTranscript Model Checking One Million Lines of C Code Hao Chen, UC Berkeley Drew Dean, SRI International David Wagner, UC Berkeley.
Model Checking One Million Lines of C Code Hao Chen, UC Berkeley Drew Dean, SRI International David Wagner, UC Berkeley 1 MOPS (MOdel checking Programs for Security properties) • A static analysis tool that checks source programs for temporal safety properties. e.g. a setuid-root program must drop privilege before making risky system calls. • Analysis – Pushdown model checking – Inter-procedural – Control flow centric 2 The MOPS process Safety Property FSA C Program Parser CFG FSA: finite state automaton CFG: control flow graph Model Checker Program satisifes safety property Error Traces Treat the model checker as a black box for this talk 3 Is software model checking ready for prime time? • Can model checking be used by open source developers to find security vulnerabilities? • Criteria for a successful tool – It is useful • Can check many properties • Can check diverse, widely-deployed programs • Requires moderate computational resources – It is usable • Can be used easily by non-tool developers • Can generate comprehensible error reports 4 Outline • Experiment – Programs: 8 widely-deployed programs, with over 1 million LOC – Properties: 5 security-related properties • Findings – More than a dozen vulnerabilities and weaknesses • Usability improvements • Conclusion 5 Programs Program Apache HTTPD 2.0.40-21 At 3.1.8-33 Lines of Code (LOC) 229K 6K BIND 9.2.1-16 279K OpenSSH 3.5p1-6 59K Postfix 1.1.11-11 94K Samba 2.2.7a-7.9.0 254K Sendmail 8.12.8-4 222K VixieCron 3.0.1-74 4K Total 1147K 6 Security properties • • • • Drop privilege completely when needed Avoid stderr vulnerability Avoid race condition (TOCTTOU) Create chroot-jail safely – chdir(“/”) must follow chroot() immediately • Create temporary files safely – Use only the safe function mkstemp() – Never reuse filename in mkstemp(filename) 7 Property: drop privilege completely • Setuid-root programs should drop root privilege completely – before executing an untrusted program via system(), popen(), execvp() and friends, or – when the program intends to do so • Otherwise, the remaining privilege may be exploited by – the untrusted program that is executed – malicious code injected via buffer overrun attacks 8 Vulnerability: fail to drop privilege completely OpenSSH client (in readpass.c) seteuid(getuid()); setuid(getuid()); … execlp(askpass, askpass, msg, (char *) 0); … 9 What is wrong? OpenSSH 3.5 on OpenBSD R≠0, E=S=0 seteuid(getuid()) R=E≠0, S=0 setuid(getuid()) R=E=S≠0 OpenSSH 3.5 on Linux R≠0, E=S=0 OpenSSH 2.5.2 on Linux R≠0, E=S=0 seteuid(getuid()) R=E≠0, S=0 setuid(getuid()) R=E≠0, S=0 setuid(getuid()) R=E=S≠0 10 Potential Vulnerability • Weaknesses – ssh: fails to drop privilege before executing a user program – ssh-keysign: fails to drop privilege before doing complex cryptographic operations • A buffer overrun would allow the attacker to regain root privilege in euid. 11 Property: drop privilege completely Package LOC Running Time # Error Traces Real Bugs Total Sendmail 222K 0:12 0 0 Postfix 94K 0:17 0 2 OpenSSH 59K 0:23 2 8 Apache 229K 0:45 1 4 BIND 279K 0:53 0 1 At 6K 0:05 0 0 Cron 4K 0:05 0 0 Samba 254K 1:53 0 5 12 Vulnerability: stderr exploits in at Code Standard File Descriptors stdin stdout stderr tty attack.c at.c tty tty close(1); close(2); tty <closed> <closed> execl(“at”, …); tty <closed> <closed> open(LFILE, O_WRONLY); tty LFILE <closed> fd = open(atfile, O_CREAT); tty LFILE atfile Rule: No setuid-root program may open a file for writing to stderr 13 Property: stderr vulnerability Package LOC Running Time # Error Traces Real Bugs Total Sendmail 222K 14:12 0 3 Postfix 94K 0:46 0 1 OpenSSH 59K 0:58 1 2 Apache 229K 0:14 1 1 BIND 279K 0:00 0 0 At 6K 0:04 1 1 Cron 4K 0:05 2 2 Samba 254K 0:58 1 1 14 Summary of Findings Program Errors (All Properties) Real Total Apache HTTPD 2 6 At 1 7 BIND 0 4 OpenSSH 5 24 Postfix 0 6 Samba 2 8 Sendmail 0 11 VixieCron 3 4 13 70 Total 15 Outline • Experiment – Programs: 8 widely-deployed programs, with over 1 million LOC – Properties: 5 security-related properties • Findings – More than a dozen vulnerabilities and weaknesses • Usability improvements • Conclusion 16 Usability improvement 1: Make it really easy to run! • Problems – Packages have different build processes – Tool has to be manually configured for each package • Solution – Provide a script that integrates model checking into the build processes of packages automatically – Result: allow the user to run the tool as simple as mops –m setuid.fsa openssh-3.5p1-6.src.rpm 17 Integrating MOPS into Software Build Processes • 1st attempt: manually edit Makefiles – Too complicated; does not survive autoconf • 2nd attempt: setenv GCC_EXEC_PREFIX to run MOPS instead of gcc – Build processes generate & run code • 3rd attempt: build CFG & machine code – Dangling CFGs; links to object files broken • 4th attempt: Put CFGs into ELF files – Solves all identified problems! 18 Usability improvement 2: report comprehensible error messages • Problem – One bug may trigger many error traces – The user has to review all the traces manually • Criteria for good error trace reporting – Reporting one error trace per bug – Reporting shortest error traces 19 Algorithm 1. Find the shortest error trace t and output it 2. Find the crucial statement s on t, i.e. the first statement that causes an error on t 3. Prune s from the program 4. If the program still has error traces, go to step 1 20 Criteria for good tools: revisited • It is useful – Can check many properties – Can check diverse, widely-deployed programs – Requires moderate computational resources • It is usable – Can be used easily by non-tool developers – Can generate comprehensible error reports 21 Conclusion • Model checking is ready for prime time use by open source developers to find security vulnerabilities! • We believe that our experience would transfer to other similar tools as well. • Work in progress: check all 839 RPM packages in RedHat Linux 9 22