Skip to content

Commit d7a8b30

Browse files
committed
Add the first draft of working query
1 parent fbc4be8 commit d7a8b30

File tree

5 files changed

+58
-18
lines changed

5 files changed

+58
-18
lines changed

javascript/frameworks/ui5/ext/ui5.model.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ extensions:
7070
- ["UI5ClientStorage", "global", "Member[jQuery].Member[sap].Member[storage]"]
7171
- ["UI5ClientStorage", "sap/ui/core/util/File", ""]
7272
- ["UI5ClientStorage", "global", "Member[sap].Member[ui].Member[core].Member[util].Member[File]"]
73+
# Publishing and Subscribing to Events
74+
- ["UI5PublishedEventData", "sap/ui/core/EventBus", "Member[getInstance].ReturnValue.Member[publish].Argument[2]"]
75+
- ["UI5EventSubscriptionHandlerDataParameter", "sap/ui/core/EventBus", "Member[getInstance].ReturnValue.Member[subscribe].Argument[2].Parameter[2]"]
7376

7477
- addsTo:
7578
pack: codeql/javascript-all

javascript/frameworks/ui5/lib/advanced_security/javascript/frameworks/ui5/UI5.qll

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import javascript
22
import DataFlow
33
import advanced_security.javascript.frameworks.ui5.JsonParser
4+
import advanced_security.javascript.frameworks.ui5.dataflow.TypeTrackers
45
import semmle.javascript.security.dataflow.DomBasedXssCustomizations
56
import advanced_security.javascript.frameworks.ui5.UI5View
67
import advanced_security.javascript.frameworks.ui5.UI5HTML
@@ -1427,19 +1428,3 @@ class PropertyMetadata extends ObjectLiteralNode {
14271428
inSameWebApp(this.getFile(), result.getFile())
14281429
}
14291430
}
1430-
1431-
module TypeTrackers {
1432-
private SourceNode hasDependency(TypeTracker t, string dependencyPath) {
1433-
t.start() and
1434-
exists(UserModule d |
1435-
d.getADependency() = dependencyPath and
1436-
result = d.getRequiredObject(dependencyPath).asSourceNode()
1437-
)
1438-
or
1439-
exists(TypeTracker t2 | result = hasDependency(t2, dependencyPath).track(t2, t))
1440-
}
1441-
1442-
SourceNode hasDependency(string dependencyPath) {
1443-
result = hasDependency(TypeTracker::end(), dependencyPath)
1444-
}
1445-
}

javascript/frameworks/ui5/lib/advanced_security/javascript/frameworks/ui5/dataflow/FlowSteps.qll

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,3 +366,10 @@ class LogArgumentToListener extends DataFlow::SharedFlowStep {
366366
logArgumentToListener(start, end)
367367
}
368368
}
369+
370+
class PublishedEventToEventSubscribedEventData extends DataFlow::SharedFlowStep {
371+
override predicate step(DataFlow::Node start, DataFlow::Node end) {
372+
start = ModelOutput::getATypeNode("UI5PublishedEventData").getInducingNode() and
373+
end = ModelOutput::getATypeNode("UI5EventSubscriptionHandlerDataParameter").getInducingNode()
374+
}
375+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import javascript
2+
import DataFlow
3+
4+
module TypeTrackers {
5+
private SourceNode hasDependency(TypeTracker t, string dependencyPath) {
6+
t.start() and
7+
exists(UserModule d |
8+
d.getADependency() = dependencyPath and
9+
result = d.getRequiredObject(dependencyPath).asSourceNode()
10+
)
11+
or
12+
exists(TypeTracker t2 | result = hasDependency(t2, dependencyPath).track(t2, t))
13+
}
14+
15+
SourceNode hasDependency(string dependencyPath) {
16+
result = hasDependency(TypeTracker::end(), dependencyPath)
17+
}
18+
19+
private MethodCallNode getOwnerComponentRef(TypeTracker t, CustomController customController) {
20+
customController.getAThisNode() = result.getReceiver() and
21+
result.getMethodName() = "getOwnerComponent"
22+
or
23+
exists(TypeTracker t2 | result = getOwnerComponentRef(t2, customController).track(t2, t))
24+
}
25+
26+
/* owner component ref */
27+
MethodCallNode getOwnerComponentRef(CustomController customController) {
28+
result = getOwnerComponentRef(TypeTracker::end(), customController)
29+
}
30+
31+
private class ObjFieldStep extends SharedTypeTrackingStep {
32+
override predicate step(DataFlow::Node start, DataFlow::Node end) {
33+
exists(SapExtendCall sapExtendCall, ObjectLiteralNode wrappedObject, string name |
34+
wrappedObject = sapExtendCall.getContent() and
35+
start = getAnAlias(wrappedObject).getAPropertyWrite(name).getRhs() and
36+
end = getAnAlias(wrappedObject).getAPropertyRead(name)
37+
)
38+
}
39+
}
40+
41+
private DataFlow::SourceNode getAnAlias(DataFlow::SourceNode object) {
42+
result = object
43+
or
44+
result = getAnAlias(object).getAPropertySource().(DataFlow::FunctionNode).getReceiver()
45+
}
46+
}

javascript/frameworks/ui5/test/queries/UI5Xss/xss-eventbus-with-data/webapp/controller/app.controller.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,4 @@ sap.ui.define([
3232
oHtmlOutput.setContent(model.message);
3333
}
3434
});
35-
}
36-
);
35+
});

0 commit comments

Comments
 (0)