CodeQL library for C#
codeql/csharp-all 5.1.6 (changelog, source)
Search

Module ExternalFlow

INTERNAL use only. This is an experimental API subject to change without notice.

Provides classes and predicates for dealing with MaD flow models specified in data extensions and CSV format.

The CSV specification has the following columns:

  • Sources: namespace; type; subtypes; name; signature; ext; output; kind; provenance
  • Sinks: namespace; type; subtypes; name; signature; ext; input; kind; provenance
  • Summaries: namespace; type; subtypes; name; signature; ext; input; output; kind; provenance
  • Neutrals: namespace; type; name; signature; kind; provenance A neutral is used to indicate that a callable is neutral with respect to flow (no summary), source (is not a source) or sink (is not a sink).

The interpretation of a row is similar to API-graphs with a left-to-right reading.

  1. The namespace column selects a namespace.

  2. The type column selects a type within that namespace.

  3. The subtypes is a boolean that indicates whether to jump to an arbitrary subtype of that type.

  4. The name column optionally selects a specific named member of the type.

  5. The signature column optionally restricts the named member. If signature is blank then no such filtering is done. The format of the signature is a comma-separated list of types enclosed in parentheses. The types can be short names or fully qualified names (mixing these two options is not allowed within a single signature).

  6. The ext column specifies additional API-graph-like edges. Currently there are only a few valid values: "", “Attribute”, “Attribute.Getter” and “Attribute.Setter”. The empty string has no effect. “Attribute” applies if name and signature were left blank and acts by selecting an element (except for properties and indexers) that is attributed with the attribute type selected by the first 4 columns. This can be another member such as a field, method, or parameter. “Attribute.Getter” and “Attribute.Setter” work similar to “Attribute”, except that they can only be applied to properties and indexers. “Attribute.Setter” selects the setter element of a property/indexer and “Attribute.Getter” selects the getter.

  7. The input column specifies how data enters the element selected by the first 6 columns, and the output column specifies how data leaves the element selected by the first 6 columns. For sinks, an input can be either "", “Argument[n]”, “Argument[n1..n2]”, or “ReturnValue”:

    • "": Selects a write to the selected element in case this is a field or property.
    • “Argument[n]”: Selects an argument in a call to the selected element. The arguments are zero-indexed, and this specifies the qualifier.
    • “Argument[n1..n2]”: Similar to “Argument[n]” but select any argument in the given range. The range is inclusive at both ends.
    • “ReturnValue”: Selects a value being returned by the selected element. This requires that the selected element is a method with a body.

    For sources, an output can be either "", “Argument[n]”, “Argument[n1..n2]”, “Parameter”, “Parameter[n]”, “Parameter[n1..n2]”, or “ReturnValue”:

    • "": Selects a read of a selected field or property.
    • “Argument[n]”: Selects the post-update value of an argument in a call to the selected element. That is, the value of the argument after the call returns. The arguments are zero-indexed, and this specifies the qualifier.
    • “Argument[n1..n2]”: Similar to “Argument[n]” but select any argument in the given range. The range is inclusive at both ends.
    • “Parameter”: Selects the value of a parameter of the selected element.
    • “Parameter[n]”: Similar to “Parameter” but restricted to a specific numbered parameter (zero-indexed, and this specifies the value of this).
    • “Parameter[n1..n2]”: Similar to “Parameter[n]” but selects any parameter in the given range. The range is inclusive at both ends.
    • “ReturnValue”: Selects the return value of a call to the selected element.

    For summaries, input and output may be suffixed by any number of the following, separated by “.”:

    • “Element”: Selects an element in a collection.
    • “Field[f]”: Selects the contents of field f.
    • “Property[p]”: Selects the contents of property p.
  8. The kind column is a tag that can be referenced from QL to determine to which classes the interpreted elements should be added. For example, for sources “remote” indicates a default remote flow source, and for summaries “taint” indicates a default additional taint step and “value” indicates a globally applicable value-preserving step. For neutrals the kind can be summary, source or sink to indicate that the neutral is neutral with respect to flow (no summary), source (is not a source) or sink (is not a sink).

  9. The provenance column is a tag to indicate the origin and verification of a model. The format is {origin}-{verification} or just “manual” where the origin describes the origin of the model and verification describes how the model has been verified. Some examples are:

    • “df-generated”: The model has been generated by the model generator tool.
    • “df-manual”: The model has been generated by the model generator and verified by a human.
    • “manual”: The model has been written by hand. This information is used in a heuristic for dataflow analysis to determine, if a model or source code should be used for determining flow.

Import path

import semmle.code.csharp.dataflow.internal.ExternalFlow

Imports

Cached
ExternalFlowExtensions

This module provides extensible predicates for defining MaD models.

csharp

The default C# QL library.

Predicates

getSignature

Gets the signature of c in the format namespace;type;name;parameters.

hasQualifiedMethodName

Holds if declaration d has name name and is defined in type type with namespace namespace.

hasQualifiedTypeName

Holds if declaration d has the qualified name qualifier.name.

interpretBaseDeclaration
interpretElement

Gets the source/sink/summary/neutral element corresponding to the supplied parameters.

interpretModelForTest

Holds if the given extension tuple madId should pretty-print as model.

interpretNeutral
modelCoverage

Holds if MaD framework coverage of namespace is n api endpoints of the kind (kind, part), and namespaces is the number of subnamespaces of namespace which have MaD framework coverage (including namespace itself).

parameterQualifiedTypeNamesToString

Gets the string representation of the parameters of c.

partialModel
sinkNode

Holds if node is specified as a sink with the given kind in a MaD flow model.

sourceNode

Holds if node is specified as a source with the given kind in a MaD flow model.

Classes

UnboundCallable

An unbound callable.

Modules

ModelValidation

Provides a query predicate to check the MaD models for validation errors.

Aliases

SinkCallable

A callable that has a sink model.

SourceCallable

A callable that has a source model.