...
Classes that are not sensitive but maintain other invariants must be sensitive to the possibility of malicious subclasses accessing or manipulating their data and possibly invalidating their invariants. See rule "OBJ08-J. Provide mutable classes with copy functionality to allow passing instances to untrusted code safely" for more information.
Noncompliant Code Example
This noncompliant code example defines class SensitiveClass
which contains a character array used to internally hold a file name, along with a Boolean
shared variable, initialized to false
. This data is not meant to be copied; consequently, SensitiveClass
lacks a copy constructor.
...
The malicious class creates its own instance (ms1
) and produces a second one (ms2
) by cloning the first. It then obtains a new String
filename
object by invoking the get()
method on the first instance. At this point, the shared
flag is set to true
. Because the second instance (ms2
) does not have its shared flag set to true
, it is possible to alter the first instance ms1
using the replace()
method. This obviates any security efforts and severely violates the class's invariants.
Compliant Solution (final
class)
The easiest way to prevent malicious subclasses is to declare SensitiveClass
to be final.
Code Block | ||
---|---|---|
| ||
final class SensitiveClass { // ... } |
Compliant Solution (final
clone()
)
Sensitive classes should not implement the Cloneable
interface nor provide a copy constructor. Sensitive classes that extend from a superclass that implements Cloneable
(and is cloneable as a result) must provide a clone()
method that throws a CloneNotSupportedException
. This exception must be caught and handled by the client code. A sensitive class that does not implement Cloneable
must also follow this advice because it inherits the clone()
method from Object
. The class can prevent subclasses from being cloneable by defining a final
clone()
method that fails.
...
This class fails to prevent malicious subclasses but does protect the data in SensitiveClass
. Its methods are protected by being declared final
. For more information on how to handle malicious subclasses, see rule "OBJ08-J. Provide mutable classes with copy functionality to allow passing instances to untrusted code safely."
Risk Assessment
Failure to make sensitive classes non-copyable can permit violations of class invariants and provide malicious subclasses with the opportunity to exploit the code to create new instances of objects, even in the presence of the default security manager (in the absence of custom security checks).
Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
---|---|---|---|---|---|
OBJ03-J | medium | probable | medium | P8 | L2 |
Bibliography
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="693888a54d1652b4-90c014a6-44974f70-a18392fc-d71463f97736f365dcccf287"><ac:plain-text-body><![CDATA[ | [[McGraw 1998 | AA. Bibliography#Mcgraw 98]] | Twelve rules for developing more secure Java code | ]]></ac:plain-text-body></ac:structured-macro> | ||
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="fa6362bc4cf1b2d7-d39eb74a-45d04fbd-a45b8b1d-86001c348d44519d031ae667"><ac:plain-text-body><![CDATA[ | [[MITRE 2009 | AA. Bibliography#MITRE 09]] | [CWE-498 | http://cwe.mitre.org/data/definitions/498.html] "Cloneable Class Containing Sensitive Information", [CWE-491 | http://cwe.mitre.org/data/definitions/491.html] "Public cloneable() Method Without Final (aka 'Object Hijack')" | ]]></ac:plain-text-body></ac:structured-macro> |
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="45785a0bce366d0d-77baf27f-4a234db6-8fe68aa3-99daccafda2a4286bf6d65b8"><ac:plain-text-body><![CDATA[ | [[Wheeler 2003 | AA. Bibliography#Wheeler 03]] | 10.6. Java | ]]></ac:plain-text-body></ac:structured-macro> |
...