Skip to content

Commit 9351688

Browse files
authored
Python: asCfgNode cleanup
1 parent c386f4a commit 9351688

File tree

11 files changed

+79
-99
lines changed

11 files changed

+79
-99
lines changed

python/ql/src/Security/CWE-327/PyOpenSSL.qll

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ class PyOpenSSLContextCreation extends ContextCreation, DataFlow::CallCfgNode {
1313
}
1414

1515
override string getProtocol() {
16-
exists(ControlFlowNode protocolArg, PyOpenSSL pyo |
17-
protocolArg in [node.getArg(0), node.getArgByName("method")]
16+
exists(DataFlow::Node protocolArg, PyOpenSSL pyo |
17+
protocolArg in [this.getArg(0), this.getArgByName("method")]
1818
|
19-
protocolArg =
20-
[pyo.specific_version(result).getAUse(), pyo.unspecific_version(result).getAUse()]
21-
.asCfgNode()
19+
protocolArg in [
20+
pyo.specific_version(result).getAUse(), pyo.unspecific_version(result).getAUse()
21+
]
2222
)
2323
}
2424
}
@@ -29,7 +29,7 @@ class ConnectionCall extends ConnectionCreation, DataFlow::CallCfgNode {
2929
}
3030

3131
override DataFlow::CfgNode getContext() {
32-
result.getNode() in [node.getArg(0), node.getArgByName("context")]
32+
result in [this.getArg(0), this.getArgByName("context")]
3333
}
3434
}
3535

@@ -43,8 +43,8 @@ class SetOptionsCall extends ProtocolRestriction, DataFlow::CallCfgNode {
4343
}
4444

4545
override ProtocolVersion getRestriction() {
46-
API::moduleImport("OpenSSL").getMember("SSL").getMember("OP_NO_" + result).getAUse().asCfgNode() in [
47-
node.getArg(0), node.getArgByName("options")
46+
API::moduleImport("OpenSSL").getMember("SSL").getMember("OP_NO_" + result).getAUse() in [
47+
this.getArg(0), this.getArgByName("options")
4848
]
4949
}
5050
}

