35
CAP6135: Malware and Software Vulnerability Analysis Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

CAP6135: Malware and Software Vulnerability Analysis Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

  • Upload
    willow

  • View
    44

  • Download
    0

Embed Size (px)

DESCRIPTION

CAP6135: Malware and Software Vulnerability Analysis Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012. Acknowledgement. This lecture is modified based on the lecture notes from: Dr. Dawn Song: CS161: computer security Dr. Erik Poll : software security. Review. - PowerPoint PPT Presentation

Citation preview

Page 1: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

CAP6135: Malware and Software Vulnerability Analysis

Program Verification & Other Types ofVulnerabilities

Cliff Zou

Spring 2012

Page 2: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

2

Acknowledgement This lecture is modified based on the

lecture notes from: Dr. Dawn Song: CS161: computer security Dr. Erik Poll : software security

Page 3: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

3

Review

Memory safety vulnerability Buffer overflow Format string Integer overflow

Runtime detection Stack Guard, randomization, etc

Fuzzing for bug finding Blackbox fuzzing Whitebox fuzzing Graybox fuzzing

Page 4: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

4

This Class

Program verification

Other types of vulnerabilities

Page 5: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

5

Static Analysis Instead of running the code to detect attacks or find

bugs, we statically analyze code Simple pattern match:

Whether program uses unsafe APIs: gets, sprintf, etc. Simple checks:

E.g., variable use before def or initialization, double free, null terminator, etc.

More sophisticated analysis E.g., potential array-out-of-bounds check

Many tools available Open source:

http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis

Commercial tools: Coverity, Fortify, etc.

Page 6: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

6

Program Verification

Can we prove a program free of buffer overflows?

How to prove a program free of buffer overflows? Precondition Postcondition Loop invariants

Page 7: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

7

Precondition Functions make certain assumptions about their

arguments Caller must make sure assumptions are valid These are often called preconditions

Precondition for f() is an assertion (a logical proposition) that must hold at input to f()

Function f() must behave correctly if its preconditions are met

If any precondition is not met, all bets are off Caller must call f() such that preconditions true – an

obligation on the caller callee may freely assume obligation has been met

The concept similarly holds for any statement or block of statements

Page 8: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

8

Simple Precondition Example

int deref(int *p) {return *p;}

Unsafe to dereference a null pointer Impose precondition that caller of deref() must meet:

p ≠ NULL holds at entrance to deref() If all callers ensure this precondition, it will be

safe to call deref() Can combine assertions using logical

connectives (and, or, implication)

Page 9: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

9

Another Example

int sum(int *a[], size_t n) {int total = 0, i;for (i=0; i<n; i++)

total += *(a[i]);return total;

} Precondition:

a[] holds at least n elements Forall j.(0 ≤ j < n) → a[j]≠NULL

Page 10: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

10

Postcondition Postcondition for f() is an assertion that holds

when f() returns f() has obligation of ensuring condition is true when it

returns Caller may assume postcondition has been

established by f() Example:

void *mymalloc(size_t n) {void *p = malloc(n);if (!p) {

perror("Out of memory");exit(1);

}return p;

} Post condition: retval != NULL

Page 11: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

11

Proving Precondition→Postcondition

Given preconditions and postconditions Which specifies what obligations caller has and what

caller is entitled to rely upon Verify that, no matter how function is called, if

precondition is met at function’s entrance, then postcondition is guaranteed to hold upon function’s return Must prove that this is true for all inputs Otherwise, you’ve found a bug in either specification

(preconditions/postconditions) or implementation

Page 12: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

12

Proving Precondition→Postcondition

Basic idea: Write down a precondition and postcondition for

every line of code Use logical reasoning

Requirement: Each statement’s postcondition must match (imply)

precondition of any following statement At every point between two statements, write down

invariant that must be true at that point Invariant is postcondition for preceding statement, and

precondition for next one

Page 13: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

13

Example Easy to tell if an isolated statement fits its pre-

and post-conditions postcondition for “v=0;” is

v=0 (no matter what the precondition is) Or, if precondition for “v=v+1;” is v≥5, then a valid

postcondition is v≥6

However, how about integer overflow? If precondition for “v=v+1;” is w≤100, then a

valid postcondition is w≤100 Assuming v and w do not alias

Page 14: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

14

Documentation Pre-/post-conditions serve as useful

documentation To invoke Bob’s code, Alice only has to look at pre-

and post-conditions – she doesn’t need to look at or understand his code

Useful way to coordinate activity between multiple programmers: Each module assigned to one programmer, and

pre-/post-conditions are a contract between caller and callee

Alice and Bob can negotiate the interface (and responsibilities) between their code at design time

Page 15: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

15

Avoiding Security Holes

To avoid security holes (or program crashes) Some implicit requirements code must meet

Must not divide by zero, make out-of-bounds memory accesses, or dereference null pointers, …

We can try to prove that code meets these requirements using same style of reasoning Ex: when a pointer is dereferenced, there is an

implicit precondition that pointer is non-null and inbounds

Page 16: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

16

Proving Array Accesses are in-bounds

/* Requires: a != NULL and a[] holds n elements */int sum(int a[], size_t n) {int total = 0, i;for (i=0; i<n; i++)

/* Loop invariant: 0 <= i < n */total += a[i];

return total;}

Loop invariant true at entrance to first iteration First iteration ensures i=0

It is true at entrance to subsequent iterations Loop termination condition ensures i<n, and i only increases

