GitHub
CERT Secure Coding

LCK05-J. Synchronize access to static fields that can be modified by untrusted code

Methods that can both modify a static field and be invoked from untrusted code must synchronize access to the static field. Even when client-side locking is a specified requirement of the method, untrusted clients can fail to synchronize (whether inadvertently or maliciously). Because the static field is shared by all clients, untrusted clients may violate the contract by failing to provide suitable locking.

According to Joshua Bloch [ Bloch 2008 ]:

If a method modifies a static field, you must synchronize access to this field, even if the method is typically used only by a single thread. It is not possible for clients to perform external synchronization on such a method because there can be no guarantee that unrelated clients will do likewise.

Documented design intent is irrelevant when dealing with untrusted code because an attacker can always choose to ignore the documentation.

Noncompliant Code Example

This noncompliant code example fails to synchronize access to the static counter field:

Non-compliant code
/* This class is not thread-safe */
public final class CountHits {
  private static int counter;

  public void incrementCounter() {
    counter++;
  }
}

This class definition complies with VNA02-J. Ensure that compound operations on shared variables are atomic , which applies only to classes that promise thread-safety . However, this class has a mutable static counter field that is modified by the publicly accessible incrementCounter() method. Consequently, this class cannot be used securely by trusted client code because untrusted code can purposely fail to externally synchronize access to the field.

Compliant Solution

This compliant solution uses a static private final lock to protect the counter field and consequently lacks any dependence on external synchronization. This solution also complies with LCK00-J. Use private final lock objects to synchronize classes that may interact with untrusted code .

Compliant code
/* This class is thread-safe */
public final class CountHits {
  private static int counter;
  private static final Object lock = new Object();

  public void incrementCounter() {
    synchronized (lock) {
      counter++;
    }
  }
}

Risk Assessment

Failure to internally synchronize access to static fields that can be modified by untrusted code risks incorrect synchronization because the author of the untrusted code can inadvertently or maliciously ignore the synchronization policy.

Rule Severity Likelihood Detectable Repairable Priority Level
LCK05-J Low Probable No No P2 L3

Automated Detection

ToolVersionCheckerDescription
CodeSonar
9.0p0

JAVA.CONCURRENCY.UG.METH

Unguarded method

Klocwork

2025.2

SV.SHARED.VAR
Parasoft Jtest
2025.2
CERT.LCK05.IASFInspect accesses to "static" fields which may require synchronization
MITRE CWECWE-820 , Missing Synchronization

Bibliography

[ API 2014 ]


[ Bloch 2008 ]

Item 67, "Avoid Excessive Synchronization"