Use of a potentially dangerous function¶
ID: java/potentially-dangerous-function
Kind: problem
Security severity: 10.0
Severity: warning
Precision: medium
Tags:
- reliability
- security
- external/cwe/cwe-676
Query suites:
- java-security-extended.qls
- java-security-and-quality.qls
Click to see the query in the CodeQL repository
This rule finds calls to methods that are dangerous to use. Currently, it checks for calls to Thread.stop
.
Stopping a thread with Thread.stop
causes it to receive a ThreadDeath
exception. That exception propagates up the stack, releasing all monitors that the thread was holding. In some cases the relevant code will be protected by catching the ThreadDeath
exception and cleaning up, but because the exception can potentially be thrown from so very many locations, it is impractical to catch all such cases. As a result, calling Thread.stop
is likely to result in corrupt data.
Recommendation¶
The best solution is usually to provide an alternate communication mechanism for the thread that might need to be interrupted early. For example, Oracle gives the following example of using a volatile variable to communicate whether the worker thread should exit:
private volatile Thread blinker;
public void stop() {
blinker = null;
}
public void run() {
Thread thisThread = Thread.currentThread();
while (blinker == thisThread) {
try {
Thread.sleep(interval);
} catch (InterruptedException e){
}
repaint();
}
}
It is also possible to use Thread.interrupt
and to catch and handle InterruptedException
when it occurs. However, it can be difficult to handle an InterruptedException
everywhere it might occur; for example, the sample code above simply discards the exception rather than actually exiting the thread.
Another strategy is to use message passing, for example via a BlockingQueue
. In addition to passing the worker thread its ordinary work via such a message queue, the worker can be asked to exit by a particular kind of message being sent on the queue.
References¶
SEI CERT Oracle Coding Standard for Java: THI05-J. Do not use Thread.stop() to terminate threads.
Java API Specification: Java Thread Primitive Deprecation.
Java API Specification: Thread.interrupt, BlockingQueue.
Common Weakness Enumeration: CWE-676.