CS 645: Lecture 3 Software Vulnerabilities. Rachel Greenstadt July 3, 2013

Similar documents
Control Hijacking Attacks

Vulnerabilities. Code Injection - Buffer overflows. Some Commonly Exploitable Flaws

1/31/2007 C. Edward Chow. CS591 Page 1

Program Security and Vulnerabilities Class 2

Basic Control Hijacking Attacks

CSE 565 Computer Security Fall 2018

Software Security: Buffer Overflow Attacks and Beyond

Software Security: Buffer Overflow Attacks and Beyond

Fundamentals of Computer Security

CMPSC 497 Buffer Overflow Vulnerabilities

2 Sadeghi, Davi TU Darmstadt 2012 Secure, Trusted, and Trustworthy Computing Chapter 6: Runtime Attacks

Basic Buffer Overflows

Buffer Overflow. Jo, Heeseung

BUFFER OVERFLOW. Jo, Heeseung

UMSSIA LECTURE I: SOFTWARE SECURITY

Secure Software Development: Theory and Practice

Information Security CS 526

Buffer Overflow. Jin-Soo Kim Computer Systems Laboratory Sungkyunkwan University

Buffer. This time. Security. overflows. Software. By investigating. We will begin. our 1st section: History. Memory layouts

Lecture 4 September Required reading materials for this class

20: Exploits and Containment

Lecture 9: Buffer Overflow* CS 392/6813: Computer Security Fall Nitesh Saxena

Security and Privacy in Computer Systems. Lecture 5: Application Program Security

ECS 153 Discussion Section. April 6, 2015

Secure Programming I. Steven M. Bellovin September 28,

Buffer Overflow. Jin-Soo Kim Computer Systems Laboratory Sungkyunkwan University

Buffer overflows & friends CS642: Computer Security

Linux Memory Layout. Lecture 6B Machine-Level Programming V: Miscellaneous Topics. Linux Memory Allocation. Text & Stack Example. Topics.

Buffer Overflow. Jinkyu Jeong Computer Systems Laboratory Sungkyunkwan University

Basic Memory Corrup+on A3acks

CSE 565 Computer Security Fall 2018

Lecture 6: Buffer Overflow. CS 436/636/736 Spring Nitesh Saxena

Introduction to Computer Systems , fall th Lecture, Sep. 28 th

Betriebssysteme und Sicherheit Sicherheit. Buffer Overflows

CIS 551 / TCOM 401 Computer and Network Security. Spring 2007 Lecture 2

This time. Defenses and other memory safety vulnerabilities. Everything you ve always wanted to know about gdb but were too afraid to ask

Buffer overflows & friends CS642: Computer Security

Buffer Overflows Defending against arbitrary code insertion and execution

Buffer Overflow Attacks

CSE / / 60567: Computer Security. Software Security 4

CS 161 Computer Security. Week of January 22, 2018: GDB and x86 assembly

Offensive Security My First Buffer Overflow: Tutorial

Beyond Stack Smashing: Recent Advances in Exploiting. Jonathan Pincus(MSR) and Brandon Baker (MS)

Software Security II: Memory Errors - Attacks & Defenses

Sungkyunkwan University

Lecture 08 Control-flow Hijacking Defenses

Software Security: Buffer Overflow Attacks (continued)

Software Vulnerabilities. Jeff Foster University of Maryland, College Park

Buffer Overflow and Protection Technology. Department of Computer Science,

CYSE 411/AIT681 Secure Software Engineering Topic #12. Secure Coding: Formatted Output

2/9/18. CYSE 411/AIT681 Secure Software Engineering. Readings. Secure Coding. This lecture: String management Pointer Subterfuge

We will focus on Buffer overflow attacks SQL injections. See book for other examples

Is stack overflow still a problem?

Topics in Software Security Vulnerability

Control Flow Hijacking Attacks. Prof. Dr. Michael Backes

Topics. What is a Buffer Overflow? Buffer Overflows

Stack Vulnerabilities. CS4379/5375 System Security Assurance Dr. Jaime C. Acosta

Course Administration

CSCE 548 Building Secure Software Buffer Overflow. Professor Lisa Luo Spring 2018

CSc 466/566. Computer Security. 20 : Operating Systems Application Security

CS 161 Computer Security