So array access a[i] is within bounds

Page 17: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

17

Buffer Overruns Proving absence of buffer overruns might be

much more difficult Depends on how code is structured

Instead of structuring your code so that it is hard to provide a proof of no buffer overruns, restructure it to make absence of buffer overruns more evident

Lots of research into automated theorem provers to try to mathematically prove validity of alleged pre-/post-conditions Or to help infer such invariants

Page 18: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

18

Other types of vulnerabilities

Page 19: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

19

User/Kernel Pointer Bugs An important class of bugs

int x;void sys_setint (int *p){ memcpy(&x, p, sizeof(x));}void sys_getint (int *p){ memcpy(p, &x, sizeof(x));}

Why such codes exist? Many user actions need root privilege to conduct

“Setuid root” program: mkdir, ping You as a normal user can execute these programs, but they need root

privilege to do many functions.

Can cause system hang, crash kernel, gain root privileges, read secret data from kernel buffers

“Finding User/Kernel Pointer Bugs With Type Inference”, Usenix Security 2004.

Page 20: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

20

Non-Language-Specific Vulnerabilities

int openfile(char *path) {struct stat s;if (stat(path, &s) < 0)

return -1;if (!S_ISRREG(s.st_mode)) {

error("only regular files allowed!");return -1;

}return open(path, O_RDONLY);

} Code to open only regular files

Not symlink, directory, nor special device On Unix, uses stat() call to extract file’s meta-

data Then, uses open() call to open the file

Page 21: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

21

What’s the Vulnerability? Code assumes “s” is unchanged between stat() and

open() calls – Never assume anything… An attacker could change file referred to by path in

between stat() and open() From regular file to another kind Bypasses the check in the code! If check was a security check, attacker can subvert system

security Time-Of-Check To Time-Of-Use (TOCTTOU)

vulnerability Meaning of path changed from time it is checked (stat())

and time it is used (open())

Page 22: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

22

Non-atomic check and use

Problem: some precondition required for an action is invalidated between the time it is checked and the time the action is performed An example of such a precondition: access

control condition The term race condition comes from

concurrency

Page 23: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

23

Example race condition: mkdir on Unix

mkdir is setuid root, i.e. executes as root It creates new directory non-atomically, in two

steps: creates the directory, with owner is root: mknod() sets the owner, to whoever invoked mkdir: chown()

Attack: by creating a symbolic link between steps 1 and 2, attacker can own any file After mknod(), the attacker deletes the newly created

dir, then uses symbolic link to link any file Chown() will change that file to be owned by attacker

Page 24: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

24

Promising future for data races? Trend: more multi-CPU machines

to keep improving computer power in accordance with Moore's Law, despite physical constraints

Hence: more multi-threaded software to take advantage of max. available computing power

Hence: many problems with data races in code as programmers cannot cope with concurrency writing correct concurrent programs is hard

"The free lunch is over :a fundamental turn toward concurrency in software” by Herb Sutter, 2005.

http://www.gotw.ca/publications/concurrency-ddj.htm

Page 25: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

25

TOCTTOU Vulnerability

In Unix, often occurs with filesystem calls because system calls are not atomic

But, TOCTTOU vulnerabilities can arise anywhere there is mutable state shared between two or more entities Example: multi-threaded Java servlets and

applications are at risk for TOCTTOU

Page 26: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

26

Command Injection

SQL Injection

Page 27: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

27

Command injection

A CGI script might contain: cat thefile | mail clientadres

An attack might enter email address as: [email protected]| rm –fr /

What happens then ? cat thefile | mail [email protected] | rm –fr /

Can you think of countermeasures ? validate input reduce access rights of CGI script (defense in depth)

Page 28: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

28

Command injection The fundamental problem: We want to give a user

freedom/flexibility to run commands he/she wants Malicious command/setting sequence is hard to anticipated

Vulnerability: many API calls and language constructs in many languages are affected, eg

C/C++ system(), execvp(), ShellExecute(), .. Java Runtime.exec(), ... Perl system, exec, open, `, /e, ... Python exec, eval, input, execfile, ... ...

Countermeasures validate all user input

Whitelist, not blacklist run with minimal privilege

Doesn't prevent, but mitigates effects

Page 29: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

29

SQL injection

Webpage account login: Username: czou Password: *********

Page 30: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

30

SQL injection

Backend database:$result = mysql_query(

“SELECT * FROM Accounts”.“WHERE Username = ’$username’”.“AND Password = ’$password’;”);

if (mysql_num_rows($result)>0)$login = true;

Page 31: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

31

SQL injection

Webpage account login: Username: czou’ OR 1=1;/* Password: *********

Page 32: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

32

Resulting SQL querySELECT * FROM AccountsWHERE Username = ’czou’ OR 1=1;/*’AND Password = ’*******’;

Page 33: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

33

Resulting SQL querySELECT * FROM AccountsWHERE Username = ’czou’ OR 1=1;/*’ AND Password = ’*******’;

No password is checked!

Page 34: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

34

SQL injection

Vulnerability: any application in any programming language that connects to SQL database

The common theme to injection attacks: Concatenate strings Interpret the result strings

Actions according to contained commands

Page 35: CAP6135: Malware and Software Vulnerability Analysis   Program Verification & Other Types of Vulnerabilities Cliff Zou Spring 2012

35

There are More Vulnerabilites Please read

“19 Deadly Sins of Software Security (Security One-off)”  by Michael Howard, David LeBlanc, John Viega