6.2. Java VM Security and Class File Verification
The
lowest level of the Java security architecture involves the design of
the Java Virtual Machine and the byte codes it executes. The Java VM
does not allow any kind of direct access to individual memory
addresses of the underlying system, which prevents Java code from
interfering with the native hardware and operating system. These
intentional restrictions on the VM are reflected in the Java language
itself, which does not support pointers or pointer arithmetic. The
language does not allow an integer to be cast to an object reference
or vice versa, and there is no way whatsoever to obtain an
object's address in memory. Without capabilities
like these, malicious code simply cannot gain a foothold.
In addition to the secure
design of the Virtual Machine instruction set, the VM goes through a
process known as byte-code
verification whenever it loads an untrusted
class. This process ensures that the byte codes of a class (and their
operands) are all valid; that the code never underflows or overflows
the VM stack; that local variables are not used before they are
initialized; that field, method, and class access control modifiers
are respected; and so on. The verification step is designed to
prevent the VM from executing byte codes that might crash it or put
it into an undefined and untested state where it might be vulnerable
to other attacks by malicious code. Byte-code verification is a
defense against malicious hand-crafted Java byte codes and untrusted
Java compilers that might output invalid byte codes.
|