mirror of
https://github.com/github/codeql.git
synced 2025-12-17 01:03:14 +01:00
[DIFF-INFORMED] Actions: EnvVarInjection
https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/actions/ql/src/Security/CWE-077/EnvVarInjectionMedium.ql#L35 https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/actions/ql/src/Security/CWE-077/EnvVarInjectionCritical.ql#L46
This commit is contained in:
@@ -126,6 +126,32 @@ class EnvVarInjectionFromMaDSink extends EnvVarInjectionSink {
|
|||||||
EnvVarInjectionFromMaDSink() { madSink(this, "envvar-injection") }
|
EnvVarInjectionFromMaDSink() { madSink(this, "envvar-injection") }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the relevant event for a sink in EnvVarInjectionCritical.ql where the source type is "artifact".
|
||||||
|
*/
|
||||||
|
Event getRelevantArtifactEventInPrivilegedContext(DataFlow::Node sink) {
|
||||||
|
inPrivilegedContext(sink.asExpr(), result) and
|
||||||
|
not exists(ControlCheck check |
|
||||||
|
check
|
||||||
|
.protects(sink.asExpr(), result,
|
||||||
|
["envvar-injection", "untrusted-checkout", "artifact-poisoning"])
|
||||||
|
) and
|
||||||
|
(
|
||||||
|
sink instanceof EnvVarInjectionFromFileReadSink or
|
||||||
|
madSink(sink, "envvar-injection")
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the relevant event for a sink in EnvVarInjectionCritical.ql where the source type is not "artifact".
|
||||||
|
*/
|
||||||
|
Event getRelevantNonArtifactEventInPrivilegedContext(DataFlow::Node sink) {
|
||||||
|
inPrivilegedContext(sink.asExpr(), result) and
|
||||||
|
not exists(ControlCheck check |
|
||||||
|
check.protects(sink.asExpr(), result, ["envvar-injection", "code-injection"])
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A taint-tracking configuration for unsafe user input
|
* A taint-tracking configuration for unsafe user input
|
||||||
* that is used to construct and evaluate an environment variable.
|
* that is used to construct and evaluate an environment variable.
|
||||||
@@ -163,6 +189,18 @@ private module EnvVarInjectionConfig implements DataFlow::ConfigSig {
|
|||||||
exists(run.getScript().getAFileReadCommand())
|
exists(run.getScript().getAFileReadCommand())
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
predicate observeDiffInformedIncrementalMode() { any() }
|
||||||
|
|
||||||
|
Location getASelectedSourceLocation(DataFlow::Node source) { none() }
|
||||||
|
|
||||||
|
Location getASelectedSinkLocation(DataFlow::Node sink) {
|
||||||
|
result = sink.getLocation()
|
||||||
|
or
|
||||||
|
result = getRelevantArtifactEventInPrivilegedContext(sink).getLocation()
|
||||||
|
or
|
||||||
|
result = getRelevantNonArtifactEventInPrivilegedContext(sink).getLocation()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Tracks flow of unsafe user input that is used to construct and evaluate an environment variable. */
|
/** Tracks flow of unsafe user input that is used to construct and evaluate an environment variable. */
|
||||||
|
|||||||
@@ -22,26 +22,15 @@ import codeql.actions.security.ControlChecks
|
|||||||
from EnvVarInjectionFlow::PathNode source, EnvVarInjectionFlow::PathNode sink, Event event
|
from EnvVarInjectionFlow::PathNode source, EnvVarInjectionFlow::PathNode sink, Event event
|
||||||
where
|
where
|
||||||
EnvVarInjectionFlow::flowPath(source, sink) and
|
EnvVarInjectionFlow::flowPath(source, sink) and
|
||||||
inPrivilegedContext(sink.getNode().asExpr(), event) and
|
|
||||||
// exclude paths to file read sinks from non-artifact sources
|
// exclude paths to file read sinks from non-artifact sources
|
||||||
(
|
(
|
||||||
// source is text
|
// source is text
|
||||||
not source.getNode().(RemoteFlowSource).getSourceType() = "artifact" and
|
not source.getNode().(RemoteFlowSource).getSourceType() = "artifact" and
|
||||||
not exists(ControlCheck check |
|
event = getRelevantNonArtifactEventInPrivilegedContext(sink.getNode())
|
||||||
check.protects(sink.getNode().asExpr(), event, ["envvar-injection", "code-injection"])
|
|
||||||
)
|
|
||||||
or
|
or
|
||||||
// source is an artifact or a file from an untrusted checkout
|
// source is an artifact or a file from an untrusted checkout
|
||||||
source.getNode().(RemoteFlowSource).getSourceType() = "artifact" and
|
source.getNode().(RemoteFlowSource).getSourceType() = "artifact" and
|
||||||
not exists(ControlCheck check |
|
event = getRelevantArtifactEventInPrivilegedContext(sink.getNode())
|
||||||
check
|
|
||||||
.protects(sink.getNode().asExpr(), event,
|
|
||||||
["envvar-injection", "untrusted-checkout", "artifact-poisoning"])
|
|
||||||
) and
|
|
||||||
(
|
|
||||||
sink.getNode() instanceof EnvVarInjectionFromFileReadSink or
|
|
||||||
madSink(sink.getNode(), "envvar-injection")
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
select sink.getNode(), source, sink,
|
select sink.getNode(), source, sink,
|
||||||
"Potential environment variable injection in $@, which may be controlled by an external user ($@).",
|
"Potential environment variable injection in $@, which may be controlled by an external user ($@).",
|
||||||
|
|||||||
Reference in New Issue
Block a user