avishai wool, lecture 1 - 1 introduction to information security lecture 1

45
Avishai Wool, lecture 1 - 1 Introduction to Information Security Lecture 1

Upload: shanon-moody

Post on 17-Dec-2015

218 views

Category:

Documents


0 download

TRANSCRIPT

Avishai Wool, lecture 1 - 1

Introduction to Information SecurityLecture 1

Administration

Course web site:• http://course.cs.tau.ac.il/infosec14/

• Practical emphasis – challenging hands-on exercises.

• Make sure you attend the TIRGUL

• Final grade: 65% exam, 35% exercises

Avishai Wool, lecture 1 - 2

Administration – cont.• Go to to course page Instructions tab

• Make sure you join the mailing list

• Important: Fill in the questionnaire !– We need to understand your background

Avishai Wool, lecture 1 - 3

Security goals and threats

GOAL• Data confidentiality• Data integrity• User authentication• Privilege separation• System availability

THREAT• Data exposure• Data modification• Masquerading• Privilege elevation• Denial of service

Pre-Requisite to many attacks: getting malicious code to run on victim’s computer system

Avishai Wool, lecture 1 - 4

Control Hijacking

Basic Control Hijacking Attacks

Avishai Wool, lecture 1 - 5

Control hijacking attacks

• Attacker’s goal:– Take over target machine (e.g. web server)

• Execute arbitrary code on target by hijacking application control flow

• Examples.– Buffer overflow attacks– Integer overflow attacks– Format string vulnerabilities

Avishai Wool, lecture 1 - 6

Example 1: buffer overflows• Extremely common bug in C/C++ programs.

– First major exploit: 1988 Internet Worm. fingerd.

0

100

200

300

400

500

600

1995 1997 1999 2001 2003 2005

Source: NVD/CVE

» 20% of all vuln.

2005-2007: 10%

Avishai Wool, lecture 1 - 7

What is needed• Understanding C functions, the stack, and the heap.• Know how system calls are made• The exec() system call

• Attacker needs to know which CPU and OS used on the target machine:– Our examples are for x86 running Linux or Windows– Details vary slightly between CPUs and OSs:

• Little endian vs. big endian (x86 vs. Motorola)

• Stack Frame structure (Unix vs. Windows)

Avishai Wool, lecture 1 - 8

Linux process memory layout

unused 0x08048000

run time heap

shared libraries

user stack

0x40000000

0xC0000000

%esp

brk

Loaded from exec

0Avishai Wool, lecture 1 - 9

exception handlers

Stack Frame

arguments

return addressstack frame pointer

local variables

SP

StackGrowth

high

lowcallee saved registers

Avishai Wool, lecture 1 - 10

What are buffer overflows?

Suppose a web server contains a function:

When func() is called stack looks like:

argument: str

return address

stack frame pointer

char buf[128]

SPAvishai Wool, lecture 1 - 11

void func(char *str) { char buf[128];

strcpy(buf, str);do-something(buf);

}

What are buffer overflows?

void func(char *str) { char buf[128];

strcpy(buf, str);do-something(buf);

}

What if *str is 136 bytes long?

[this is a software bug]

After strcpy:

argument: str

return address

stack frame pointer

char buf[128]

SP

*str Problem: no length checking in strcpy()

Avishai Wool, lecture 1 - 12

What are buffer overflows?

void func(char *str) { char buf[128];

strcpy(buf, str);do-something(buf);

}

What if *str is 136 bytes long?

After strcpy:

argument: str

return address

stack frame pointer

char buf[128]

SP

*str

When func returns, usually:• Some junk in return address• CPU tries to jump to junk address• “invalid instruction at 0x….” or

“segmentation fault”

• Result: Web server crash (OS kills the process)

Avishai Wool, lecture 1 - 13

Now let’s think like an attacker

• Attacker discovers the software bug• Attacker has control over the content & length of

“str”– E.g., maybe “str” is sent in the HTTP request that the

attacker can fill

• Result: Attacker can place binary values in the end of “str” to select the address that the CPU will jump to upon return

• This is “Control Hijacking”

Avishai Woollecture 13 - 14

Where to jump to?

• Attacker goal: jump to an address that runs attacker-written code– But the process memory only has legitimate user &

OS code

• Need to inject his own code somehow

• Solution: make the buffer overflow even longer• Place binary machine instructions at the end of

“str”Avishai Wool

lecture 13 - 15

char buf[128]

return address

Basic stack exploitSuppose *str is such that after strcpy stack looks like:

Program P: exec(“/bin/sh”)

When func() exits, the user gets shell !

Note: attack code P runs in stack.

(exact shell code by Aleph One)

Program P

low

high

