Callers can trivially access and modify public non-final static fields. Neither accesses nor modifications can be checked by a SecurityManager, and newly set values can not be validated. Furthermore multiple threads can modify non-final public static data in ways that are not consistent.
Noncompliant code example
This is an example from the JDK 1.4.2 software.Function Table
package org.apache.xpath.compiler; public class FunctionTable { public static FuncLoader m_functions; }
An attacker can replace the function table as follows
FunctionTable.m_functions = <new_table>;
Replacing the function table gives the attacker access to the XPathContext used to evaluate XPath expression. Static variables are global across a Java runtime environment. They can be used as a communication channel between different application domains (e.g. by code loaded into different class loaders) .
There are a few ways this problem can be avoided.
Compliant Solution
Treat public static fields as constants and declare them as final. Consider the use of enum types.
package org.apache.xpath.compiler; public class FunctionTable { public static final FuncLoader m_functions; }
... public static final FuncLoader m_functions; ...
Additionally for mutable static state one can define assessor methods and add appropriate security checks.
public class MyClass { private static byte[] data; public static byte[] getData() { return data.clone(); } public static void setData(byte[] b) { securityCheck(); data = b.clone(); } }
Risk Assessment
Unauthorized modifications to public static variables can result in unexpected behavior and can bypass important security checks and/or invoke malicious code.
Rule |
Severity |
Likelihood |
Remediation Cost |
Priority |
Level |
---|---|---|---|---|---|
OBJ31-J |
high |
likely |
low |
P9 |
L2 |
References
Avoiding Antipatterns Antipattern 5, Misusing Public Static Variables
Java Secure Coding Guidelines Section 3.1, Treat public static fields as constants
Function Table Field detail, public static FuncLoader m_functions