@@ -8,6 +8,8 @@ private import semmle.code.java.security.Validation
88private import semmle.code.java.frameworks.android.Intent
99private import semmle.code.java.frameworks.Guice
1010private import semmle.code.java.frameworks.Protobuf
11+ private import semmle.code.java.frameworks.spring.SpringController
12+ private import semmle.code.java.frameworks.spring.SpringHttp
1113private import semmle.code.java.Maps
1214private import semmle.code.java.dataflow.internal.ContainerFlow
1315private import semmle.code.java.frameworks.jackson.JacksonSerializability
@@ -252,6 +254,22 @@ private predicate constructorStep(Expr tracked, ConstructorCall sink) {
252254 or
253255 // a custom InputStream that wraps a tainted data source is tainted
254256 inputStreamWrapper ( sink .getConstructor ( ) , argi )
257+ or
258+ // A SpringHttpEntity is a wrapper around a body and some headers
259+ // Track flow through iff body is a String
260+ exists ( SpringHttpEntity she |
261+ sink .getConstructor ( ) = she .getAConstructor ( ) and
262+ argi = 0 and
263+ tracked .getType ( ) instanceof TypeString
264+ )
265+ or
266+ // A SpringRequestEntity is a wrapper around a body and some headers
267+ // Track flow through iff body is a String
268+ exists ( SpringResponseEntity sre |
269+ sink .getConstructor ( ) = sre .getAConstructor ( ) and
270+ argi = 0 and
271+ tracked .getType ( ) instanceof TypeString
272+ )
255273 )
256274}
257275
0 commit comments