|
1 | | -//semmle-extractor-options: --javac-args -cp ${testdir}/../../../stubs/jwtk-jjwt-0.11.2 |
2 | | - |
3 | 1 | import io.jsonwebtoken.Jwts; |
4 | 2 | import io.jsonwebtoken.JwtParser; |
5 | 3 | import io.jsonwebtoken.Jwt; |
|
9 | 7 | import io.jsonwebtoken.JwtHandlerAdapter; |
10 | 8 | import io.jsonwebtoken.impl.DefaultJwtParser; |
11 | 9 |
|
12 | | -public class MissingJWTSignatureCheck { |
13 | | - |
14 | | - |
15 | | - // SIGNED |
| 10 | +public class MissingJWTSignatureCheckTest { |
16 | 11 |
|
17 | 12 | private JwtParser getASignedParser() { |
18 | 13 | return Jwts.parser().setSigningKey("someBase64EncodedKey"); |
@@ -46,10 +41,6 @@ private void callSignedParsers() { |
46 | 41 | goodJwtHandler(parser3, ""); |
47 | 42 | } |
48 | 43 |
|
49 | | - // SIGNED END |
50 | | - |
51 | | - // UNSIGNED |
52 | | - |
53 | 44 | private JwtParser getAnUnsignedParser() { |
54 | 45 | return Jwts.parser(); |
55 | 46 | } |
@@ -84,81 +75,63 @@ private void callUnsignedParsers() { |
84 | 75 |
|
85 | 76 | private void signParserAfterParseCall() { |
86 | 77 | JwtParser parser = getAnUnsignedParser(); |
87 | | - parser.parse(""); // Should not be detected |
| 78 | + parser.parse(""); // Safe |
88 | 79 | parser.setSigningKey("someBase64EncodedKey"); |
89 | 80 | } |
90 | 81 |
|
91 | | - // UNSIGNED END |
92 | | - |
93 | | - // INDIRECT |
94 | | - |
95 | 82 | private void badJwtOnParserBuilder(JwtParser parser, String token) { |
96 | | - parser.parse(token); // BAD: Does not verify the signature |
| 83 | + parser.parse(token); // $hasMissingJwtSignatureCheck |
97 | 84 | } |
98 | 85 |
|
99 | 86 | private void badJwtHandlerOnParserBuilder(JwtParser parser, String token) { |
100 | | - parser.parse(token, new JwtHandlerAdapter<Jwt<Header, String>>() { // BAD: The handler is called on an unverified JWT |
101 | | - @Override |
102 | | - public Jwt<Header, String> onPlaintextJwt(Jwt<Header, String> jwt) { |
103 | | - return jwt; |
104 | | - } |
105 | | - }); |
| 87 | + parser.parse(token, new JwtHandlerAdapter<Jwt<Header, String>>() { // $hasMissingJwtSignatureCheck |
| 88 | + @Override |
| 89 | + public Jwt<Header, String> onPlaintextJwt(Jwt<Header, String> jwt) { |
| 90 | + return jwt; |
| 91 | + } |
| 92 | + }); |
106 | 93 | } |
107 | 94 |
|
108 | 95 | private void goodJwtOnParserBuilder(JwtParser parser, String token) { |
109 | | - parser.parseClaimsJws(token) // GOOD: Verify the signature |
110 | | - .getBody(); |
| 96 | + parser.parseClaimsJws(token) // Safe |
| 97 | + .getBody(); |
111 | 98 | } |
112 | 99 |
|
113 | 100 | private void goodJwtHandler(JwtParser parser, String token) { |
114 | | - parser.parse(token, new JwtHandlerAdapter<Jws<String>>() { // GOOD: The handler is called on a verified JWS |
115 | | - @Override |
116 | | - public Jws<String> onPlaintextJws(Jws<String> jws) { |
117 | | - return jws; |
118 | | - } |
119 | | - }); |
| 101 | + parser.parse(token, new JwtHandlerAdapter<Jws<String>>() { // Safe |
| 102 | + @Override |
| 103 | + public Jws<String> onPlaintextJws(Jws<String> jws) { |
| 104 | + return jws; |
| 105 | + } |
| 106 | + }); |
120 | 107 | } |
121 | 108 |
|
122 | | - // INDIRECT END |
123 | | - |
124 | | - // DIRECT |
125 | | - |
126 | 109 | private void badJwtOnParserBuilder(String token) { |
127 | | - Jwts.parserBuilder() |
128 | | - .setSigningKey("someBase64EncodedKey").build() |
129 | | - .parse(token); // BAD: Does not verify the signature |
| 110 | + Jwts.parserBuilder().setSigningKey("someBase64EncodedKey").build().parse(token); // $hasMissingJwtSignatureCheck |
130 | 111 | } |
131 | 112 |
|
132 | 113 | private void badJwtHandlerOnParser(String token) { |
133 | | - Jwts.parser() |
134 | | - .setSigningKey("someBase64EncodedKey") |
135 | | - .parse(token, new JwtHandlerAdapter<Jwt<Header, String>>() { // BAD: The handler is called on an unverified JWT |
136 | | - @Override |
137 | | - public Jwt<Header, String> onPlaintextJwt(Jwt<Header, String> jwt) { |
138 | | - return jwt; |
139 | | - } |
140 | | - }); |
| 114 | + Jwts.parser().setSigningKey("someBase64EncodedKey").parse(token, // $hasMissingJwtSignatureCheck |
| 115 | + new JwtHandlerAdapter<Jwt<Header, String>>() { |
| 116 | + @Override |
| 117 | + public Jwt<Header, String> onPlaintextJwt(Jwt<Header, String> jwt) { |
| 118 | + return jwt; |
| 119 | + } |
| 120 | + }); |
141 | 121 | } |
142 | 122 |
|
143 | 123 | private void goodJwtOnParser(String token) { |
144 | | - Jwts.parser() |
145 | | - .setSigningKey("someBase64EncodedKey") |
146 | | - .parseClaimsJws(token) // GOOD: Verify the signature |
147 | | - .getBody(); |
| 124 | + Jwts.parser().setSigningKey("someBase64EncodedKey").parseClaimsJws(token) // Safe |
| 125 | + .getBody(); |
148 | 126 | } |
149 | 127 |
|
150 | 128 | private void goodJwtHandlerOnParserBuilder(String token) { |
151 | | - Jwts.parserBuilder() |
152 | | - .setSigningKey("someBase64EncodedKey").build() |
153 | | - .parse(token, new JwtHandlerAdapter<Jws<String>>() { // GOOD: The handler is called on a verified JWS |
154 | | - @Override |
155 | | - public Jws<String> onPlaintextJws(Jws<String> jws) { |
156 | | - return jws; |
157 | | - } |
158 | | - }); |
| 129 | + Jwts.parserBuilder().setSigningKey("someBase64EncodedKey").build().parse(token, // Safe |
| 130 | + new JwtHandlerAdapter<Jws<String>>() { |
| 131 | + @Override |
| 132 | + public Jws<String> onPlaintextJws(Jws<String> jws) { |
| 133 | + return jws; |
| 134 | + } |
| 135 | + }); |
159 | 136 | } |
160 | | - |
161 | | - // DIRECT END |
162 | | - |
163 | | - |
164 | 137 | } |
0 commit comments