[Java] Add taint tracking through Jackson deserialization

This commit is contained in:
Jonathan Leitschuh
2021-04-30 19:18:35 -04:00
parent d7e560c611
commit 56b1f15dda
6 changed files with 125 additions and 58 deletions

View File

@@ -50,6 +50,15 @@ library class JacksonWriteValueMethod extends Method, TaintPreservingCallable {
}
}
library class JacksonReadValueMethod extends Method, TaintPreservingCallable {
JacksonReadValueMethod() {
getDeclaringType().hasQualifiedName("com.fasterxml.jackson.databind", "ObjectReader") and
hasName("readValue")
}
override predicate returnsTaintFrom(int arg) { arg = 0 }
}
/** A type whose values are explicitly serialized in a call to a Jackson method. */
library class ExplicitlyWrittenJacksonSerializableType extends JacksonSerializableType {
ExplicitlyWrittenJacksonSerializableType() {
@@ -135,6 +144,16 @@ class JacksonDeserializableField extends DeserializableField {
}
}
class JacksonDeserializableFieldAccess extends FieldAccess {
JacksonDeserializableFieldAccess() { getField() instanceof JacksonDeserializableField }
}
class JacksonDeseializedTaintStep extends AdditionalTaintStep {
override predicate step(DataFlow::Node node1, DataFlow::Node node2) {
node2.asExpr().(JacksonDeserializableFieldAccess).getQualifier() = node1.asExpr()
}
}
/**
* A call to the `addMixInAnnotations` or `addMixIn` Jackson method.
*