CMSC 414 Computer and Network Security

Reserve Engineering & Buffer Overflow Attacks. Tom Chothia Computer Security, Lecture 17

Software Security; Common Implementation Flaws

Buffer overflow background

Fundamentals of Linux Platform Security

CPSC 213. Introduction to Computer Systems. Procedures and the Stack. Unit 1e

Buffer Overflow & Format Strings

Exercise 6: Buffer Overflow and return-into-libc Attacks

Project 1 Notes and Demo

Systems I. Machine-Level Programming V: Procedures

Lecture 7: Procedures and Program Execution Preview

Lectures 5. Announcements: Today: Oops in Strings/pointers (example from last time) Functions in MIPS

CSC 252: Computer Organization Spring 2018: Lecture 9

Memory Corruption Vulnerabilities, Part I

CPSC 213. Introduction to Computer Systems. Procedures and the Stack. Unit 1e

ISA564 SECURITY LAB. Code Injection Attacks

Assembly Language: Function Calls

Foundations of Network and Computer Security

CSE 509: Computer Security

Software Security: Buffer Overflow Defenses

(Early) Memory Corruption Attacks

Buffer Overflow Vulnerability

Assembly Language: Function Calls" Goals of this Lecture"

CSC 2400: Computing Systems. X86 Assembly: Function Calls"

Control Hijacking Attacks

Buffer overflows (a security interlude) Address space layout the stack discipline + C's lack of bounds-checking HUGE PROBLEM

Lecture Embedded System Security A. R. Darmstadt, Runtime Attacks

Calling Conventions. Hakim Weatherspoon CS 3410, Spring 2012 Computer Science Cornell University. See P&H 2.8 and 2.12

Secure Systems Engineering

System Security Class Notes 09/23/2013

CSE 127 Computer Security

CSE 127 Computer Security

Assembly Language: Function Calls" Goals of this Lecture"

Software Security: Buffer Overflow Attacks

Lecture 5. Announcements: Today: Finish up functions in MIPS

Lecture 9 Assertions and Error Handling CS240

Lecture 09 Code reuse attacks. Stephen Checkoway University of Illinois at Chicago CS 487 Fall 2017

buffer overflow exploitation

BUFFER OVERFLOW DEFENSES & COUNTERMEASURES

Transcription:

CS 645: Lecture 3 Software Vulnerabilities Rachel Greenstadt July 3, 2013

Project 1: Software exploits Individual project - done in virtual machine environment This assignment is hard. Don t leave it until the last minute. Ask for help if you get stuck. Make sure you have the environment set up soon! gdb example is a walkthrough of first sploit

Types of Software Vulnerabilities Databases : SQL Injection Web apps : XSS Broken crypto Buffer overflows (and related bugs) And more

History : Morris Worm Worm was released in 1988 by Robert Morris Graduate student at Cornell, son of NSA chief scientist Convicted under Computer Fraud and Abuse Act, sentenced to 3 years of probation and 400 hours of community service Now an EECS professor at MIT (advised my Masters thesis) Worm was intended to propagate slowly and harmlessly measure the size of the Internet Due to a coding error, it created new copies as fast as it could and overloaded infected machines $10-100M worth of damage

Buffer Overflows and Morris Work One of the worm s propagation techniques was a buffer overflow attack against a vulnerable version of fingerd on VAX systems By sending special string to finger daemon, worm caused it to execute code creating a new worm copy Unable to determine remote OS version, worm also attacked fingerd on Suns running BSD, causing them to crash (instead of spawning a new copy) CERT formed to deal with the new threat of software vulnerabilities

Buffer Overflows Common type of vulnerability Often most common (depending on how you measure it) Tend to be critical as well enable machine compromise

Memory buffer vulnerabilities Buffer is a data storage area inside computer memory (stack or heap) Intended to hold pre-defined amount of data If more data is stuffed into it, it spills into adjacent memory If executable code is supplied as data, victim s machine may be fooled into executing it we ll see how Code will self-propagate or give attacker control over machine First generation exploits: stack smashing Second gen: heaps, function pointers, off-by-one Third generation: format strings and heap management structures

Software exploits/ Project 1 Before you can understand stack exploits, you have to know something about computer architecture For project 1, you have to know x86 (IA-32) So we ll do some review

