|
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