Skip to content

Commit 534ab86

Browse files
author
Sauyon Lee
committed
Add models for Spring validation.Errors
1 parent fe2b73e commit 534ab86

File tree

4 files changed

+97
-0
lines changed

4 files changed

+97
-0
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
lgtm,codescanning
2+
* Added additional taint steps modeling the Spring `validation.Errors` class (`org.springframework.validation.Errors`).

java/ql/src/semmle/code/java/frameworks/spring/Spring.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import semmle.code.java.frameworks.spring.SpringConstructorArg
1212
import semmle.code.java.frameworks.spring.SpringController
1313
import semmle.code.java.frameworks.spring.SpringDescription
1414
import semmle.code.java.frameworks.spring.SpringEntry
15+
import semmle.code.java.frameworks.spring.SpringErrors
1516
import semmle.code.java.frameworks.spring.SpringFlex
1617
import semmle.code.java.frameworks.spring.SpringIdRef
1718
import semmle.code.java.frameworks.spring.SpringImport
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/** Definitions of flow steps through utility methods of `org.springframework.validation.Errors`. */
2+
3+
import java
4+
private import semmle.code.java.dataflow.ExternalFlow
5+
6+
private class SpringErrorModel extends SummaryModelCsv {
7+
override predicate row(string row) {
8+
row =
9+
[
10+
"org.springframework.validation;Errors;true;addAllErrors;;;Argument[0];Argument[-1];taint",
11+
"org.springframework.validation;Errors;true;getAllErrors;;;Argument[-1];ReturnValue;taint",
12+
"org.springframework.validation;Errors;true;getFieldError;;;Argument[-1];ReturnValue;taint",
13+
"org.springframework.validation;Errors;true;getFieldErrors;;;Argument[-1];ReturnValue;taint",
14+
"org.springframework.validation;Errors;true;getGlobalError;;;Argument[-1];ReturnValue;taint",
15+
"org.springframework.validation;Errors;true;getGlobalErrors;;;Argument[-1];ReturnValue;taint",
16+
"org.springframework.validation;Errors;true;reject;;;Argument[0..2];Argument[-1];taint",
17+
"org.springframework.validation;Errors;true;rejectValue;;;Argument[1..3];Argument[-1];taint",
18+
"org.springframework.validation;Errors;true;reject;;;Argument[0..2];Argument[-1];taint",
19+
"org.springframework.validation;Errors;true;rejectValue;;;Argument[1..3];Argument[-1];taint"
20+
]
21+
}
22+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import org.springframework.validation.Errors;
2+
3+
class ValidationErrorsTest {
4+
String taint() { return "tainted"; }
5+
6+
Errors taintErrs() { return null; }
7+
Errors errors() { return null; }
8+
9+
void sink(Object o) {}
10+
11+
void test() {
12+
Errors es0 = errors();
13+
es0.addAllErrors(taintErrs());
14+
sink(es0); // $hasTaintFlow
15+
16+
sink(taintErrs().getAllErrors()); // $hasTaintFlow
17+
18+
sink(taintErrs().getFieldError()); // $hasTaintFlow
19+
sink(taintErrs().getFieldError("field")); // $hasTaintFlow
20+
21+
sink(taintErrs().getGlobalError()); // $hasTaintFlow
22+
sink(taintErrs().getGlobalErrors()); // $hasTaintFlow
23+
24+
Errors es1 = errors();
25+
es1.reject(taint());
26+
sink(es1); // $hasTaintFlow
27+
28+
Errors es2 = errors();
29+
es2.reject(taint(), null, "");
30+
sink(es2); // $hasTaintFlow
31+
32+
Errors es3 = errors();
33+
es3.reject(taint(), new Object[]{}, "");
34+
sink(es3); // $hasTaintFlow
35+
36+
Errors es4 = errors();
37+
es4.reject("", new Object[]{taint()}, "");
38+
sink(es4); // $hasTaintFlow
39+
40+
Errors es5 = errors();
41+
es5.reject("", new Object[]{}, taint());
42+
sink(es5); // $hasTaintFlow
43+
44+
Errors es6 = errors();
45+
es6.reject(taint(), "");
46+
sink(es6); // $hasTaintFlow
47+
48+
Errors es7 = errors();
49+
es7.reject("", taint());
50+
sink(es7); // $hasTaintFlow
51+
52+
Errors es8 = errors();
53+
es8.rejectValue("", taint(), new Object[]{}, "");
54+
sink(es8); // $hasTaintFlow
55+
56+
Errors es9 = errors();
57+
es9.rejectValue("", "", new Object[]{taint()}, "");
58+
sink(es9); // $hasTaintFlow
59+
60+
Errors es10 = errors();
61+
es10.rejectValue("", "", new Object[]{}, taint());
62+
sink(es10); // $hasTaintFlow
63+
64+
Errors es11 = errors();
65+
es11.rejectValue("", taint(), "");
66+
sink(es11); // $hasTaintFlow
67+
68+
Errors es12 = errors();
69+
es12.rejectValue("", "", taint());
70+
sink(es12); // $hasTaintFlow
71+
}
72+
}

0 commit comments

Comments
 (0)