Procedures Operating system runs programs as concurrently executed procedures The OS calls a program as a procedure to execute the program and the program returns control to the OS when it completes. The call to execute the procedure is a branch instruction to the beginning of the procedure. When the procedure finishes, a second branch instruction returns to the instruction immediately following the procedure call. The return address must be saved before the procedure is called. The steps in the transfer of control to execute a procedure are 1. Save the return address 2. Call procedure (using a branch instruction). 3. Execute the procedure. 4. Return from the procedure (branch to the return address).

Nested procedure jal: jump and link jr: jump register $ra return address When the jal B instruction is executed, the return address in register $ra for procedure A will be overwritten with the return address for procedure B. Procedure B will return correctly to A, but when procedure A executes the jr instruction, it will return again to the return address for B, which is the next instruction after jal B in procedure A. This puts procedure A in an infinite loop. To implement the linkage for nested procedures, the return address for each procedure must be saved somewhere other than register $ra. Note that the procedure call/return sequence is a LIFO process: the last procedure called is the first to return. A stack is the natural data structure for saving the return addresses for nested procedure calls.

System Stack The system stack provides a convenient mechanism for dynamically allocating storage for the various data associated with the execution of a procedure including: parameters saved registers local variables return address The system stack is located at the top of the user memory space and grows downward toward smaller memory addresses. Register $esp is the stack pointer to the system stack. It contains the address of the first empty location at the top of the stack.

Linux process memory layout %esp user stack 0xC0000000 brk Loaded from exec shared libraries run time heap unused 0x40000000 0x08048000 0

System stack The frame pointer is stored in register $ebp, also called $fp. A stack frame consists of the memory on the stack between the frame pointer and the stack pointer.

IA-32 Registers $esp : Stack Pointer (SP) : points to the top of the stack (lowest mem addr) Points to last used word in stack or next available word location on stack (implementation dependent) $ebp : Frame Pointer (FP) : points to fixed location within an activation record (stack frame) If $ebp for some stack frame is stored at addr X then $eip for that frame is stored at addr X + 4 Used to reference local vars and parameters since the distance from those to the frame pointer will not change whereas the distance from those to the stack pointer will (as other functions are called and the stack pointer is decremʼd ) $eip : instruction pointer (aka $ra) The instruction pointer (EIP) register contains the offset in the current code segment for the next instruction to be executed.

Calling procedures (IA-32) When CALL procedure p() Push eip : the return address ($ra) Push ebp : saves previous frame pointer Copy sp into fp : ebp = esp The new stack frame s frame pointer will be the previous value of the stack pointer Advance sp (esp) for allocations on stack (that is, decrement it) When LEAVE procedure p(), This process is reversed Load ebp into esp Restore ebp from the stack

Interaction between EIP, EBP, ESP During CALL, value of eip register pushed onto stack Before RET, programmer should make sure that stack pointer (esp) is pointing to the eip on the stack; does this via: Move contents of $ebp into $esp Increment $esp by 4 $esp should now point to (contain addy of) $eip RET will load the value stored in $esp into the $eip

What are buffer overflows? Suppose a web server contains a function: void func(char *str) { char buf[128]; /* Allocate local buffer 128 bytes reserved on stack */ strcpy(buf, str); /* Copy argument into local buffer */ do-something(buf); } When the function is invoked, a new frame with local variables is pushed onto the stack:

What if buffer is overstuffed? Memory pointed to by str is copied onto the stack void func(char *str) { char buf[128]; strcpy(buf, str); /*strcpy does not check sizeof buf */ do-something(buf); } If a string longer than 128 byes is written into buf it will overwrite adjacent memory locations: These are often the saved registers!

Buffer Overflows

Buffer Overflows

Buffer Overflows

Buffer Overflows

Buffer Overflows

Buffer Overflows

Buffer Overflows

Buffer Overflows

Buffer Overflows

Executing Attack Code Suppose buffer contains attacker-created string For example, *str contains a string read from the network as input to network daemon When function exits, code in the buffer will be executed, giving attacker a shell Root shell if the victim program is setuid root

Exploiting a Real Program It s easy to execute our attack when we have the source code What about when we don t? How will we know what our return address should be?

How to find Shellcode 1.Guess - time consuming - being wrong by 1 byte will lead to segmentation fault or invalid instruction

