Security: Lessons Learned and Missed from Java Nathanael Paul David Evans...

31
Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virgin ia.edu University of Virginia ACSAC 2004
  • date post

    19-Dec-2015
  • Category

    Documents

  • view

    213
  • download

    0

Transcript of Security: Lessons Learned and Missed from Java Nathanael Paul David Evans...

Page 1: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

Security: Lessons Learned and Missed from Java

Nathanael Paul

David Evans{nate,evans}@cs.virginia.edu

University of Virginia

ACSAC 2004

Page 2: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

0

5

10

15

20

25

30

35

40

45

50

1996 1997 1998 1999 2000 2001 2002 2003 2004

Java VM

.NET VM

Major Security Vulnerabilities (Cumulative)

Page 3: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

3

Why the disparity in vulnerabilities?Hypotheses:

• No one uses/attacks .NET– Windows Update installs .NET framework– Attractive target with over 90% market share

• Microsoft is smarter than everyone else– Check their profit and market share

• Learned from past– .NET learned from experience with Java

Page 4: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

4

Universal Security Principles[Saltzer and Shroeder, 1974] [McGraw and Viega, 2001]

• Keep it simple

• Complete Mediation

• Least Privilege

• Secure Weakest Link

• Defense in Depth

Page 5: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

5

Virtual MachinesPlatforms that allow untrusted code to execute with restrictions enforced by the virtual machine (VM)

Java VM

Operating System

Protected Resource

ClassLoaderSecurity

exception

Security exception

Verify Exception

JAR Assembly

Policy Manager

Class

Verifier

Class Loader

JIT VerifierVerify Exception

CLR

Operating System

Protected Resource

Security exception

Java .NET

Page 6: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

6

Source

bytecodes

Verifier

Low-level Code Safety

• Must ensure programs are type, memory, and control safe using data-flow analysis

• High-level policy enforcement depends on low-level code safety

VM

Page 7: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

7

Verifier is (should be) Conservative

.NET/Java programs

Safe programs

Verifiable programs

Bug

Page 8: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

8

Object Creation and Initialization

• Virtual machine must ensure object is initialized before use– Security permissions restrict some

objects from being created– Improper initialization can create a

vulnerability• Bug in MSIE 4.0, 5.0, 6.0 [lsd-pl.net]• Similar bug in Sun and Netscape

Lesson 1: Keep it simple

Page 9: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

9

• Java– new – create new object reference– dup – duplicate reference– invokespecial – calls constructor

• .NET– newobj is equivalent to Java’s new,

dup, and invokespecial instructions

Object Creation Instructions

Page 10: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

10

Object Initialization Vulnerability [lsd-pl.net]

