Skip to content

Commit 05b1bd8

Browse files
authored
Merge pull request github#12852 from egregius313/egregius313/java/webgoat/model-jwsheader
Java: Model `io.jsonwebtoken.SigningKeyResolverAdapter` and `io.jsonwebtoken.JwsHeader`
2 parents 9558522 + 0c604b1 commit 05b1bd8

File tree

9 files changed

+156
-1
lines changed

9 files changed

+156
-1
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* Added models for the `io.jsonwebtoken` library.
5+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
extensions:
2+
- addsTo:
3+
pack: codeql/java-all
4+
extensible: summaryModel
5+
data:
6+
- ["io.jsonwebtoken", "JwsHeader", True, "getAlgorithm", "", "", "Argument[this].SyntheticField[io.jsonwebtoken.JwsHeader.algorithm]", "ReturnValue", "taint", "manual"]
7+
- ["io.jsonwebtoken", "JwsHeader", True, "setAlgorithm", "", "", "Argument[0]", "Argument[this].SyntheticField[io.jsonwebtoken.JwsHeader.algorithm]", "taint", "manual"]
8+
- ["io.jsonwebtoken", "JwsHeader", True, "getKeyId", "", "", "Argument[this].SyntheticField[io.jsonwebtoken.JwsHeader.keyId]", "ReturnValue", "taint", "manual"]
9+
- ["io.jsonwebtoken", "JwsHeader", True, "setKeyId", "", "", "Argument[0]", "Argument[this].SyntheticField[io.jsonwebtoken.JwsHeader.keyId]", "taint", "manual"]
10+
- addsTo:
11+
pack: codeql/java-all
12+
extensible: sourceModel
13+
data:
14+
- ["io.jsonwebtoken", "SigningKeyResolver", True, "resolveSigningKey", "", "", "Parameter[0]", "remote", "manual"]
15+
- ["io.jsonwebtoken", "SigningKeyResolverAdapter", True, "resolveSigningKeyBytes", "", "", "Parameter[0]", "remote", "manual"]

java/ql/lib/semmle/code/java/dataflow/FlowSteps.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ private module Frameworks {
1818
private import semmle.code.java.frameworks.ApacheHttp
1919
private import semmle.code.java.frameworks.guava.Guava
2020
private import semmle.code.java.frameworks.Guice
21+
private import semmle.code.java.frameworks.IoJsonWebToken
2122
private import semmle.code.java.frameworks.jackson.JacksonSerializability
2223
private import semmle.code.java.frameworks.Properties
2324
private import semmle.code.java.frameworks.Protobuf
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/** Predicates and classes to reason about the `io.jsonwebtoken` library. */
2+
3+
import java
4+
private import semmle.code.java.dataflow.DataFlow
5+
private import semmle.code.java.dataflow.FlowSteps
6+
7+
private class JwsHeaderFieldsInheritTaint extends DataFlow::SyntheticFieldContent,
8+
TaintInheritingContent
9+
{
10+
JwsHeaderFieldsInheritTaint() { this.getField().matches("io.jsonwebtoken.JwsHeader.%") }
11+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import java.security.Key;
2+
3+
import io.jsonwebtoken.Claims;
4+
import io.jsonwebtoken.JwsHeader;
5+
import io.jsonwebtoken.SigningKeyResolverAdapter;
6+
7+
public class JwsSigningKeyResolverAdapter extends SigningKeyResolverAdapter {
8+
private void sink(Object o) {
9+
}
10+
11+
@Override
12+
public Key resolveSigningKey(JwsHeader header, Claims claims) {
13+
final String keyId = header.getKeyId();
14+
String example = "example:" + keyId;
15+
sink(example); // $ hasRemoteTaintFlow
16+
return null;
17+
}
18+
19+
@Override
20+
public byte[] resolveSigningKeyBytes(JwsHeader header, Claims claims) {
21+
final String keyId = header.getKeyId();
22+
String example = "example:" + keyId;
23+
24+
sink(example); // $ hasRemoteTaintFlow
25+
26+
final String algorithm = header.getAlgorithm();
27+
sink("algo:" + algorithm); // $ hasRemoteTaintFlow
28+
29+
final String random = (String)header.get("random");
30+
sink("random:" + random) ; // $ hasRemoteTaintFlow
31+
32+
return new byte[0];
33+
}
34+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
//semmle-extractor-options: --javac-args -cp ${testdir}/../../../stubs/servlet-api-2.4:${testdir}/../../../stubs/springframework-5.3.8:${testdir}/../../../stubs/google-android-9.0.0:${testdir}/../../../stubs/playframework-2.6.x:${testdir}/../../../stubs/jackson-databind-2.12:${testdir}/../../../stubs/jackson-core-2.12:${testdir}/../../../stubs/akka-2.6.x
1+
//semmle-extractor-options: --javac-args -cp ${testdir}/../../../stubs/servlet-api-2.4:${testdir}/../../../stubs/springframework-5.3.8:${testdir}/../../../stubs/google-android-9.0.0:${testdir}/../../../stubs/playframework-2.6.x:${testdir}/../../../stubs/jackson-databind-2.12:${testdir}/../../../stubs/jackson-core-2.12:${testdir}/../../../stubs/akka-2.6.x:${testdir}/../../../stubs/jwtk-jjwt-0.11.2

java/ql/test/stubs/jwtk-jjwt-0.11.2/io/jsonwebtoken/JwsHeader.java

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

java/ql/test/stubs/jwtk-jjwt-0.11.2/io/jsonwebtoken/SigningKeyResolver.java

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

java/ql/test/stubs/jwtk-jjwt-0.11.2/io/jsonwebtoken/SigningKeyResolverAdapter.java

Lines changed: 81 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)