Skip to content

Commit fa8c457

Browse files
committed
move the TextEncoder and Buffer jose.base64url taint steps to a local query taint step
1 parent 60aa711 commit fa8c457

File tree

2 files changed

+20
-40
lines changed

2 files changed

+20
-40
lines changed

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

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -56,20 +56,6 @@ private module JsonWebToken {
5656
* Provides classes and predicates modeling the `jose` library.
5757
*/
5858
private module Jose {
59-
/**
60-
* A taint-step for `succ = jose.base64url.encode(pred)` or `succ = jose.base64url.decode(pred)`.
61-
*/
62-
private class Base64urlStep extends TaintTracking::SharedTaintStep, DataFlow::SharedFlowStep {
63-
override predicate step(DataFlow::Node pred, DataFlow::Node succ) {
64-
exists(API::Node n |
65-
n = API::moduleImport("jose").getMember("base64url").getMember(["decode", "encode"])
66-
|
67-
pred = n.getACall().getArgument(0) and
68-
succ = n.getACall()
69-
)
70-
}
71-
}
72-
7359
/**
7460
* The asymmetric key or symmetric secret for verifying a JWT as a `CredentialsNode`.
7561
*/
@@ -162,29 +148,3 @@ private module PassportJwt {
162148
override string getCredentialsKind() { result = "key" }
163149
}
164150
}
165-
166-
/**
167-
* A taint-step for `succ = new TextEncoder().encode(pred)`.
168-
*/
169-
private class TextEncoderStep extends TaintTracking::SharedTaintStep, DataFlow::SharedFlowStep {
170-
override predicate step(DataFlow::Node pred, DataFlow::Node succ) {
171-
172-
exists(DataFlow::CallNode n | n = DataFlow::globalVarRef("TextEncoder").getAnInstantiation().getAMemberCall("encode") |
173-
pred = n.getArgument(0) and
174-
succ = n and
175-
n.getLocation().getFile().getRelativePath().matches("%HardcodedCredentials.js%")
176-
)
177-
}
178-
}
179-
180-
/**
181-
* A taint-step for `succ = Buffer.from(pred, "base64")`.
182-
*/
183-
private class BufferFromStep extends TaintTracking::SharedTaintStep, DataFlow::SharedFlowStep {
184-
override predicate step(DataFlow::Node pred, DataFlow::Node succ) {
185-
exists(DataFlow::CallNode n | n = DataFlow::globalVarRef("Buffer").getAMemberCall("from") |
186-
pred = n.getArgument(0) and
187-
succ = [n, n.getAChainedMethodCall(["toString", "toJSON"])]
188-
)
189-
}
190-
}

javascript/ql/lib/semmle/javascript/security/dataflow/HardcodedCredentialsQuery.qll

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,5 +54,25 @@ class Configuration extends DataFlow::Configuration {
5454
src = n.getParameter(0).getMember(["x", "y", "n"]).asSink() and
5555
trg = n.getReturn().getPromised().asSource()
5656
)
57+
or
58+
exists(DataFlow::CallNode n |
59+
n = DataFlow::globalVarRef("TextEncoder").getAnInstantiation().getAMemberCall("encode")
60+
|
61+
src = n.getArgument(0) and
62+
trg = n and
63+
n.getLocation().getFile().getRelativePath().matches("%HardcodedCredentials.js%")
64+
)
65+
or
66+
exists(DataFlow::CallNode n | n = DataFlow::globalVarRef("Buffer").getAMemberCall("from") |
67+
src = n.getArgument(0) and
68+
trg = [n, n.getAChainedMethodCall(["toString", "toJSON"])]
69+
)
70+
or
71+
exists(API::Node n |
72+
n = API::moduleImport("jose").getMember("base64url").getMember(["decode", "encode"])
73+
|
74+
src = n.getACall().getArgument(0) and
75+
trg = n.getACall()
76+
)
5777
}
5878
}

0 commit comments

Comments
 (0)