github / github/codeql

Support Java wait/notify pattern

Aperta
#6,296 5 commenti 0 reazioni 0 assegnatari Vedi su GitHub
Java question
Lingua principale
CodeQL
Stelle
10.1k
Fork
2.1k
Merge medio
2g 15h
PR unite (30g)
141

Descrizione

In some cases, CodeQL may not be able to follow a data flow where tainted data is stored in a class field on a synchronized block which then calls `notify` or `notifyAll` to awake a thread which in turn end up using the tainted field into a sink.

A good example is the code injection vulnerability described in this [SonarSource Blog post](https://blog.sonarsource.com/code-vulnerabilities-in-nsa-application-revealed).

I was able to get the issue reported by adding a new TaintStep which models the wait/notify pattern by connecting fields writes on a synchronized version calling `notify` with the same field reads on a synchronized version calling `wait`:

```ql
class NotifyWaitTaintStep extends TaintTracking::AdditionalTaintStep {
override predicate step(DataFlow::Node n1, DataFlow::Node n2) {
exists(MethodAccess notify, RefType t, MethodAccess wait, SynchronizedStmt notifySync, SynchronizedStmt waitSync |

notify.getMethod().getName() = ["notify", "notifyAll"] and
notify.getAnEnclosingStmt() = notifySync and
notifySync.getExpr().getType() = t and

wait.getMethod().getName() = "wait" and
wait.getAnEnclosingStmt() = waitSync and
waitSync.getExpr().getType() = t and

exists(AssignExpr write, FieldAccess read, Field f |
write.getAnEnclosingStmt() = notifySync and
write.getDest().(FieldAccess).getField() = f and
write = n1.asExpr() and

read.getAnEnclosingStmt() = waitSync and
read.getField() = f and
read = n2.asExpr()
)
)
}
}
```

The taint step may need improvements though, but I think is a good starting point.

Guida per i contributori

Apri la guida per i contributori

Valutazione

Questa issue non è ancora stata valutata.

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.