Efficient Character-level Taint Tracking for Java
Download
Report
Transcript Efficient Character-level Taint Tracking for Java
EFFICIENT CHARACTER-LEVEL
TAINT TRACKING FOR JAVA
Erika Chin
David Wagner
UC Berkeley
WEB APPLICATIONS
80%
of all web applications are vulnerable
to attack [1]
Most are command injection attacks
(mixed control and data channel):
SQL injection
XSS
HTTP response splitting
Path traversal
Shell command injection
2
[1] J. Grossman. WhiteHat website security statistics report, Aug 2008.
EXAMPLE – SQL INJECTION
Query = “SELECT * FROM students WHERE name = ‘ ”
+ studentName + “ ’ ”;
What if:
studentName = Bobby
“SELECT * FROM students WHERE name = ‘Bobby’ ”
studentName = Bobby’; DROP TABLE students; -“SELECT * FROM students WHERE name = ‘Bobby’;
DROP TABLE students; --’ ”
3
Inspired by XKCD: http://xkcd.com/327/
COMMAND INJECTION ATTACKS
Command Injection Attack
Command Elements
SQL injection attack
SQL keywords and operators
XSS
JavaScript
HTTP response splitting
Newlines (CR, LF)
Path traversal
‘/’ , “..”
Shell command injection
Shell keywords and operators,
meta-characters
4
A NATURAL APPROACH – TAINT
TRACKING AT THE CHARACTER LEVEL
Others
have argued that taint tracking
aids the detection of command injection
attacks
Taint tracking reveals what data gets touched
by user input
Attacks
are injected into web applications
in the form of strings, so we can limit the
scope of tracking to strings
Character-level information narrows the
focus to specific portions of the string
5
OUR FOCUS
We
focus on taint tracking for Java web
applications
Many commercial enterprises use Java for
their web services
6
CHARACTER-LEVEL
TAINT TRACKING FOR JAVA
1.
2.
3.
Source Tainting: Augment the Java
Servlets implementation to mark user
input as tainted (Tomcat 6)
Taint Propagation: Replace the stringrelated classes in the Java library with
augmented classes that track taint
status (IBM JDK6)
Sink Checking: At each sink, use the
taint information to detect attacks by
checking that control data is not tainted
7
SOURCE TAINTING
We
mark all information from the HTTP
request as untrusted
Protocol
Path
Form Parameters
http://www.youtube.com/results?search_query=rick+roll…
GET /results?search_query=rick+roll&search_type=&aq…
Host: www.youtube.com
…
HTTP
Headers:
Referrer: http://www.youtube.com/
Cookies,
Cookie: use_hitbox=72c46ff6cddcb7c5585…
Session Id,
etc.
8
SOURCE TAINTING: AUGMENTED CLASSES
Replace
the Tomcat Servlet classes with our
own modified classes
javax.servlet.http.HttpServletRequest
javax.servlet.http.Cookie
javax.servlet.http.HttpSession
org.apache.catalina.connector.CoyoteReader
9
BASIC TAINT PROPAGATION
Example code snippet:
String city = request.GetParameter(“city”);
String punctuation = “, ”;
String state = “CA”;
String temp = punctuation.concat(state);
String location = city.concat(temp);
10
TAINT PROPAGATION:
ORIGINAL STRING CLASS
city
B e
punctuation
,
state
C A
r
k
e
l
e
char[]
y
temp = punctuation.concat(state)
city.concat(temp)
B e
r
k
e
l
e
y
,
C A
,
C A
11
TAINT PROPAGATION:
MODIFIED STRING CLASS
city
punctuation
B e
r
k
e
l
e
y
T
T
T
T
T
T
T
,
F
state
T
char[]
boolean[]
F
C A
F
F
temp = punctuation.concat(state)
,
F
city.concat(temp)
B e
r
k
e
l
e
y
,
T
T
T
T
T
T
T
F
T
C A
F
F
F
C A
12
F
F
F
OPTIMIZED TAINT PROPAGATION
To
reduce the overhead of taint tracking,
only track taint when necessary
Only allocate boolean taint array once the
String contains a tainted character
Reduces overhead by eliminating array
copies for operations on fully untainted
strings
13
OPTIMIZED TAINT PROPAGATION
city
punctuation
B e
r
k
e
l
e
y
T
T
T
T
T
T
T
T
,
F
nullF
state
C A
F
nullF
temp = punctuation.concat(state)
city.concat(temp)
,
C A
F
nullF
F
C A
B e
r
k
e
l
e
y
,
T
T
T
T
T
T
T
F
T
F
14
F
F
F
TAINT PROPAGATION:
AUGMENTED CLASSES
java.lang.String
java.lang.StringBuffer
java.lang.StringBuilder
15
SINK CHECKING
Sinks
can use taint information to detect
commands in user-supplied data
SQL – instrument the JDBC to parse the SQL
queries and check for SQL keywords and
operators that contain tainted characters
XSS – examine HTML for tainted JavaScript
Details
of how to do this are welldocumented in the previous literature and
not the focus of this work [2]
16
[2] Su and Wassermann. The essence of command injection attacks in web applications. POPL ’06.
BENEFITS
Provides
a basis to protect from command
injection attacks
Simple, easy to adopt and deploy
Server-side change
One-time modification
No change to web application byte code
No need for web application source code
Works immediately with Java legacy
applications
Efficient
17
BENEFITS CON’T
Handles
web applications that call string
methods reflectively
Java reflection allows calls to methods
selected at runtime
Our approach can track the taint for these
reflected calls
18
LIMITATIONS
For
backwards compatibility we do not
record taint status in the serialized form
May lose taint status via string operations
with chars and char arrays
Cannot hold taint status in primitives
Does
not defend against malicious web
developers
19
PERFORMANCE OVERHEAD: 0-15%
20
CONTRIBUTIONS
Efficient
character-level taint tracking
Runtime overhead <15%
Works immediately for Java legacy code
Easy to adopt and deploy
21
Thank you!
Any questions?
22