Java security
The Java platform provides a number of features designed for improving the security of Java applications. This includes enforcing runtime constraints through the use of the Java Virtual Machine, a security manager that sandboxes untrusted code from the rest of the operating system, and a suite of security APIs that Java developers can utilise. Despite this, criticism has been directed at the programming language, and Oracle, due to an increase in malicious programs that revealed security vulnerabilities in the JVM, which were subsequently not properly addressed by Oracle in a timely manner.
Security features
The JVM
The binary form of programs running on the Java platform is not native machine code but an intermediate bytecode. The JVM performs verification on this bytecode before running it to prevent the program from performing unsafe operations such as branching to incorrect locations, which may contain data rather than instructions. It also allows the JVM to enforce runtime constraints such as array bounds checking. This means that Java programs are significantly less likely to suffer from memory safety flaws such as buffer overflow than programs written in languages such as C which do not provide such memory safety guarantees.The platform does not allow programs to perform certain potentially unsafe operations such as pointer arithmetic or unchecked type casts. It also does not allow manual control over memory allocation and deallocation; users are required to rely on the automatic garbage collection provided by the platform. This also contributes to type safety and memory safety.
Security manager
The platform provides a security manager which allows users to run untrusted bytecode in a "sandboxed" environment designed to protect them from malicious or poorly written software by preventing the untrusted code from accessing certain platform features and APIs. For example, untrusted code might be prevented from reading or writing files on the local filesystem, running arbitrary commands with the current user's privileges, accessing communication networks, accessing the internal private state of objects using reflection, or causing the JVM to exit.The security manager also allows Java programs to be cryptographically signed; users can choose to allow code with a valid digital signature from a trusted entity to run with full privileges in circumstances where it would otherwise be untrusted.
Users can also set fine-grained access control policies for programs from different sources. For example, a user may decide that only system classes should be fully trusted, that code from certain trusted entities may be allowed to read certain specific files, and that all other code should be fully sandboxed.
Security APIs
The Java Class Library provides a number of APIs related to security, such as standard cryptographic algorithms, authentication, and secure communication protocols.Potential sources of security vulnerabilities in Java applications
There are a number of possible sources of security vulnerabilities in Java applications, some of which are common to non-Java applications and some of which are specific to the Java platform.Examples of potential sources of vulnerability common to Java and non-Java applications are:
- Vulnerabilities in the protection mechanisms provided by the hardware or operating system which the application relies upon for its security
- Vulnerabilities in native libraries, such as the C standard library, which may be used to implement the application and/or runtime
- Vulnerabilities caused purely by errors in user programs
- Vulnerabilities in the sandboxing mechanism which allow untrusted bytecode to circumvent the restrictions imposed by the security manager
- Vulnerabilities in the Java class library which an application relies upon for its security
For example, a hypothetical security flaw which affects only the security manager sandboxing mechanism of a particular JVM implementation would mean that only Java applications which run arbitrary untrusted bytecode would be compromised: applications where the user fully trusts and controls all bytecode being executed would not. This would mean that, say, a web browser plugin based on that JVM would be vulnerable to malicious applets downloaded from public websites, but a server-side web application running on the same version of the JVM where the administrator has full control over the classpath would be unaffected.
As with non-Java applications, security vulnerabilities can stem from parts of the platform which may not initially appear to be security-related. For example, in 2011, Oracle issued a security fix for a bug in the Double.parseDouble method. This method converts a string such as "12.34" into the equivalent double-precision floating point number. The bug caused this method to enter an infinite loop when called on a specific input. This bug had security implications, because for example if a web server converts a string typed into a form by the user using this method, a malicious user could type in the string which triggers the bug. This would cause the web server thread processing the malicious request to enter an infinite loop and become unavailable for serving requests from other users. Doing this repeatedly to a vulnerable web server would be an easy denial-of-service attack: all the web server's threads for responding to user requests would soon be stuck in the infinite loop and the web server would be unable to serve any legitimate users at all.
Criticism of security manager
The security manager in the Java platform has been criticized in recent years for making users vulnerable to malware, especially in web browser plugins which execute Java applets downloaded from public websites, more informally known as "Java in the browser".Oracle's efforts to address these vulnerabilities resulted in a delay to the release of Java 8.
2012
An OS X trojan referred to as Flashback exploited a vulnerability in Java, which had not been patched by Apple, although Oracle had already released a patch. In April, Apple later released a removal tool for Lion users without Java. With Java 7 Update 4, Oracle began to release Java directly for Lion and later.In October, Apple released an update that removed the Java plugin from all browsers. This was seen as a move by Apple to distance OS X from Java.
2013
In January, a zero-day vulnerability was found in all versions of Java 7, including the latest version Java 7 Update 10, which was already exploited in the wild. The vulnerability was caused by a patch to fix an earlier vulnerability. In response, Apple blacklisted the latest version of the Java plugin. Oracle released a patch within three days. Microsoft also released a patch for Internet Explorer versions 6, 7, and 8.Cyberespionage malware Red October was found exploiting a Java vulnerability that was patched in October 2011. The website for Reporters Without Borders was also compromised by a Java vulnerability in versions prior to Update 11.
After the release of Update 11, another vulnerability began circulating online, which was later confirmed. It was also found that Java's security mode itself was vulnerable due to a bug. In response, Mozilla disabled Java in Firefox by default, while Apple blacklisted the latest Java plugin again.
In February, Twitter reported that it had shut down an attack. Twitter advised users to disable Java, although it did not explain why. Later in the month, Facebook reported that it had been hacked by a zero-day Java attack. Apple also reported an attack. It was found that a breach of an iPhone developer forum was used to attack Twitter, Facebook, and Apple. The forum itself was unaware of the breach. Following Twitter, Facebook, and Apple, Microsoft reported that it was also similarly compromised.
Another vulnerability discovered allowed for the Java security sandbox to be completely bypassed in the original release of Java 7, as well as Updates 11 and 15. In March, trojan called McRat was found exploiting a zero-day Java vulnerability. Oracle then released another patch to address the vulnerability.