Java Inner Classes Insecure?
"Craig E. Ward" <[email protected]> Wed, 24 Nov 2004 10:33:46 -0800
| Newsgroups | gmane.comp.security.programming |
|---|---|
| Message-ID | <p06200702bdca7bb3d5f1@[192.168.123.158]> |
If the list needs something to talk about, I have a question about Java and inner classes. (Back in 2000 there was a Security Focus thread on this topic, but things may have changed.) Some of the security guidelines contain an item that inner classes (or at least public, non-static inner classes) are to be avoided. The alleged problem is that a Java compiler has to change the access modifiers of any members accessed by the inner class because the JVM can't treat an inner class any differently from a regular class. A private member will be recast into package scope, that is, what a class as marked as private becomes accessible to any class in the package. As far as I can tell, this item comes from a set of guidelines written by Gary McGraw and Edward Felten back in 1998. (http://www.javaworld.com/javaworld/jw-12-1998/jw-12-securityrules_p.html) I don't have a Java 1.1 compiler to experiment with, but the Java 1.4 compilers (Sun's javac and IBM's jikes) do not seem to actually change the access specifier, according to javap.) What these compilers do is add new static access methods that the inner classes can call to do things with the private members of the outer class. The inner class gets an extra member that is a reference to the outer class so it knows which instance of the outer class it belongs to. The counter argument asserts that what this really shows is that the Java language is treating all class members orthogonally, which is a good thing. A class member is a class member. (In C++, inner classes do not get this access to the outer class automatically. This is an indicator that C++ is less orthogonal in its treatment of class members and this is a weakness in the language.) Although I haven't actually made it work, it seems to me that calls to these access methods used by the inner classes could be inserted into third party classes. Does anyone know of a case where this has been done? Are the problems with inner classes historical or do they still exist? Craig -- Internet: [email protected] "There are 10 kinds of people in the world: Those who understand binary and those who don't."