How to find Shellcode 2. Pad shellcode with NOP s then guess - we don t need to be exactly on - much more efficient

Small Buffer Overflows If the buffer is smaller than our shellcode, we will overwrite the return address with instructions instead of the address of our code Solution: place shellcode in an environment variable then overflow the buffer with the address of this variable in memory Can make environment variable as large as you want Only works if you have access to environment variables

Many unsafe C lib functions strcpy (char *dest, const char *src) strcat (char *dest, const char *src) gets (char *s) scanf ( const char *format, ) Safe versions strncpy(), strncat() are misleading strncpy() may leave buffer unterminated. strncpy(), strncat() encourage off by 1 bugs.

Exploiting buffer overflows Suppose web server calls func() with given URL. Some complications: Sample remote buffer overflows of this type: Attacker sends a 200 byte URL. Gets shell on web server Program P should not contain the \0 character. Overflow should not crash program before func() exists. (2005) Overflow in MIME type field in MS Outlook. (2005) Overflow in Symantec Virus Detection Set test = CreateObject("Symantec.SymVAFileQuery.1") test.getprivateprofilestring "file", [long string]

Off-by-one Overflow 1-byte overflow: can t change RET, but can change pointer to previous stack frame On little-endian architecture, make it point into buffer RET for previous function will be read from buffer!

Other types of overflow attacks Integer overflows: (e.g. MS DirectX MIDI Lib) Phrack60 void func(int a, char v) { char buf[128]; init(buf); } buf[a] = v; Problem: a can point to `ret-addr on stack. Double free: double free space on heap. Can cause mem mgr to write data to specific location Examples: CVS server (2003) Other heap bugs seen in IE 2008 and adobe PDF zero days

Process Memory Organization Text Region Text Region: Executable code of the program Heap: Dynamically allocated data Stack: Local variables, function return addresses; grows and shrinks as functions are called and return

Heap vulnerabilities The heap can be overflowed by a long string as well Typically you overwrite the boundary tags of the heap data structure (important to understand your malloc/free implementation) It is tricky to pass control to the shellcode because it can often get mangled before it is executed

Format string problem

Format string problem int func(char *user) { } fprintf( stdout, user); Problem: what if user = %s%s%s%s%s%s%s?? Most likely program will crash: DoS. If not, program will print memory contents. Privacy? Full exploit using user = %n

Format string problem int func(char *user) { } fprintf( stdout, user); Problem: what if user = %s%s%s%s%s%s%s?? Most likely program will crash: DoS. If not, program will print memory contents. Privacy? Full exploit using user = %n Correct form:

Format string problem int func(char *user) { } fprintf( stdout, user); Problem: what if user = %s%s%s%s%s%s%s?? Most likely program will crash: DoS. If not, program will print memory contents. Privacy? Full exploit using user = %n Correct form: int func(char *user) {

Format string problem int func(char *user) { } fprintf( stdout, user); Problem: what if user = %s%s%s%s%s%s%s?? Most likely program will crash: DoS. If not, program will print memory contents. Privacy? Full exploit using user = %n Correct form: int func(char *user) { fprintf( stdout, %s, user);

Format string problem int func(char *user) { } fprintf( stdout, user); Problem: what if user = %s%s%s%s%s%s%s?? Most likely program will crash: DoS. If not, program will print memory contents. Privacy? Full exploit using user = %n Correct form: int func(char *user) { fprintf( stdout, %s, user); }

History First exploit discovered in June 2000. Examples: wu-ftpd 2.* : Linux rpc.statd: IRIX telnetd: BSD chpass: remote root remote root remote root local root

Vulnerable functions Any function using a format string. Printing: printf, fprintf, sprintf, vprintf, vfprintf, vsprintf,

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 )

Project 1/2 Will need to write several types of exploits (standard buffer overflow, integer, heap, format string) Exploits 1-2 are easy, 3-4 are medium, 5-7 are really hard gdb will be your friend (gdb trace on website similar to demo I m about to do) Readings for today will also be very helpful 44

Readings The readings on the website (starting with aleph1) are quite helpful for the assignment The gdb example is basically a walkthrough of sploit1... very very helpful to actually do the walkthrough (type the commands, etc) A friend recently recommended The Shellcoder s Handbook I haven t read it, but please let me know if you do and find it useful 45