Add sanitizer for virtual method calls

This commit is contained in:
luchua-bc
2021-12-15 16:19:50 +00:00
parent 8bcffc2886
commit 29ce0e9ef1

View File

@@ -145,6 +145,23 @@ private class NullOrEmptyCheckSanitizer extends DataFlow::Node {
NullOrEmptyCheckSanitizer() { isNullOrEmptyCheck(this.asExpr()) } NullOrEmptyCheckSanitizer() { isNullOrEmptyCheck(this.asExpr()) }
} }
/** Holds if `ma` is a virtual method call of Map::get or Object::toString. */
predicate isVirtualMethod(MethodAccess ma, Expr expr) {
ma.getMethod().getDeclaringType() instanceof TypeObject and
ma.getMethod().hasName("toString") and
(expr = ma or expr = ma.getQualifier())
or
(
ma.getMethod().getDeclaringType().getASupertype*().hasQualifiedName("java.util", "Map") and
ma.getMethod().hasName(["get", "getOrDefault"])
) and
(expr = ma or expr = ma.getAnArgument())
}
private class VirtualMethodSanitizer extends DataFlow::Node {
VirtualMethodSanitizer() { exists(MethodAccess ma | isVirtualMethod(ma, this.asExpr())) }
}
class UnsafeUrlForwardFlowConfig extends TaintTracking::Configuration { class UnsafeUrlForwardFlowConfig extends TaintTracking::Configuration {
UnsafeUrlForwardFlowConfig() { this = "UnsafeUrlForwardFlowConfig" } UnsafeUrlForwardFlowConfig() { this = "UnsafeUrlForwardFlowConfig" }
@@ -166,7 +183,8 @@ class UnsafeUrlForwardFlowConfig extends TaintTracking::Configuration {
node instanceof UnsafeUrlForwardSanitizer or node instanceof UnsafeUrlForwardSanitizer or
node instanceof PathMatchSanitizer or node instanceof PathMatchSanitizer or
node instanceof StringOperationSanitizer or node instanceof StringOperationSanitizer or
node instanceof NullOrEmptyCheckSanitizer node instanceof NullOrEmptyCheckSanitizer or
node instanceof VirtualMethodSanitizer
} }
} }