github / github/codeql

Support Java wait/notify pattern

オープン
#6,296 コメント 5 件 リアクション 0 件 担当者 0 名 GitHub で見る
Java question
主要言語
CodeQL
スター
10.1k
フォーク
2.1k
平均マージ
2日 15時間
マージ済み PR(30日)
141

説明

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.

コントリビューションガイド

コントリビューションガイドを開く

評価

この issue はまだ評価されていません。

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。