Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit db21a6a

Browse files
committed
C#: Add CaptureSummaryModels query.
1 parent fb2a7df commit db21a6a

4 files changed

Lines changed: 58 additions & 1 deletion

File tree

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/**
2+
* @name Capture sink models.
3+
* @description Finds public methods that act as sinks as they flow into a a known sink.
4+
* @id csharp/utils/model-generator/sink-models
5+
*/
6+
7+
private import ModelGeneratorUtils
8+
private import CaptureSinkModels
9+
10+
from TargetApi api, string sink
11+
where sink = captureSink(api)
12+
select sink order by sink
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
private import CaptureSinkModelsSpecific
2+
3+
class PropagateToSinkConfiguration extends PropagateToSinkConfigurationSpecific {
4+
PropagateToSinkConfiguration() { this = "parameters or fields flowing into sinks" }
5+
6+
override predicate isSink(DataFlow::Node sink) { sinkNode(sink, _) }
7+
8+
override DataFlow::FlowFeature getAFeature() {
9+
result instanceof DataFlow::FeatureHasSourceCallContext
10+
}
11+
}
12+
13+
string captureSink(TargetApi api) {
14+
exists(DataFlow::Node src, DataFlow::Node sink, PropagateToSinkConfiguration config, string kind |
15+
config.hasFlow(src, sink) and
16+
sinkNode(sink, kind) and
17+
api = src.getEnclosingCallable() and
18+
not kind = "logging" and
19+
result = asSinkModel(api, asInputArgument(src), kind)
20+
)
21+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import csharp
2+
import semmle.code.csharp.dataflow.TaintTracking
3+
import semmle.code.csharp.dataflow.ExternalFlow
4+
import ModelGeneratorUtils
5+
6+
class PropagateToSinkConfigurationSpecific extends TaintTracking::Configuration {
7+
PropagateToSinkConfigurationSpecific() { this = "parameters or fields flowing into sinks" }
8+
9+
override predicate isSource(DataFlow::Node source) {
10+
(source.asExpr() instanceof FieldAccess or source instanceof DataFlow::ParameterNode) and
11+
source.getEnclosingCallable().(Modifiable).isEffectivelyPublic() and
12+
isRelevantForModels(source.getEnclosingCallable())
13+
}
14+
}
15+
16+
string asInputArgument(DataFlow::Node source) {
17+
exists(int pos |
18+
pos = source.(DataFlow::ParameterNode).getParameter().getPosition() and
19+
result = "Argument[" + pos + "]"
20+
)
21+
or
22+
source.asExpr() instanceof FieldAccess and
23+
result = "Argument[Qualifier]"
24+
}

csharp/ql/src/utils/model-generator/ModelGeneratorUtilsSpecific.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ private import semmle.code.csharp.commons.Collections
55
private import semmle.code.csharp.dataflow.internal.DataFlowImplCommon
66
private import semmle.code.csharp.dataflow.internal.DataFlowDispatch
77

8-
private predicate isRelevantForModels(Callable api) { not api instanceof MainMethod }
8+
predicate isRelevantForModels(Callable api) { not api instanceof MainMethod }
99

1010
/**
1111
* A class of callables that are relevant generating summary, source and sinks models for.

0 commit comments

Comments
 (0)