Add proper metadata to queries

This commit is contained in:
Benjamin Muskalla
2021-09-30 11:30:43 +02:00
parent a80d50cbc0
commit 38579ef25b
3 changed files with 29 additions and 13 deletions

View File

@@ -1,3 +1,9 @@
/**
* @name Capture sink models.
* @description Finds public methods that act as sinks as they flow into a a known sink.
* @id java/utils/model-generator/sink-models
*/
import java
import Telemetry.ExternalAPI
import semmle.code.java.dataflow.DataFlow
@@ -5,8 +11,8 @@ import semmle.code.java.dataflow.TaintTracking
import semmle.code.java.dataflow.ExternalFlow
import ModelGeneratorUtils
class Configuration extends TaintTracking::Configuration {
Configuration() { this = "public methods calling sinks" }
class PropagateToSinkConfiguration extends TaintTracking::Configuration {
PropagateToSinkConfiguration() { this = "public methods calling sinks" }
override predicate isSource(DataFlow::Node source) {
exists(MethodAccess ma |
@@ -22,7 +28,7 @@ class Configuration extends TaintTracking::Configuration {
string asInputArgument(Expr source) { result = "Argument[" + source.(Argument).getPosition() + "]" }
string captureSink(Callable api) {
exists(DataFlow::Node src, DataFlow::Node sink, Configuration config, string kind |
exists(DataFlow::Node src, DataFlow::Node sink, PropagateToSinkConfiguration config, string kind |
config.hasFlow(src, sink) and
sinkNode(sink, kind) and
api = src.asExpr().getEnclosingCallable() and

View File

@@ -1,14 +1,20 @@
/**
* @name Capture source models.
* @description Finds APIs that act as sources as they expose already known sources.
* @id java/utils/model-generator/sink-models
*/
import java
import Telemetry.ExternalAPI
import semmle.code.java.dataflow.DataFlow
import semmle.code.java.dataflow.TaintTracking
import semmle.code.java.dataflow.ExternalFlow
import ModelGeneratorUtils
private import Telemetry.ExternalAPI
private import semmle.code.java.dataflow.DataFlow
private import semmle.code.java.dataflow.TaintTracking
private import semmle.code.java.dataflow.ExternalFlow
private import ModelGeneratorUtils
private import semmle.code.java.dataflow.internal.FlowSummaryImplSpecific
private import semmle.code.java.dataflow.internal.FlowSummaryImpl
class Configuration extends TaintTracking::Configuration {
Configuration() { this = "Configuration" }
class FromSourceConfiguration extends TaintTracking::Configuration {
FromSourceConfiguration() { this = "FromSourceConfiguration" }
override predicate isSource(DataFlow::Node source) { sourceNode(source, _) }
@@ -21,14 +27,17 @@ class Configuration extends TaintTracking::Configuration {
}
}
// TODO: internals
// TODO: better way than rely on internals?
cached
predicate specificSourceNode(DataFlow::Node node, string output, string kind) {
exists(InterpretNode n | Private::External::isSourceNode(n, output, kind) and n.asNode() = node)
}
string captureSink(Callable api) {
exists(DataFlow::Node src, DataFlow::Node sink, Configuration config, string kind, string output |
exists(
DataFlow::Node src, DataFlow::Node sink, FromSourceConfiguration config, string kind,
string output
|
config.hasFlow(src, sink) and
specificSourceNode(sink, output, kind) and
api = src.asExpr().getEnclosingCallable() and

View File

@@ -41,7 +41,8 @@ string captureFieldFlow(Callable api) {
string asOutput(Callable api, ReturnNodeExt node) {
if node.getKind() instanceof ValueReturnKind
then result = "ReturnValue"
else result = parameterAccess(api.getParameter(node.getKind().(ParamUpdateReturnKind).getPosition()))
else
result = parameterAccess(api.getParameter(node.getKind().(ParamUpdateReturnKind).getPosition()))
}
class FieldAssignment extends AssignExpr {