Skip to content

Commit 0c4f08c

Browse files
committed
refactor the CredentialsExpr to be a dataflow node
1 parent c5b1588 commit 0c4f08c

File tree

16 files changed

+74
-71
lines changed

16 files changed

+74
-71
lines changed

javascript/ql/lib/semmle/javascript/frameworks/AWS.qll

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,19 @@ module AWS {
88
/**
99
* Holds if the `i`th argument of `invk` is an object hash for `AWS.Config`.
1010
*/
11-
private predicate takesConfigurationObject(InvokeExpr invk, int i) {
11+
private predicate takesConfigurationObject(DataFlow::InvokeNode invk, int i) {
1212
exists(DataFlow::ModuleImportNode mod | mod.getPath() = "aws-sdk" |
1313
// `AWS.config.update(nd)`
14-
invk = mod.getAPropertyRead("config").getAMemberCall("update").asExpr() and
14+
invk = mod.getAPropertyRead("config").getAMemberCall("update") and
1515
i = 0
1616
or
1717
exists(DataFlow::SourceNode cfg | cfg = mod.getAConstructorInvocation("Config") |
1818
// `new AWS.Config(nd)`
19-
invk = cfg.asExpr() and
19+
invk = cfg and
2020
i = 0
2121
or
2222
// `var config = new AWS.Config(...); config.update(nd);`
23-
invk = cfg.getAMemberCall("update").asExpr() and
23+
invk = cfg.getAMemberCall("update") and
2424
i = 0
2525
)
2626
)
@@ -29,13 +29,13 @@ module AWS {
2929
/**
3030
* An expression that is used as an AWS config value: `{ accessKeyId: <user>, secretAccessKey: <password>}`.
3131
*/
32-
class Credentials extends CredentialsExpr {
32+
class Credentials extends CredentialsNode {
3333
string kind;
3434

3535
Credentials() {
36-
exists(string prop, InvokeExpr invk, int i |
36+
exists(string prop, DataFlow::InvokeNode invk, int i |
3737
takesConfigurationObject(invk, i) and
38-
invk.hasOptionArgument(i, prop, this)
38+
this = invk.getOptionArgument(i, prop)
3939
|
4040
prop = "accessKeyId" and kind = "user name"
4141
or

javascript/ql/lib/semmle/javascript/frameworks/Azure.qll

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@ module Azure {
88
/**
99
* An expression that is used for authentication at Azure`.
1010
*/
11-
class Credentials extends CredentialsExpr {
11+
class Credentials extends CredentialsNode {
1212
string kind;
1313

1414
Credentials() {
15-
exists(CallExpr mce, string methodName |
16-
(methodName = "loginWithUsernamePassword" or methodName = "loginWithServicePrincipalSecret") and
17-
mce = DataFlow::moduleMember("ms-rest-azure", methodName).getACall().asExpr()
15+
exists(DataFlow::CallNode mce |
16+
mce =
17+
DataFlow::moduleMember("ms-rest-azure",
18+
["loginWithUsernamePassword", "loginWithServicePrincipalSecret"]).getACall()
1819
|
1920
this = mce.getArgument(0) and kind = "user name"
2021
or

javascript/ql/lib/semmle/javascript/frameworks/ClientRequests.qll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -270,16 +270,16 @@ module ClientRequest {
270270
}
271271

272272
/** An expression that is used as a credential in a request. */
273-
private class AuthorizationHeader extends CredentialsExpr {
273+
private class AuthorizationHeader extends CredentialsNode {
274274
AuthorizationHeader() {
275275
exists(DataFlow::PropWrite write | write.getPropertyName().regexpMatch("(?i)authorization") |
276-
this = write.getRhs().asExpr()
276+
this = write.getRhs()
277277
)
278278
or
279279
exists(DataFlow::MethodCallNode call | call.getMethodName() = ["append", "set"] |
280280
call.getNumArgument() = 2 and
281281
call.getArgument(0).getStringValue().regexpMatch("(?i)authorization") and
282-
this = call.getArgument(1).asExpr()
282+
this = call.getArgument(1)
283283
)
284284
}
285285

javascript/ql/lib/semmle/javascript/frameworks/Connect.qll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,12 +101,12 @@ module Connect {
101101
}
102102

103103
/** An expression that is passed as `basicAuthConnect(<user>, <password>)`. */
104-
class Credentials extends CredentialsExpr {
104+
class Credentials extends CredentialsNode {
105105
string kind;
106106

107107
Credentials() {
108-
exists(CallExpr call |
109-
call = DataFlow::moduleImport("basic-auth-connect").getAnInvocation().asExpr() and
108+
exists(DataFlow::CallNode call |
109+
call = DataFlow::moduleImport("basic-auth-connect").getAnInvocation() and
110110
call.getNumArgument() = 2
111111
|
112112
this = call.getArgument(0) and kind = "user name"

javascript/ql/lib/semmle/javascript/frameworks/Credentials.qll

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,38 @@
66
import javascript
77

88
/**
9+
* DEPRECATED: Use `CredentialsNode` instead.
910
* An expression whose value is used to supply credentials such
1011
* as a user name, a password, or a key.
1112
*/
12-
abstract class CredentialsExpr extends Expr {
13+
deprecated class CredentialsExpr extends Expr {
14+
CredentialsNode node;
15+
16+
CredentialsExpr() { node.asExpr() = this }
17+
18+
/**
19+
* Gets a description of the kind of credential this expression is used as,
20+
* such as `"user name"`, `"password"`, `"key"`.
21+
*/
22+
deprecated string getCredentialsKind() { result = node.getCredentialsKind() }
23+
}
24+
25+
/**
26+
* An expression whose value is used to supply credentials such
27+
* as a user name, a password, or a key.
28+
*/
29+
abstract class CredentialsNode extends DataFlow::Node {
1330
/**
1431
* Gets a description of the kind of credential this expression is used as,
1532
* such as `"user name"`, `"password"`, `"key"`.
1633
*/
1734
abstract string getCredentialsKind();
1835
}
1936

20-
private class CredentialsFromModel extends CredentialsExpr {
37+
private class CredentialsFromModel extends CredentialsNode {
2138
string kind;
2239

23-
CredentialsFromModel() {
24-
this = ModelOutput::getASinkNode("credentials[" + kind + "]").asSink().asExpr()
25-
}
40+
CredentialsFromModel() { this = ModelOutput::getASinkNode("credentials[" + kind + "]").asSink() }
2641

2742
override string getCredentialsKind() { result = kind }
2843
}

javascript/ql/lib/semmle/javascript/frameworks/CryptoLibraries.qll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,9 @@ abstract class CryptographicKeyCreation extends DataFlow::Node {
4646
}
4747

4848
/**
49-
* A key used in a cryptographic algorithm, viewed as a `CredentialsExpr`.
49+
* A key used in a cryptographic algorithm, viewed as a `CredentialsNode`.
5050
*/
51-
class CryptographicKeyCredentialsExpr extends CredentialsExpr {
52-
CryptographicKeyCredentialsExpr() { this = any(CryptographicKey k).asExpr() }
53-
51+
class CryptographicKeyCredentialsExpr extends CredentialsNode instanceof CryptographicKey {
5452
override string getCredentialsKind() { result = "key" }
5553
}
5654

javascript/ql/lib/semmle/javascript/frameworks/DigitalOcean.qll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ module DigitalOcean {
88
/**
99
* An expression that is used for authentication at DigitalOcean: `digitalocean.client(<token>)`.
1010
*/
11-
class Credentials extends CredentialsExpr {
11+
class Credentials extends CredentialsNode {
1212
string kind;
1313

1414
Credentials() {
15-
exists(CallExpr mce |
16-
mce = DataFlow::moduleMember("digitalocean", "client").getACall().asExpr()
15+
exists(DataFlow::CallNode mce |
16+
mce = DataFlow::moduleMember("digitalocean", "client").getACall()
1717
|
1818
this = mce.getArgument(0) and kind = "token"
1919
)

javascript/ql/lib/semmle/javascript/frameworks/Express.qll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -995,7 +995,7 @@ module Express {
995995
}
996996

997997
/** An expression that is passed as `expressBasicAuth({ users: { <user>: <password> }})`. */
998-
class Credentials extends CredentialsExpr {
998+
class Credentials extends CredentialsNode {
999999
string kind;
10001000

10011001
Credentials() {
@@ -1006,9 +1006,9 @@ module Express {
10061006
usersSrc.flowsTo(call.getOptionArgument(0, "users")) and
10071007
usersSrc.flowsTo(pwn.getBase())
10081008
|
1009-
this = pwn.getPropertyNameExpr() and kind = "user name"
1009+
this = pwn.getPropertyNameExpr().flow() and kind = "user name"
10101010
or
1011-
this = pwn.getRhs().asExpr() and kind = "password"
1011+
this = pwn.getRhs() and kind = "password"
10121012
)
10131013
)
10141014
}

javascript/ql/lib/semmle/javascript/frameworks/JWT.qll

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,10 @@ private module JsonWebToken {
4040
}
4141

4242
/**
43-
* The private key for a JWT as a `CredentialsExpr`.
43+
* The private key for a JWT as a `CredentialsNode`.
4444
*/
45-
private class JwtKey extends CredentialsExpr {
46-
JwtKey() {
47-
this = DataFlow::moduleMember("jsonwebtoken", "sign").getACall().getArgument(1).asExpr()
48-
}
45+
private class JwtKey extends CredentialsNode {
46+
JwtKey() { this = DataFlow::moduleMember("jsonwebtoken", "sign").getACall().getArgument(1) }
4947

5048
override string getCredentialsKind() { result = "key" }
5149
}

javascript/ql/lib/semmle/javascript/frameworks/NoSQL.qll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -496,13 +496,11 @@ private module Mongoose {
496496
/**
497497
* An expression passed to `mongoose.createConnection` to supply credentials.
498498
*/
499-
class Credentials extends CredentialsExpr {
499+
class Credentials extends CredentialsNode {
500500
string kind;
501501

502502
Credentials() {
503-
exists(string prop |
504-
this = createConnection().getParameter(3).getMember(prop).asSink().asExpr()
505-
|
503+
exists(string prop | this = createConnection().getParameter(3).getMember(prop).asSink() |
506504
prop = "user" and kind = "user name"
507505
or
508506
prop = "pass" and kind = "password"

0 commit comments

Comments
 (0)