python/ql/src/Security/CWE-327/Ssl.qll

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,14 @@ class SSLContextCreation extends ContextCreation, DataFlow::CallCfgNode {
1111
SSLContextCreation() { this = API::moduleImport("ssl").getMember("SSLContext").getACall() }
1212

1313
override string getProtocol() {
14-
exists(ControlFlowNode protocolArg, Ssl ssl |
15-
protocolArg in [node.getArg(0), node.getArgByName("protocol")]
14+
exists(DataFlow::Node protocolArg, Ssl ssl |
15+
protocolArg in [this.getArg(0), this.getArgByName("protocol")]
1616
|
1717
protocolArg =
1818
[ssl.specific_version(result).getAUse(), ssl.unspecific_version(result).getAUse()]
19-
.asCfgNode()
2019
)
2120
or
22-
not exists(node.getAnArg()) and
21+
not exists(this.getArg(_)) and
2322
result = "TLS"
2423
}
2524
}
@@ -133,7 +132,7 @@ class ContextSetVersion extends ProtocolRestriction, ProtocolUnrestriction, Data
133132

134133
ContextSetVersion() {
135134
exists(DataFlow::AttrWrite aw |
136-
aw.getObject().asCfgNode() = node and
135+
this = aw.getObject() and
137136
aw.getAttributeName() = "minimum_version" and
138137
aw.getValue() =
139138
API::moduleImport("ssl").getMember("TLSVersion").getMember(restriction).getAUse()

python/ql/src/experimental/semmle/python/frameworks/ClickHouseDriver.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,6 @@ module ClickHouseDriver {
8080
private class ExecuteCall extends SqlExecution::Range, DataFlow::CallCfgNode {
8181
ExecuteCall() { this.getFunction() = clickhouse_execute() }
8282

83-
override DataFlow::Node getSql() { result.asCfgNode() = node.getArg(0) }
83+
override DataFlow::Node getSql() { result = this.getArg(0) }
8484
}
8585
}

python/ql/src/semmle/python/dataflow/new/SensitiveDataSources.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ private module SensitiveDataModeling {
243243
SensitiveDataClassification classification;
244244

245245
SensitiveGetCall() {
246-
this.getFunction().asCfgNode().(AttrNode).getName() = "get" and
246+
this.getFunction().(DataFlow::AttrRef).getAttributeName() = "get" and
247247
this.getArg(0) = sensitiveLookupStringConst(classification)
248248
}
249249

python/ql/src/semmle/python/frameworks/Django.qll

Lines changed: 31 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -401,11 +401,11 @@ private module PrivateDjango {
401401
* Gets an instance of the `django.db.models.expressions.RawSQL` class,
402402
* that was initiated with the SQL represented by `sql`.
403403
*/
404-
private DataFlow::LocalSourceNode instance(DataFlow::TypeTracker t, ControlFlowNode sql) {
404+
private DataFlow::LocalSourceNode instance(DataFlow::TypeTracker t, DataFlow::Node sql) {
405405
t.start() and
406406
exists(DataFlow::CallCfgNode c | result = c |
407407
c = classRef().getACall() and
408-
c.getArg(0).asCfgNode() = sql
408+
c.getArg(0) = sql
409409
)
410410
or
411411
exists(DataFlow::TypeTracker t2 | result = instance(t2, sql).track(t2, t))
@@ -415,7 +415,7 @@ private module PrivateDjango {
415415
* Gets an instance of the `django.db.models.expressions.RawSQL` class,
416416
* that was initiated with the SQL represented by `sql`.
417417
*/
418-
DataFlow::Node instance(ControlFlowNode sql) {
418+
DataFlow::Node instance(DataFlow::Node sql) {
419419
instance(DataFlow::TypeTracker::end(), sql).flowsTo(result)
420420
}
421421
}
@@ -431,7 +431,7 @@ private module PrivateDjango {
431431
* See https://docs.djangoproject.com/en/3.1/ref/models/querysets/#annotate
432432
*/
433433
private class ObjectsAnnotate extends SqlExecution::Range, DataFlow::CallCfgNode {
434-
ControlFlowNode sql;
434+
DataFlow::Node sql;
435435

436436
ObjectsAnnotate() {
437437
this = django::db::models::querySetReturningMethod("annotate").getACall() and
@@ -440,7 +440,7 @@ private module PrivateDjango {
440440
]
441441
}
442442

443-
override DataFlow::Node getSql() { result.asCfgNode() = sql }
443+
override DataFlow::Node getSql() { result = sql }
444444
}
445445

446446
/**
@@ -449,7 +449,7 @@ private module PrivateDjango {
449449
* See https://docs.djangoproject.com/en/3.2/ref/models/querysets/#alias
450450
*/
451451
private class ObjectsAlias extends SqlExecution::Range, DataFlow::CallCfgNode {
452-
ControlFlowNode sql;
452+
DataFlow::Node sql;
453453

454454
ObjectsAlias() {
455455
this = django::db::models::querySetReturningMethod("alias").getACall() and
@@ -458,7 +458,7 @@ private module PrivateDjango {
458458
]
459459
}
460460

461-
override DataFlow::Node getSql() { result.asCfgNode() = sql }
461+
override DataFlow::Node getSql() { result = sql }
462462
}
463463

464464
/**
@@ -631,12 +631,12 @@ private module PrivateDjango {
631631
ClassInstantiation() { this = classRef().getACall() }
632632

633633
override DataFlow::Node getBody() {
634-
result.asCfgNode() in [node.getArg(0), node.getArgByName("content")]
634+
result in [this.getArg(0), this.getArgByName("content")]
635635
}
636636

637637
// How to support the `headers` argument here?
638638
override DataFlow::Node getMimetypeOrContentTypeArg() {
639-
result.asCfgNode() in [node.getArg(1), node.getArgByName("content_type")]
639+
result in [this.getArg(1), this.getArgByName("content_type")]
640640
}
641641

642642
override string getMimetypeDefault() { result = "text/html" }
@@ -695,11 +695,11 @@ private module PrivateDjango {
695695
// note that even though browsers like Chrome usually doesn't fetch the
696696
// content of a redirect, it is possible to observe the body (for example,
697697
// with cURL).
698-
result.asCfgNode() in [node.getArg(1), node.getArgByName("content")]
698+
result in [this.getArg(1), this.getArgByName("content")]
699699
}
700700

701701
override DataFlow::Node getRedirectLocation() {
702-
result.asCfgNode() in [node.getArg(0), node.getArgByName("redirect_to")]
702+
result in [this.getArg(0), this.getArgByName("redirect_to")]
703703
}
704704

705705
// How to support the `headers` argument here?
@@ -757,11 +757,11 @@ private module PrivateDjango {
757757
// note that even though browsers like Chrome usually doesn't fetch the
758758
// content of a redirect, it is possible to observe the body (for example,
759759
// with cURL).
760-
result.asCfgNode() in [node.getArg(1), node.getArgByName("content")]
760+
result in [this.getArg(1), this.getArgByName("content")]
761761
}
762762

763763
override DataFlow::Node getRedirectLocation() {
764-
result.asCfgNode() in [node.getArg(0), node.getArgByName("redirect_to")]
764+
result in [this.getArg(0), this.getArgByName("redirect_to")]
765765
}
766766

767767
// How to support the `headers` argument here?
@@ -868,7 +868,7 @@ private module PrivateDjango {
868868
ClassInstantiation() { this = classRef().getACall() }
869869

870870
override DataFlow::Node getBody() {
871-
result.asCfgNode() in [node.getArg(0), node.getArgByName("content")]
871+
result in [this.getArg(0), this.getArgByName("content")]
872872
}
873873

874874
// How to support the `headers` argument here?
@@ -922,7 +922,7 @@ private module PrivateDjango {
922922
ClassInstantiation() { this = classRef().getACall() }
923923

924924
override DataFlow::Node getBody() {
925-
result.asCfgNode() in [node.getArg(0), node.getArgByName("content")]
925+
result in [this.getArg(0), this.getArgByName("content")]
926926
}
927927

928928
// How to support the `headers` argument here?
@@ -976,7 +976,7 @@ private module PrivateDjango {
976976
ClassInstantiation() { this = classRef().getACall() }
977977

978978
override DataFlow::Node getBody() {
979-
result.asCfgNode() in [node.getArg(0), node.getArgByName("content")]
979+
result in [this.getArg(0), this.getArgByName("content")]
980980
}
981981

982982
// How to support the `headers` argument here?
@@ -1031,7 +1031,7 @@ private module PrivateDjango {
10311031

10321032
override DataFlow::Node getBody() {
10331033
// First argument is permitted methods
1034-
result.asCfgNode() in [node.getArg(1), node.getArgByName("content")]
1034+
result in [this.getArg(1), this.getArgByName("content")]
10351035
}
10361036

10371037
// How to support the `headers` argument here?
@@ -1085,7 +1085,7 @@ private module PrivateDjango {
10851085
ClassInstantiation() { this = classRef().getACall() }
10861086

10871087
override DataFlow::Node getBody() {
1088-
result.asCfgNode() in [node.getArg(0), node.getArgByName("content")]
1088+
result in [this.getArg(0), this.getArgByName("content")]
10891089
}
10901090

10911091
// How to support the `headers` argument here?
@@ -1139,7 +1139,7 @@ private module PrivateDjango {
11391139
ClassInstantiation() { this = classRef().getACall() }
11401140

11411141
override DataFlow::Node getBody() {
1142-
result.asCfgNode() in [node.getArg(0), node.getArgByName("content")]
1142+
result in [this.getArg(0), this.getArgByName("content")]
11431143
}
11441144

11451145
// How to support the `headers` argument here?
@@ -1193,7 +1193,7 @@ private module PrivateDjango {
11931193
ClassInstantiation() { this = classRef().getACall() }
11941194

11951195
override DataFlow::Node getBody() {
1196-
result.asCfgNode() in [node.getArg(0), node.getArgByName("data")]
1196+
result in [this.getArg(0), this.getArgByName("data")]
11971197
}
11981198

11991199
// How to support the `headers` argument here?
@@ -1250,7 +1250,7 @@ private module PrivateDjango {
12501250
ClassInstantiation() { this = classRef().getACall() }
12511251

12521252
override DataFlow::Node getBody() {
1253-
result.asCfgNode() in [node.getArg(0), node.getArgByName("streaming_content")]
1253+
result in [this.getArg(0), this.getArgByName("streaming_content")]
12541254
}
12551255

12561256
// How to support the `headers` argument here?
@@ -1304,7 +1304,7 @@ private module PrivateDjango {
13041304
ClassInstantiation() { this = classRef().getACall() }
13051305

13061306
override DataFlow::Node getBody() {
1307-
result.asCfgNode() in [node.getArg(0), node.getArgByName("streaming_content")]
1307+
result in [this.getArg(0), this.getArgByName("streaming_content")]
13081308
}
13091309

13101310
// How to support the `headers` argument here?
@@ -1349,14 +1349,13 @@ private module PrivateDjango {
13491349
*
13501350
* See https://docs.djangoproject.com/en/3.1/ref/request-response/#django.http.HttpResponse.write
13511351
*/
1352-
class HttpResponseWriteCall extends HTTP::Server::HttpResponse::Range, DataFlow::CfgNode {
1353-
override CallNode node;
1352+
class HttpResponseWriteCall extends HTTP::Server::HttpResponse::Range, DataFlow::CallCfgNode {
13541353
HTTP::Server::HttpResponse::Range instance;
13551354

13561355
HttpResponseWriteCall() { node.getFunction() = write(instance).asCfgNode() }
13571356

13581357
override DataFlow::Node getBody() {
1359-
result.asCfgNode() in [node.getArg(0), node.getArgByName("content")]
1358+
result in [this.getArg(0), this.getArgByName("content")]
13601359
}
13611360

13621361
override DataFlow::Node getMimetypeOrContentTypeArg() {
@@ -1639,12 +1638,10 @@ private module PrivateDjango {
16391638
DjangoUrlsPathCall() { this = django::urls::path().getACall() }
16401639

16411640
override DataFlow::Node getUrlPatternArg() {
1642-
result.asCfgNode() = [node.getArg(0), node.getArgByName("route")]
1641+
result in [this.getArg(0), this.getArgByName("route")]
16431642
}
16441643

1645-
override DataFlow::Node getViewArg() {
1646-
result.asCfgNode() in [node.getArg(1), node.getArgByName("view")]
1647-
}
1644+
override DataFlow::Node getViewArg() { result in [this.getArg(1), this.getArgByName("view")] }
16481645

16491646
override Parameter getARoutedParameter() {
16501647
// If we don't know the URL pattern, we simply mark all parameters as a routed
@@ -1739,12 +1736,10 @@ private module PrivateDjango {
17391736
}
17401737

17411738
override DataFlow::Node getUrlPatternArg() {
1742-
result.asCfgNode() = [node.getArg(0), node.getArgByName("route")]
1739+
result in [this.getArg(0), this.getArgByName("route")]
17431740
}
17441741

1745-
override DataFlow::Node getViewArg() {
1746-
result.asCfgNode() in [node.getArg(1), node.getArgByName("view")]
1747-
}
1742+
override DataFlow::Node getViewArg() { result in [this.getArg(1), this.getArgByName("view")] }
17481743
}
17491744

17501745
/**
@@ -1756,12 +1751,10 @@ private module PrivateDjango {
17561751
DjangoConfUrlsUrlCall() { this = django::conf::conf_urls::url().getACall() }
17571752

17581753
override DataFlow::Node getUrlPatternArg() {
1759-
result.asCfgNode() = [node.getArg(0), node.getArgByName("regex")]
1754+
result in [this.getArg(0), this.getArgByName("regex")]
17601755
}
17611756

1762-
override DataFlow::Node getViewArg() {
1763-
result.asCfgNode() in [node.getArg(1), node.getArgByName("view")]
1764-
}
1757+
override DataFlow::Node getViewArg() { result in [this.getArg(1), this.getArgByName("view")] }
17651758
}
17661759

17671760
// ---------------------------------------------------------------------------
@@ -1872,7 +1865,7 @@ private module PrivateDjango {
18721865
* a string identifying a view, or a Django model.
18731866
*/
18741867
override DataFlow::Node getRedirectLocation() {
1875-
result.asCfgNode() in [node.getArg(0), node.getArgByName("to")]
1868+
result in [this.getArg(0), this.getArgByName("to")]
18761869
}
18771870

18781871
override DataFlow::Node getBody() { none() }

python/ql/src/semmle/python/frameworks/Fabric.qll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ private module FabricV1 {
4848
FabricApiLocalRunSudoCall() { this = api().getMember(["local", "run", "sudo"]).getACall() }
4949

5050
override DataFlow::Node getCommand() {
51-
result.asCfgNode() = [node.getArg(0), node.getArgByName("command")]
51+
result = [this.getArg(0), this.getArgByName("command")]
5252
}
5353
}
5454
}
@@ -159,7 +159,7 @@ private module FabricV2 {
159159
}
160160

161161
override DataFlow::Node getCommand() {
162-
result.asCfgNode() = [node.getArg(0), node.getArgByName("command")]
162+
result = [this.getArg(0), this.getArgByName("command")]
163163
}
164164
}
165165

@@ -239,7 +239,7 @@ private module FabricV2 {
239239
FabricGroupRunCall() { this = fabric::group::Group::subclassInstanceRunMethod().getACall() }
240240

241241
override DataFlow::Node getCommand() {
242-
result.asCfgNode() = [node.getArg(0), node.getArgByName("command")]
242+
result = [this.getArg(0), this.getArgByName("command")]
243243
}
244244
}
245245

python/ql/src/semmle/python/frameworks/Invoke.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ private module Invoke {
8181
}
8282

8383
override DataFlow::Node getCommand() {
84-
result.asCfgNode() in [node.getArg(0), node.getArgByName("command")]
84+
result in [this.getArg(0), this.getArgByName("command")]
8585
}
8686
}
8787
}

python/ql/src/semmle/python/frameworks/PEP249.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,6 @@ private class ExecuteCall extends SqlExecution::Range, DataFlow::CallCfgNode {
123123
ExecuteCall() { this.getFunction() = execute() }
124124

125125
override DataFlow::Node getSql() {
126-
result.asCfgNode() in [node.getArg(0), node.getArgByName("sql")]
126+
result in [this.getArg(0), this.getArgByName("sql")]
127127
}
128128
}

0 commit comments

Comments
 (0)