Avishai Wool, lecture 1 - 16

The NOP slide

Problem: how does attacker determine ret-address?

Solution: NOP slide• Guess approximate stack state

when func() is called

• Insert many NOPs before program P:

nop ,

xor eax,eax ,

inc ax , etc. etc.

char buf[128]

return address

NOP Slide

Program P

low

Avishai Wool, lecture 1 - 17

high

Details and examples• Some complications:

– Program P should not contain the ‘\0’ character.– Overflow should not crash program before func() exits.

• Sample remote stack smashing overflows:– (2007) Overflow in Windows animated cursors (ANI).

LoadAniIcon()

– (2005) Overflow in Symantec Virus Detection

test.GetPrivateProfileString "file", [long string]

Avishai Wool, lecture 1 - 18

Many unsafe libc functions

strcpy (char *dest, const char *src)

strcat (char *dest, const char *src)

gets (char *s)

scanf ( const char *format, … ) and many more.

• “Safe” libc versions strncpy(), strncat() are misleading– e.g. strncpy() may leave string unterminated.

• Windows C run time (CRT):– strcpy_s (*dest, DestSize, *src): ensures proper

termination

Avishai Wool, lecture 1 - 19

Buffer overflow opportunities• Exception handlers: (Windows SEH attacks)

– Overwrite the address of an exception handler in stack frame.

• Function pointers: (e.g. PHP 4.0.2, MS MediaPlayer Bitmaps)

– Overflowing buf will override function pointer.

• Longjmp buffers: longjmp(pos) (e.g. Perl 5.003)

– Overflowing buf next to pos overrides value of pos.

Heapor

stack buf[128] FuncPtr

Avishai Wool, lecture 1 - 20

Corrupting method pointers

• Compiler generated function pointers (e.g. C++ code)

• After overflow of buf :

ptr

data

Object T

FP1FP2FP3

vtable

method #1method #2

method #3

ptr

buf[256] data

object T

vtable

NOPslide

shellcode

Finding buffer overflows

• To find overflow:– Run web server on local machine– Issue malformed requests (ending with “$$$$$” )

• Many automated tools exist (called fuzzers)

– If web server crashes,search core dump for “$$$$$” to find overflow

location

• Construct exploit (not easy given latest defenses)

Avishai Wool, lecture 1 - 22

Control Hijacking

More Control Hijacking Attacks

Avishai Wool, lecture 1 - 23

More Hijacking Opportunities

• Integer overflows: (e.g. MS DirectX MIDI Lib)

• Double free: double free space on heap.– Can cause memory mgr to write data to specific location– Examples: CVS server

• Format string vulnerabilities

Avishai Wool, lecture 1 - 24

Integer Overflow• Integer overflow: an arithmetic operation attempts

to create a numeric value that is larger than can be represented within the available storage space.

• Example: Test 1: short x = 30000; short y = 30000; printf(“%d\n”, x+y);

Test 2: short x = 30000; short y = 30000; short z = x + y; printf(“%d\n”, z);

Will two programs output the same?What will they output?

Avishai Wool, lecture 1 - 25

C Data Types• short int 16bits [-32,768;

32,767]• unsigned short int 16bits [0;

65,535] • unsigned int 16bits [0;

4,294,967,295]• int 32bits [-2,147,483,648; 2,147,483,647]• long int 32 bits [-2,147,483,648;

2,147,483,647] • signed char 8bits [-128;

127] • unsigned char 8 bits [0; 255]

Avishai Wool, lecture 1 - 26

When does casting occur in C?• When assigning to a different data type• For binary operators +, -, *, /, %, &, |, ^,

– if either operand is an unsigned long, both are cast to an unsigned long

– in all other cases where both operands are 32-bits or less, the arguments are both upcast to int, and the result is an int

• For unary operators– ~ changes type, e.g., ~((unsigned short)0) is int– ++ and -- does not change type

Avishai Wool, lecture 1 - 27

Where Does Integer Overflow Matter?

• Allocating spaces using calculation.• Calculating indexes into arrays• Checking whether an overflow could occur

• Direct causes:– Truncation; Integer casting

Avishai Wool, lecture 1 - 28

Integer Overflow: Example 1

const long MAX_LEN = 20K;char buf[MAX_LEN];short len = strlen(input);if (len < MAX_LEN) strcpy(buf, input);

Can a buffer overflow attack occur?

If so, how long does input needs to be?

Avishai Wool, lecture 1 - 29

Integer Overflows Example 2 (see Phrack 60)

Problem: what happens when int exceeds max value?

int m;(32 bits)

short s;(16 bits)

char c; (8 bits)

c = 0x80 + 0x80 = 128 + 128 c = 0⇒

