@@ -28,7 +28,7 @@ abstract class JacksonSerializableType extends Type { }
2828 * A method used for serializing objects using Jackson. The final parameter is the object to be
2929 * serialized.
3030 */
31- library class JacksonWriteValueMethod extends Method , TaintPreservingCallable {
31+ private class JacksonWriteValueMethod extends Method , TaintPreservingCallable {
3232 JacksonWriteValueMethod ( ) {
3333 (
3434 getDeclaringType ( ) .hasQualifiedName ( "com.fasterxml.jackson.databind" , "ObjectWriter" ) or
@@ -50,17 +50,17 @@ library class JacksonWriteValueMethod extends Method, TaintPreservingCallable {
5050 }
5151}
5252
53- library class JacksonReadValueMethod extends Method , TaintPreservingCallable {
53+ private class JacksonReadValueMethod extends Method , TaintPreservingCallable {
5454 JacksonReadValueMethod ( ) {
5555 getDeclaringType ( ) .hasQualifiedName ( "com.fasterxml.jackson.databind" , "ObjectReader" ) and
56- hasName ( "readValue" )
56+ hasName ( [ "readValue" , "readValues" ] )
5757 }
5858
5959 override predicate returnsTaintFrom ( int arg ) { arg = 0 }
6060}
6161
6262/** A type whose values are explicitly serialized in a call to a Jackson method. */
63- library class ExplicitlyWrittenJacksonSerializableType extends JacksonSerializableType {
63+ private class ExplicitlyWrittenJacksonSerializableType extends JacksonSerializableType {
6464 ExplicitlyWrittenJacksonSerializableType ( ) {
6565 exists ( MethodAccess ma |
6666 // A call to a Jackson write method...
@@ -71,8 +71,20 @@ library class ExplicitlyWrittenJacksonSerializableType extends JacksonSerializab
7171 }
7272}
7373
74+ /** A type whose values are explicitly deserialized in a call to a Jackson method. */
75+ private class ExplicitlyReadJacksonSerializableType extends JacksonDeserializableType {
76+ ExplicitlyReadJacksonSerializableType ( ) {
77+ exists ( MethodAccess ma |
78+ // A call to a Jackson write method...
79+ ma .getMethod ( ) instanceof JacksonReadValueMethod and
80+ // ...where `this` is used in the final argument, indicating that this type will be deserialized.
81+ usesType ( ma .getArgument ( ma .getNumArgument ( ) - 1 ) .getType ( ) , this )
82+ )
83+ }
84+ }
85+
7486/** A type used in a `JacksonSerializableField` declaration. */
75- library class FieldReferencedJacksonSerializableType extends JacksonSerializableType {
87+ private class FieldReferencedJacksonSerializableType extends JacksonSerializableType {
7688 FieldReferencedJacksonSerializableType ( ) {
7789 exists ( JacksonSerializableField f | usesType ( f .getType ( ) , this ) )
7890 }
@@ -105,7 +117,7 @@ private class TypeLiteralToJacksonDatabindFlowConfiguration extends DataFlow5::C
105117}
106118
107119/** A type whose values are explicitly deserialized in a call to a Jackson method. */
108- library class ExplicitlyReadJacksonDeserializableType extends JacksonDeserializableType {
120+ private class ExplicitlyReadJacksonDeserializableType extends JacksonDeserializableType {
109121 ExplicitlyReadJacksonDeserializableType ( ) {
110122 exists ( TypeLiteralToJacksonDatabindFlowConfiguration conf |
111123 usesType ( conf .getSourceWithFlowToJacksonDatabind ( ) .getTypeName ( ) .getType ( ) , this )
@@ -114,7 +126,7 @@ library class ExplicitlyReadJacksonDeserializableType extends JacksonDeserializa
114126}
115127
116128/** A type used in a `JacksonDeserializableField` declaration. */
117- library class FieldReferencedJacksonDeSerializableType extends JacksonDeserializableType {
129+ private class FieldReferencedJacksonDeSerializableType extends JacksonDeserializableType {
118130 FieldReferencedJacksonDeSerializableType ( ) {
119131 exists ( JacksonDeserializableField f | usesType ( f .getType ( ) , this ) )
120132 }
@@ -144,10 +156,15 @@ class JacksonDeserializableField extends DeserializableField {
144156 }
145157}
146158
159+ /** A call to a field that may be deserialized using the Jackson JSON framework. */
147160class JacksonDeserializableFieldAccess extends FieldAccess {
148161 JacksonDeserializableFieldAccess ( ) { getField ( ) instanceof JacksonDeserializableField }
149162}
150163
164+ /**
165+ * When an object is deserialized by the Jackson JSON framework using a tainted input source,
166+ * the fields that the framework deserialized are themselves tainted input data.
167+ */
151168class JacksonDeseializedTaintStep extends AdditionalTaintStep {
152169 override predicate step ( DataFlow:: Node node1 , DataFlow:: Node node2 ) {
153170 node2 .asExpr ( ) .( JacksonDeserializableFieldAccess ) .getQualifier ( ) = node1 .asExpr ( )
0 commit comments