Skip to content

Commit b96edb9

Browse files
Add Sensitive Result Receiver query
1 parent 18a815c commit b96edb9

File tree

2 files changed

+76
-0
lines changed

2 files changed

+76
-0
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/** Definitions for the sensitive result receiver query. */
2+
3+
import java
4+
import semmle.code.java.dataflow.TaintTracking2
5+
import semmle.code.java.dataflow.FlowSources
6+
import semmle.code.java.security.SensitiveActions
7+
8+
private class ResultReceiverSendCall extends MethodAccess {
9+
ResultReceiverSendCall() {
10+
this.getMethod()
11+
.getASourceOverriddenMethod*()
12+
.hasQualifiedName("android.os", "ResultReceiver", "send")
13+
}
14+
15+
Expr getReceiver() { result = this.getQualifier() }
16+
17+
Expr getSentData() { result = this.getArgument(1) }
18+
}
19+
20+
private class UntrustedResultReceiverConf extends TaintTracking2::Configuration {
21+
UntrustedResultReceiverConf() { this = "UntrustedResultReceiverConf" }
22+
23+
override predicate isSource(DataFlow::Node node) { node instanceof RemoteFlowSource }
24+
25+
override predicate isSink(DataFlow::Node node) {
26+
node.asExpr() = any(ResultReceiverSendCall c).getReceiver()
27+
}
28+
}
29+
30+
private predicate untrustedResultReceiverSend(DataFlow::Node src, ResultReceiverSendCall call) {
31+
any(UntrustedResultReceiverConf c).hasFlow(src, DataFlow::exprNode(call.getReceiver()))
32+
}
33+
34+
private class SensitiveResultReceiverConf extends TaintTracking::Configuration {
35+
SensitiveResultReceiverConf() { this = "SensitiveResultReceiverConf" }
36+
37+
override predicate isSource(DataFlow::Node node) { node.asExpr() instanceof SensitiveExpr }
38+
39+
override predicate isSink(DataFlow::Node node) {
40+
exists(ResultReceiverSendCall call |
41+
untrustedResultReceiverSend(_, call) and
42+
node.asExpr() = call.getSentData()
43+
)
44+
}
45+
}
46+
47+
predicate sensitiveResultReceiver(
48+
DataFlow::PathNode src, DataFlow::PathNode sink, DataFlow::Node recSrc
49+
) {
50+
exists(ResultReceiverSendCall call, SensitiveResultReceiverConf conf |
51+
conf.hasFlowPath(src, sink) and
52+
sink.getNode().asExpr() = call.getSentData() and
53+
untrustedResultReceiverSend(recSrc, call)
54+
)
55+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/**
2+
* @name Leaking sensitive information through a ResultReceiver
3+
* @description An Android application obtains a ResultReceiver from a
4+
* third-party component and uses it to send sensitive data
5+
* @kind path-problem
6+
* @problem.severity error
7+
* @security-severity 8.2
8+
* @precision mediums
9+
* @id java/android/sensitive-result-receiver
10+
* @tags security
11+
* external/cwe/cwe-927
12+
*/
13+
14+
import java
15+
import semmle.code.java.security.SensitiveResultReceiverQuery
16+
import DataFlow::PathGraph
17+
18+
from DataFlow::PathNode src, DataFlow::PathNode sink, DataFlow::Node recSrc
19+
where sensitiveResultReceiver(src, sink, recSrc)
20+
select sink, src, sink, "This $@ is sent to a ResultReceiver obtained from $@.", src,
21+
"sensitive information", recSrc, "this untrusted source"

0 commit comments

Comments
 (0)