Skip to content

Commit f274f06

Browse files
authored
Merge pull request #7409 from asgerf/js/track-functions-with-methods
Approved by erik-krogh
2 parents acbf791 + b336c29 commit f274f06

File tree

4 files changed

+52
-12
lines changed

4 files changed

+52
-12
lines changed

javascript/ql/lib/semmle/javascript/dataflow/internal/CallGraphs.qll

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,9 @@ module CallGraph {
7979
cls.getAClassReference(t.continue()) = result
8080
)
8181
or
82-
exists(DataFlow::ObjectLiteralNode object, string prop |
82+
exists(DataFlow::SourceNode object, string prop |
8383
function = object.getAPropertySource(prop) and
84-
result = getAnObjectLiteralRef(object).getAPropertyRead(prop) and
84+
result = getAnAllocationSiteRef(object).getAPropertyRead(prop) and
8585
t.start()
8686
)
8787
or
@@ -203,21 +203,26 @@ module CallGraph {
203203
)
204204
or
205205
exists(DataFlow::ObjectLiteralNode object, string name |
206-
ref = getAnObjectLiteralRef(object).getAPropertyRead(name) and
206+
ref = getAnAllocationSiteRef(object).getAPropertyRead(name) and
207207
result = object.getPropertyGetter(name)
208208
or
209-
ref = getAnObjectLiteralRef(object).getAPropertyWrite(name) and
209+
ref = getAnAllocationSiteRef(object).getAPropertyWrite(name) and
210210
result = object.getPropertySetter(name)
211211
)
212212
}
213213

214-
private predicate shouldTrackObjectLiteral(DataFlow::ObjectLiteralNode node) {
214+
private predicate shouldTrackObjectWithMethods(DataFlow::SourceNode node) {
215215
(
216+
(
217+
node instanceof DataFlow::ObjectLiteralNode
218+
or
219+
node instanceof DataFlow::FunctionNode
220+
) and
216221
node.getAPropertySource() instanceof DataFlow::FunctionNode
217222
or
218-
exists(node.getPropertyGetter(_))
223+
exists(node.(DataFlow::ObjectLiteralNode).getPropertyGetter(_))
219224
or
220-
exists(node.getPropertySetter(_))
225+
exists(node.(DataFlow::ObjectLiteralNode).getPropertySetter(_))
221226
) and
222227
not node.getTopLevel().isExterns()
223228
}
@@ -228,14 +233,14 @@ module CallGraph {
228233
* To avoid false flow from callbacks passed in via "named parameters", we only track object
229234
* literals out of returns, not into calls.
230235
*/
231-
private StepSummary objectLiteralStep() { result = LevelStep() or result = ReturnStep() }
236+
private StepSummary objectWithMethodsStep() { result = LevelStep() or result = ReturnStep() }
232237

233-
/** Gets a node that refers to the given object literal, via a limited form of type tracking. */
238+
/** Gets a node that refers to the given object, via a limited form of type tracking. */
234239
cached
235-
DataFlow::SourceNode getAnObjectLiteralRef(DataFlow::ObjectLiteralNode node) {
236-
shouldTrackObjectLiteral(node) and
240+
DataFlow::SourceNode getAnAllocationSiteRef(DataFlow::SourceNode node) {
241+
shouldTrackObjectWithMethods(node) and
237242
result = node
238243
or
239-
StepSummary::step(getAnObjectLiteralRef(node), result, objectLiteralStep())
244+
StepSummary::step(getAnAllocationSiteRef(node), result, objectWithMethodsStep())
240245
}
241246
}

javascript/ql/test/library-tests/TaintTracking/BasicTaintTracking.expected

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ typeInferenceMismatch
8181
| exceptions.js:144:9:144:16 | source() | exceptions.js:132:8:132:27 | returnThrownSource() |
8282
| exceptions.js:150:13:150:20 | source() | exceptions.js:153:10:153:10 | e |
8383
| exceptions.js:158:13:158:20 | source() | exceptions.js:161:10:161:10 | e |
84+
| factory-function.js:21:13:21:20 | source() | factory-function.js:7:10:7:12 | obj |
85+
| factory-function.js:22:13:22:20 | source() | factory-function.js:7:10:7:12 | obj |
86+
| factory-function.js:26:7:26:14 | source() | factory-function.js:16:14:16:16 | obj |
87+
| factory-function.js:27:7:27:14 | source() | factory-function.js:16:14:16:16 | obj |
8488
| getters-and-setters.js:6:20:6:27 | source() | getters-and-setters.js:9:10:9:18 | new C().x |
8589
| getters-and-setters.js:6:20:6:27 | source() | getters-and-setters.js:13:18:13:20 | c.x |
8690
| getters-and-setters.js:27:15:27:22 | source() | getters-and-setters.js:23:18:23:18 | v |

javascript/ql/test/library-tests/TaintTracking/DataFlowTracking.expected

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@
4343
| exceptions.js:144:9:144:16 | source() | exceptions.js:132:8:132:27 | returnThrownSource() |
4444
| exceptions.js:150:13:150:20 | source() | exceptions.js:153:10:153:10 | e |
4545
| exceptions.js:158:13:158:20 | source() | exceptions.js:161:10:161:10 | e |
46+
| factory-function.js:21:13:21:20 | source() | factory-function.js:7:10:7:12 | obj |
47+
| factory-function.js:22:13:22:20 | source() | factory-function.js:7:10:7:12 | obj |
48+
| factory-function.js:26:7:26:14 | source() | factory-function.js:16:14:16:16 | obj |
49+
| factory-function.js:27:7:27:14 | source() | factory-function.js:16:14:16:16 | obj |
4650
| getters-and-setters.js:6:20:6:27 | source() | getters-and-setters.js:9:10:9:18 | new C().x |
4751
| getters-and-setters.js:6:20:6:27 | source() | getters-and-setters.js:13:18:13:20 | c.x |
4852
| getters-and-setters.js:27:15:27:22 | source() | getters-and-setters.js:23:18:23:18 | v |
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import * as dummy from 'dummy';
2+
3+
var objectA = function(){
4+
return {};
5+
}
6+
objectA.set = function (obj){
7+
sink(obj);
8+
};
9+
10+
function factory() {
11+
var objectB = function(){
12+
return {};
13+
}
14+
15+
objectB.set = function (obj){
16+
sink(obj); // NOT OK
17+
};
18+
return objectB;
19+
}
20+
21+
objectA.set(source());
22+
objectA.set(source());
23+
24+
factory();
25+
b = factory();
26+
b.set(source())
27+
b.set(source())

0 commit comments

Comments
 (0)