class LSDbug extends SecurityClassLoader {public LSDbug() {

try { LSDbug(5); } catch (SecurityException e) { this.loadClass(…);

} }

public LSDbug (int x) { super(); // throws Security Exception }}

Page 11: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

11

Bootstrapping the VM

• Need to bootstrap the virtual machine

• Certain classes providing policy enforcement need full trust– Infinite recursion if checks needed on all

classes

Lesson 2: Least Privileges

Page 12: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

12

Bootstrapping the VM

• Java 1.0– Fully trusted code on CLASSPATH– Current Java versions have

bootclasspath for backwards compatibility

• .NET’s trusted path is a cache of signed files

Page 13: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

13

Location-based Vulnerability[Hopwood, 1996]

• Netscape cached files on local filesystem

• Guessing cached file names could allow arbitrary code execution

• Applet could execute cached files located on CLASSPATH

Page 14: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

14

Monitoring Execution

Lesson 3: Fail-safe Defaults and Complete Mediation

Page 15: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

15

Monitoring Execution

• Want policy extensible but complicates policy enforcement– Java 1.0 (HotJava) and 1.1 had all or nothing

trust for applets

• Reference monitor should be tamper-proof and always be invoked

Page 16: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

16

Reference Monitor’s Enforcement

• Java’s reference monitor, the SecurityManager may be bypassed

SecurityManager sm = System.getSecurityManager();if (sm != null) {sm.checkListen(21); // listen on port 21?

}

• .NET’s SecurityManager cannot be inherited or instantiated

Page 17: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

17

Failure to Monitor Vulnerability[Brumleve, 2000]

• SecurityManager.checkListen() allows creation of a ServerSocket object

• Flaw in ServerSocket.implAccept(Socket s)– Accepts connection to get remote address and port

number– Calls socket’s close() and throws

SecurityException if permissions violated– Subclass of Socket can override close() to keep

socket open

Page 18: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

18

Principles Review• Keep it simple

– Object initialization– .jsr/swap vulnerability (see paper)

• Least privileges– Bootstrapping the VM– Stack Inspection

• Fail-safe Defaults and Complete Mediation– Brown Orifice– DoS attacks– Union/Intersection in Policy Resolution

Page 19: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

19

Conclusions• Classic security principles still important today

• Hard to follow them in real systems– Easier to find complex solutions than simple ones– Tradeoffs between security and other goals

• Complete Mediation vs. Efficiency (policy expressiveness)

• Simplicity vs. Backwards compatibility (bootclasspath)

• Fail-safe defaults vs. Usability (Default Policies)

• Some reasons for optimism

Page 20: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

20

Questions

?

Page 21: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

21

Conclusions

• Why do we still have problems today?– Security vs. Efficiency– Defense in Depth vs. Simplicity [McGraw,

Viega]– Flexibility vs. Simplicity

• Evaluate principles in context [McGraw, Viega]

Page 22: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

22

Object Initialization Vulnerability [lsd-pl.net]

• <init>()LSDbug →<init>(I)LSDbug → com/ms/security/SecurityClassLoader/<init>()LSDbug

• Security exception occurs (caught by <init>()LSDbug) since code does not have permission to instantiate ClassLoader

Page 23: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

23

Granted Permissions in Policies• Permissions are granted, not excluded• Java’s policy is the union of all granted

permissions• .Net policy is the intersection of a 4-level

hierarchical policy– Enterprise– Machine– User– AppDomain

Lesson 3: Fail-safe defaults in Permission Resolution

Page 24: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

24

Static/Dynamic Permissions

• Policy enforcement can be optimized– Need flexibility

• Static permissions– Must be known before run-time– Faster checking possible

• Dynamic– Can change on-the-fly– Checks delayed until run-time

Lesson 3: Fail-safe Defaults

Page 25: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

25

Policy Implementation: Static/Dynamic Permissions

Granted in class loaders (e.g., AppletClassLoader)

Attached to assemblies and can be checked before run-time

Union of all permissions in policy files

Intersection of permissions in policy files

Sta

tic

Dy

nam

ic

Java .Net

Page 26: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

26

notes

• Emphasize overall point (talk of analysis of lessons learned… one sentence – slide 2)

• Pointer• Don’t flip between overall pic• Make sure point out vulnerability is on Java• Wrap up each section (at end of vulnerability) better• Have better transitions• Mention a couple more of the s & s principles• Look more at audience• Point out no significant security vulnerabilities in .Net

(double check)

Page 27: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

27

notes

• More principles– Defense in depth– Chain is only strong as weakest link– Secure failure (not seen in Java’s exceptions!)– Compartmentalization– Choke points (narrow interface to system)– Usability– Trust community (open design crytpo)– No security through obscurity– Educate user

Page 28: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

28

Object Initialization Vulnerability [lsd-pl.net]

• LSDbug child class of SecurityClassLoader• Call constructor, call constructor, call

superclass constructor (exception occurs)

newdupinvokespecial LSDbug()

…invokespecial LSDbug(int)

…invokespecial SecurityClassLoader()

Page 29: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

29

Object Initialization Vulnerability[lsd-pl.net]

• MSIE 4.0, 5.0, 6.0

• Create object of a security-critical class to escalate privileges

• Similar bug in Sun and Netscape implementations

Page 30: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

30

Verifier is (should be) Conservative

.NET/Java programs

Safe programs

Verifiable programs

Page 31: Security: Lessons Learned and Missed from Java Nathanael Paul David Evans {nate,evans}@cs.virginia.edu University of Virginia ACSAC 2004.

31

Complexity Increases Risk

.NET/Java programs

Safe programs

Verifiable programs

Bug