s = 0xff80 + 0x80 s = 0⇒

m = 0xffffff80 + 0x80 m = 0⇒

Can this be exploited?Avishai Wool, lecture 1 - 30

void func( char *buf1, *buf2, unsigned int len1, len2) {

char temp[256];if (len1 + len2 > 256) {return -1} //

length checkmemcpy(temp, buf1, len1); //

concatenate buffersmemcpy(temp+len1, buf2, len2);do-something(temp); // do stuff

}

What if len1 = 0x80, len2 = 0xffffff80 ?

⇒ len1+len2 = 0

Second memcpy() will overflow stack (or heap) !!Avishai Wool, lecture 1 - 31

0

20

40

60

80

100

120

140

1996 1998 2000 2002 2004 2006

Source: NVD/CVE

Integer overflow exploit stats

Avishai Wool, lecture 1 - 32

Format string bugs

Avishai Wool, lecture 1 - 33

Format string problem• Want to print a message (without arguments) - via fprintf• Correct form:

fprintf( stdout, “%s”, input);

• Bug:int func(char *input) {

fprintf( stderr, input);}

• “input” is treated as a format string – missing arguments

• If “input” includes % formats – access places on stack

Problem: what if *input = “%s%s%s%s%s%s%s” ??– Most likely program will crash: DoS.

– If not, program will print memory contents. Privacy?Avishai Wool, lecture 1 - 34

Format string attacks (“%n”)• “%n” format writes the number of bytes

formatted so far into a variable!

• printf(“abc %n”, &x) will change the value of the variable x (to 4)– in other words, the parameter value on the stack is

interpreted as a pointer to an integer value, and the place pointed by the pointer is overwritten

Avishai Wool, lecture 1 - 35

Exploit

• Dumping arbitrary memory:

– Walk up stack until desired pointer is found.

– printf( “%08x.%08x.%08x.%08x|%s|”)

• Writing to arbitrary memory:

– printf( “hello %n”, &temp) -- writes ‘6’ into temp.

– printf( “%08x.%08x.%08x.%08x.%n”)Avishai Wool, lecture 1 - 36

History• First exploit discovered in June 2000.• Examples:

– wu-ftpd 2.* : remote root– Linux rpc.statd: remote root– IRIX telnetd: remote root– BSD chpass: local root

Avishai Wool, lecture 1 - 37

Vulnerable functions

Any function using a format string.

Printing:

printf, fprintf, sprintf, …

vprintf, vfprintf, vsprintf, …

Logging:

syslog, err, warn

Avishai Wool, lecture 1 - 38

Control Hijacking

Platform Defenses

Avishai Wool, lecture 1 - 39

Preventing hijacking attacks1. Fix bugs:

– Audit software• Automated tools: Coverity, Prefast/Prefix.

– Rewrite software in a type safe languange (Java, ML)• Difficult for existing (legacy) code …

2. Concede overflow, but prevent code execution

3. Add runtime code to detect overflows exploits– Halt process when overflow exploit detected– StackGuard, LibSafe, … Avishai Wool, lecture 1 - 40

Marking memory as non-execute (W^X)

Prevent attack code execution by marking stack and heap as non-executable

• NX-bit on AMD Athlon 64, XD-bit on Intel P4 Prescott– NX bit in every Page Table Entry (PTE)

• Deployment:

–Linux (via PaX project); OpenBSD–Windows: since XP SP2 (DEP)

• Boot.ini : /noexecute=OptIn or AlwaysOn• Visual Studio: /NXCompat[:NO]

• Limitations:– Some apps need executable heap (e.g. JITs).– Does not defend against `return-to-libc’ exploits

Examples: DEP controls in Windows

DEP terminating a program

Avishai Wool, lecture 1 - 42

Computer > right-click Properties > Advanced system settings > Performance (Settings) > Data Execution Prevention

Attack: return to libc• Control hijacking without executing code

args

ret-addrsfp

local buf

stack

exec()printf()

“/bin/sh”

libc.so

Avishai Wool, lecture 1 - 43

Response: randomization• ASLR: (Address Space Layout Randomization)

– Map shared libraries to rand location in process memory

Attacker cannot jump directly to exec function

– Deployment: (/DynamicBase)

• Windows Vista: 8 bits of randomness for DLLs– aligned to 64K page in a 16MB region 256 choices

• Linux (via PaX): 16 bits of randomness for libraries

– More effective on 64-bit architectures

• Other randomization methods:– Sys-call randomization: randomize sys-call id’s– Instruction Set Randomization (ISR) Avishai Wool, lecture 1 - 44

ASLR Example

Booting twice loads libraries into different locations:

Avishai Wool, lecture 1 - 45