Skip to content

Commit ab49c33

Browse files
committed
Merge branch 'main' into scinit
2 parents bf33d1b + e6150e2 commit ab49c33

File tree

612 files changed

+15548
-8566
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

612 files changed

+15548
-8566
lines changed

.bazelrc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,13 @@ common --registry=https://bcr.bazel.build
3030

3131
common --@rules_dotnet//dotnet/settings:strict_deps=false
3232

33+
# we only configure a nightly toolchain
34+
common --@rules_rust//rust/toolchain/channel=nightly
35+
36+
# rust does not like the gold linker, while bazel does by default, so let's avoid using it
37+
common:linux --linkopt=-fuse-ld=lld
38+
common:macos --linkopt=-fuse-ld=lld
39+
3340
# Reduce this eventually to empty, once we've fixed all our usages of java, and https://github.com/bazel-contrib/rules_go/issues/4193 is fixed
3441
common --incompatible_autoload_externally="+@rules_java,+@rules_shell"
3542

MODULE.bazel

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ local_path_override(
1515
# see https://registry.bazel.build/ for a list of available packages
1616

1717
bazel_dep(name = "platforms", version = "0.0.11")
18-
bazel_dep(name = "rules_go", version = "0.50.1")
18+
bazel_dep(name = "rules_go", version = "0.56.1")
1919
bazel_dep(name = "rules_pkg", version = "1.0.1")
2020
bazel_dep(name = "rules_nodejs", version = "6.2.0-codeql.1")
2121
bazel_dep(name = "rules_python", version = "0.40.0")
@@ -28,7 +28,7 @@ bazel_dep(name = "rules_kotlin", version = "2.1.3-codeql.1")
2828
bazel_dep(name = "gazelle", version = "0.40.0")
2929
bazel_dep(name = "rules_dotnet", version = "0.17.4")
3030
bazel_dep(name = "googletest", version = "1.14.0.bcr.1")
31-
bazel_dep(name = "rules_rust", version = "0.58.0")
31+
bazel_dep(name = "rules_rust", version = "0.63.0")
3232
bazel_dep(name = "zstd", version = "1.5.5.bcr.1")
3333

3434
bazel_dep(name = "buildifier_prebuilt", version = "6.4.0", dev_dependency = True)
@@ -38,7 +38,10 @@ bazel_dep(name = "buildifier_prebuilt", version = "6.4.0", dev_dependency = True
3838
RUST_EDITION = "2024"
3939

4040
# run buildutils-internal/scripts/fill-rust-sha256s.py when updating (internal repo)
41-
RUST_VERSION = "1.86.0"
41+
# a nightly toolchain is required to enable experimental_use_cc_common_link, which we require internally
42+
# we prefer to run the same version as internally, even if experimental_use_cc_common_link is not really
43+
# required in this repo
44+
RUST_VERSION = "nightly/2025-08-01"
4245

4346
rust = use_extension("@rules_rust//rust:extensions.bzl", "rust")
4447
rust.toolchain(
@@ -50,26 +53,26 @@ rust.toolchain(
5053
],
5154
# generated by buildutils-internal/scripts/fill-rust-sha256s.py (internal repo)
5255
sha256s = {
53-
"rustc-1.86.0-x86_64-unknown-linux-gnu.tar.xz": "4438b809ce4a083af31ed17aeeedcc8fc60ccffc0625bef1926620751b6989d7",
54-
"rustc-1.86.0-x86_64-apple-darwin.tar.xz": "42b76253626febb7912541a30d3379f463dec89581aad4cb72c6c04fb5a71dc5",
55-
"rustc-1.86.0-aarch64-apple-darwin.tar.xz": "23b8f52102249a47ab5bc859d54c9a3cb588a3259ba3f00f557d50edeca4fde9",
56-
"rustc-1.86.0-x86_64-pc-windows-msvc.tar.xz": "fdde839fea274529a31e51eb85c6df1782cc8479c9d1bc24e2914d66a0de41ab",
57-
"clippy-1.86.0-x86_64-unknown-linux-gnu.tar.xz": "02aaff2c1407d2da8dba19aa4970dd873e311902b120a66cbcdbe51eb8836edf",
58-
"clippy-1.86.0-x86_64-apple-darwin.tar.xz": "bb85efda7bbffaf124867f5ca36d50932b1e8f533c62ee923438afb32ff8fe9a",
59-
"clippy-1.86.0-aarch64-apple-darwin.tar.xz": "239fa3a604b124f0312f2af08537874a1227dba63385484b468cca62e7c4f2f2",
60-
"clippy-1.86.0-x86_64-pc-windows-msvc.tar.xz": "d00498f47d49219f032e2c5eeebdfc3d32317c0dc3d3fd7125327445bc482cb4",
61-
"cargo-1.86.0-x86_64-unknown-linux-gnu.tar.xz": "c5c1590f7e9246ad9f4f97cfe26ffa92707b52a769726596a9ef81565ebd908b",
62-
"cargo-1.86.0-x86_64-apple-darwin.tar.xz": "af163eb02d1a178044d1b4f2375960efd47130f795f6e33d09e345454bb26f4e",
63-
"cargo-1.86.0-aarch64-apple-darwin.tar.xz": "3cb13873d48c3e1e4cc684d42c245226a11fba52af6b047c3346ed654e7a05c0",
64-
"cargo-1.86.0-x86_64-pc-windows-msvc.tar.xz": "e57a9d89619b5604899bac443e68927bdd371e40f2e03e18950b6ceb3eb67966",
65-
"llvm-tools-1.86.0-x86_64-unknown-linux-gnu.tar.xz": "282145ab7a63c98b625856f44b905b4dc726b497246b824632a5790debe95a78",
66-
"llvm-tools-1.86.0-x86_64-apple-darwin.tar.xz": "b55706e92f7da989207c50c13c7add483a9fedd233bc431b106eca2a8f151ec9",
67-
"llvm-tools-1.86.0-aarch64-apple-darwin.tar.xz": "04d3618c686845853585f036e3211eb9e18f2d290f4610a7a78bdc1fcce1ebd9",
68-
"llvm-tools-1.86.0-x86_64-pc-windows-msvc.tar.xz": "721a17cc8dc219177e4277a3592253934ef08daa1e1b12eda669a67d15fad8dd",
69-
"rust-std-1.86.0-x86_64-unknown-linux-gnu.tar.xz": "67be7184ea388d8ce0feaf7fdea46f1775cfc2970930264343b3089898501d37",
70-
"rust-std-1.86.0-x86_64-apple-darwin.tar.xz": "3b1140d54870a080080e84700143f4a342fbd02a410a319b05d9c02e7dcf44cc",
71-
"rust-std-1.86.0-aarch64-apple-darwin.tar.xz": "0fb121fb3b8fa9027d79ff598500a7e5cd086ddbc3557482ed3fdda00832c61b",
72-
"rust-std-1.86.0-x86_64-pc-windows-msvc.tar.xz": "3d5354b7b9cb950b58bff3fce18a652aa374bb30c8f70caebd3bd0b43cb41a33",
56+
"2025-08-01/rustc-nightly-x86_64-unknown-linux-gnu.tar.xz": "9bbeaf5d3fc7247d31463a9083aa251c995cc50662c8219e7a2254d76a72a9a4",
57+
"2025-08-01/rustc-nightly-x86_64-apple-darwin.tar.xz": "c9ea539a8eff0d5d162701f99f9e1aabe14dd0dfb420d62362817a5d09219de7",
58+
"2025-08-01/rustc-nightly-aarch64-apple-darwin.tar.xz": "ae83feebbc39cfd982e4ecc8297731fe79c185173aee138467b334c5404b3773",
59+
"2025-08-01/rustc-nightly-x86_64-pc-windows-msvc.tar.xz": "9f170c30d802a349be60cf52ec46260802093cb1013ad667fc0d528b7b10152f",
60+
"2025-08-01/clippy-nightly-x86_64-unknown-linux-gnu.tar.xz": "9ae5f3cd8f557c4f6df522597c69d14398cf604cfaed2b83e767c4b77a7eaaf6",
61+
"2025-08-01/clippy-nightly-x86_64-apple-darwin.tar.xz": "983cb9ee0b6b968188e04ab2d33743d54764b2681ce565e1b3f2b9135c696a3e",
62+
"2025-08-01/clippy-nightly-aarch64-apple-darwin.tar.xz": "ed2219dbc49d088225e1b7c5c4390fa295066e071fddaa2714018f6bb39ddbf0",
63+
"2025-08-01/clippy-nightly-x86_64-pc-windows-msvc.tar.xz": "911f40ab5cbdd686f40e00965271fe47c4805513a308ed01f30eafb25b448a50",
64+
"2025-08-01/cargo-nightly-x86_64-unknown-linux-gnu.tar.xz": "106463c284e48e4904c717471eeec2be5cc83a9d2cae8d6e948b52438cad2e69",
65+
"2025-08-01/cargo-nightly-x86_64-apple-darwin.tar.xz": "6ad35c40efc41a8c531ea43235058347b6902d98a9693bf0aed7fc16d5590cef",
66+
"2025-08-01/cargo-nightly-aarch64-apple-darwin.tar.xz": "dd28c365e9d298abc3154c797720ad36a0058f131265c9978b4c8e4e37012c8a",
67+
"2025-08-01/cargo-nightly-x86_64-pc-windows-msvc.tar.xz": "7b431286e12d6b3834b038f078389a00cac73f351e8c3152b2504a3c06420b3b",
68+
"2025-08-01/llvm-tools-nightly-x86_64-unknown-linux-gnu.tar.xz": "e342e305d7927cc288d386983b2bc253cfad3776b113386e903d0b302648ef47",
69+
"2025-08-01/llvm-tools-nightly-x86_64-apple-darwin.tar.xz": "e44dd3506524d85c37b3a54bcc91d01378fd2c590b2db5c5974d12f05c1b84d1",
70+
"2025-08-01/llvm-tools-nightly-aarch64-apple-darwin.tar.xz": "0c1b5f46dd81be4a9227b10283a0fcaa39c14fea7e81aea6fd6d9887ff6cdc41",
71+
"2025-08-01/llvm-tools-nightly-x86_64-pc-windows-msvc.tar.xz": "423e5fd11406adccbc31b8456ceb7375ce055cdf45e90d2c3babeb2d7f58383f",
72+
"2025-08-01/rust-std-nightly-x86_64-unknown-linux-gnu.tar.xz": "3c0ceb46a252647a1d4c7116d9ccae684fa5e42aaf3296419febd2c962c3b41d",
73+
"2025-08-01/rust-std-nightly-x86_64-apple-darwin.tar.xz": "3be416003cab10f767390a753d1d16ae4d26c7421c03c98992cf1943e5b0efe8",
74+
"2025-08-01/rust-std-nightly-aarch64-apple-darwin.tar.xz": "4046ac0ef951cb056b5028a399124f60999fa37792eab69d008d8d7965f389b4",
75+
"2025-08-01/rust-std-nightly-x86_64-pc-windows-msvc.tar.xz": "191ed9d8603c3a4fe5a7bbbc2feb72049078dae2df3d3b7d5dedf3abbf823e6e",
7376
},
7477
versions = [RUST_VERSION],
7578
)
@@ -260,7 +263,7 @@ use_repo(
260263
)
261264

262265
go_sdk = use_extension("@rules_go//go:extensions.bzl", "go_sdk")
263-
go_sdk.download(version = "1.24.0")
266+
go_sdk.download(version = "1.25.0")
264267

265268
go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps")
266269
go_deps.from_file(go_mod = "//go/extractor:go.mod")

actions/ql/lib/codeql/actions/security/ArgumentInjectionQuery.qll

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
private import actions
22
private import codeql.actions.TaintTracking
33
private import codeql.actions.dataflow.ExternalFlow
4+
private import codeql.actions.security.ControlChecks
45
import codeql.actions.dataflow.FlowSources
56
import codeql.actions.DataFlow
67

@@ -65,6 +66,16 @@ class ArgumentInjectionFromMaDSink extends ArgumentInjectionSink {
6566
override string getCommand() { result = "unknown" }
6667
}
6768

69+
/**
70+
* Gets the event that is relevant for the given node in the context of argument injection.
71+
*
72+
* This is used to highlight the event in the query results when an alert is raised.
73+
*/
74+
Event getRelevantEventInPrivilegedContext(DataFlow::Node node) {
75+
inPrivilegedContext(node.asExpr(), result) and
76+
not exists(ControlCheck check | check.protects(node.asExpr(), result, "argument-injection"))
77+
}
78+
6879
/**
6980
* A taint-tracking configuration for unsafe user input
7081
* that is used to construct and evaluate a code script.
@@ -88,6 +99,16 @@ private module ArgumentInjectionConfig implements DataFlow::ConfigSig {
8899
run.getScript().getAnEnvReachingArgumentInjectionSink(var, _, _)
89100
)
90101
}
102+
103+
predicate observeDiffInformedIncrementalMode() { any() }
104+
105+
Location getASelectedSourceLocation(DataFlow::Node source) { none() }
106+
107+
Location getASelectedSinkLocation(DataFlow::Node sink) {
108+
result = sink.getLocation()
109+
or
110+
result = getRelevantEventInPrivilegedContext(sink).getLocation()
111+
}
91112
}
92113

93114
/** Tracks flow of unsafe user input that is used to construct and evaluate a code script. */

actions/ql/lib/codeql/actions/security/ArtifactPoisoningQuery.qll

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import codeql.actions.DataFlow
44
import codeql.actions.dataflow.FlowSources
55
import codeql.actions.security.PoisonableSteps
66
import codeql.actions.security.UntrustedCheckoutQuery
7+
import codeql.actions.security.ControlChecks
78

89
string unzipRegexp() { result = "(unzip|tar)\\s+.*" }
910

@@ -292,6 +293,16 @@ class ArtifactPoisoningSink extends DataFlow::Node {
292293
string getPath() { result = download.getPath() }
293294
}
294295

296+
/**
297+
* Gets the event that is relevant for the given node in the context of artifact poisoning.
298+
*
299+
* This is used to highlight the event in the query results when an alert is raised.
300+
*/
301+
Event getRelevantEventInPrivilegedContext(DataFlow::Node node) {
302+
inPrivilegedContext(node.asExpr(), result) and
303+
not exists(ControlCheck check | check.protects(node.asExpr(), result, "artifact-poisoning"))
304+
}
305+
295306
/**
296307
* A taint-tracking configuration for unsafe artifacts
297308
* that is used may lead to artifact poisoning
@@ -318,6 +329,16 @@ private module ArtifactPoisoningConfig implements DataFlow::ConfigSig {
318329
exists(run.getScript().getAFileReadCommand())
319330
)
320331
}
332+
333+
predicate observeDiffInformedIncrementalMode() { any() }
334+
335+
Location getASelectedSourceLocation(DataFlow::Node source) { none() }
336+
337+
Location getASelectedSinkLocation(DataFlow::Node sink) {
338+
result = sink.getLocation()
339+
or
340+
result = getRelevantEventInPrivilegedContext(sink).getLocation()
341+
}
321342
}
322343

323344
/** Tracks flow of unsafe artifacts that is used in an insecure way. */

actions/ql/lib/codeql/actions/security/CodeInjectionQuery.qll

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ private import codeql.actions.TaintTracking
33
private import codeql.actions.dataflow.ExternalFlow
44
import codeql.actions.dataflow.FlowSources
55
import codeql.actions.DataFlow
6+
import codeql.actions.security.ControlChecks
7+
import codeql.actions.security.CachePoisoningQuery
68

79
class CodeInjectionSink extends DataFlow::Node {
810
CodeInjectionSink() {
@@ -11,6 +13,46 @@ class CodeInjectionSink extends DataFlow::Node {
1113
}
1214
}
1315

16+
/**
17+
* Get the relevant event for the sink in CodeInjectionCritical.ql.
18+
*/
19+
Event getRelevantCriticalEventForSink(DataFlow::Node sink) {
20+
inPrivilegedContext(sink.asExpr(), result) and
21+
not exists(ControlCheck check | check.protects(sink.asExpr(), result, "code-injection")) and
22+
// exclude cases where the sink is a JS script and the expression uses toJson
23+
not exists(UsesStep script |
24+
script.getCallee() = "actions/github-script" and
25+
script.getArgumentExpr("script") = sink.asExpr() and
26+
exists(getAToJsonReferenceExpression(sink.asExpr().(Expression).getExpression(), _))
27+
)
28+
}
29+
30+
/**
31+
* Get the relevant event for the sink in CachePoisoningViaCodeInjection.ql.
32+
*/
33+
Event getRelevantCachePoisoningEventForSink(DataFlow::Node sink) {
34+
exists(LocalJob job |
35+
job = sink.asExpr().getEnclosingJob() and
36+
job.getATriggerEvent() = result and
37+
// job can be triggered by an external user
38+
result.isExternallyTriggerable() and
39+
// excluding privileged workflows since they can be exploited in easier circumstances
40+
// which is covered by `actions/code-injection/critical`
41+
not job.isPrivilegedExternallyTriggerable(result) and
42+
(
43+
// the workflow runs in the context of the default branch
44+
runsOnDefaultBranch(result)
45+
or
46+
// the workflow caller runs in the context of the default branch
47+
result.getName() = "workflow_call" and
48+
exists(ExternalJob caller |
49+
caller.getCallee() = job.getLocation().getFile().getRelativePath() and
50+
runsOnDefaultBranch(caller.getATriggerEvent())
51+
)
52+
)
53+
)
54+
}
55+
1456
/**
1557
* A taint-tracking configuration for unsafe user input
1658
* that is used to construct and evaluate a code script.
@@ -35,6 +77,18 @@ private module CodeInjectionConfig implements DataFlow::ConfigSig {
3577
exists(run.getScript().getAFileReadCommand())
3678
)
3779
}
80+
81+
predicate observeDiffInformedIncrementalMode() { any() }
82+
83+
Location getASelectedSourceLocation(DataFlow::Node source) { none() }
84+
85+
Location getASelectedSinkLocation(DataFlow::Node sink) {
86+
result = sink.getLocation()
87+
or
88+
result = getRelevantCriticalEventForSink(sink).getLocation()
89+
or
90+
result = getRelevantCachePoisoningEventForSink(sink).getLocation()
91+
}
3892
}
3993

4094
/** Tracks flow of unsafe user input that is used to construct and evaluate a code script. */

actions/ql/lib/codeql/actions/security/CommandInjectionQuery.qll

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,20 @@ private import codeql.actions.TaintTracking
33
private import codeql.actions.dataflow.ExternalFlow
44
import codeql.actions.dataflow.FlowSources
55
import codeql.actions.DataFlow
6+
import codeql.actions.security.ControlChecks
67

78
private class CommandInjectionSink extends DataFlow::Node {
89
CommandInjectionSink() { madSink(this, "command-injection") }
910
}
1011

12+
/** Get the relevant event for the sink in CommandInjectionCritical.ql. */
13+
Event getRelevantEventInPrivilegedContext(DataFlow::Node sink) {
14+
inPrivilegedContext(sink.asExpr(), result) and
15+
not exists(ControlCheck check |
16+
check.protects(sink.asExpr(), result, ["command-injection", "code-injection"])
17+
)
18+
}
19+
1120
/**
1221
* A taint-tracking configuration for unsafe user input
1322
* that is used to construct and evaluate a system command.
@@ -16,6 +25,16 @@ private module CommandInjectionConfig implements DataFlow::ConfigSig {
1625
predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource }
1726

1827
predicate isSink(DataFlow::Node sink) { sink instanceof CommandInjectionSink }
28+
29+
predicate observeDiffInformedIncrementalMode() { any() }
30+
31+
Location getASelectedSourceLocation(DataFlow::Node source) { none() }
32+
33+
Location getASelectedSinkLocation(DataFlow::Node sink) {
34+
result = sink.getLocation()
35+
or
36+
result = getRelevantEventInPrivilegedContext(sink).getLocation()
37+
}
1938
}
2039

2140
/** Tracks flow of unsafe user input that is used to construct and evaluate a system command. */

actions/ql/lib/codeql/actions/security/EnvPathInjectionQuery.qll

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,25 @@ class EnvPathInjectionFromMaDSink extends EnvPathInjectionSink {
7272
EnvPathInjectionFromMaDSink() { madSink(this, "envpath-injection") }
7373
}
7474

75+
/**
76+
* Get the relevant event for a sink in EnvPathInjectionCritical.ql where the source type is "artifact".
77+
*/
78+
Event getRelevantArtifactEventInPrivilegedContext(DataFlow::Node sink) {
79+
inPrivilegedContext(sink.asExpr(), result) and
80+
not exists(ControlCheck check |
81+
check.protects(sink.asExpr(), result, ["untrusted-checkout", "artifact-poisoning"])
82+
) and
83+
sink instanceof EnvPathInjectionFromFileReadSink
84+
}
85+
86+
/**
87+
* Get the relevant event for a sink in EnvPathInjectionCritical.ql where the source type is not "artifact".
88+
*/
89+
Event getRelevantNonArtifactEventInPrivilegedContext(DataFlow::Node sink) {
90+
inPrivilegedContext(sink.asExpr(), result) and
91+
not exists(ControlCheck check | check.protects(sink.asExpr(), result, "code-injection"))
92+
}
93+
7594
/**
7695
* A taint-tracking configuration for unsafe user input
7796
* that is used to construct and evaluate an environment variable.
@@ -108,6 +127,18 @@ private module EnvPathInjectionConfig implements DataFlow::ConfigSig {
108127
exists(run.getScript().getAFileReadCommand())
109128
)
110129
}
130+
131+
predicate observeDiffInformedIncrementalMode() { any() }
132+
133+
Location getASelectedSourceLocation(DataFlow::Node source) { none() }
134+
135+
Location getASelectedSinkLocation(DataFlow::Node sink) {
136+
result = sink.getLocation()
137+
or
138+
result = getRelevantArtifactEventInPrivilegedContext(sink).getLocation()
139+
or
140+
result = getRelevantNonArtifactEventInPrivilegedContext(sink).getLocation()
141+
}
111142
}
112143

113144
/** Tracks flow of unsafe user input that is used to construct and evaluate the PATH environment variable. */

actions/ql/lib/codeql/actions/security/EnvVarInjectionQuery.qll

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,32 @@ class EnvVarInjectionFromMaDSink extends EnvVarInjectionSink {
126126
EnvVarInjectionFromMaDSink() { madSink(this, "envvar-injection") }
127127
}
128128

129+
/**
130+
* Get the relevant event for a sink in EnvVarInjectionCritical.ql where the source type is "artifact".
131+
*/
132+
Event getRelevantArtifactEventInPrivilegedContext(DataFlow::Node sink) {
133+
inPrivilegedContext(sink.asExpr(), result) and
134+
not exists(ControlCheck check |
135+
check
136+
.protects(sink.asExpr(), result,
137+
["envvar-injection", "untrusted-checkout", "artifact-poisoning"])
138+
) and
139+
(
140+
sink instanceof EnvVarInjectionFromFileReadSink or
141+
madSink(sink, "envvar-injection")
142+
)
143+
}
144+
145+
/**
146+
* Get the relevant event for a sink in EnvVarInjectionCritical.ql where the source type is not "artifact".
147+
*/
148+
Event getRelevantNonArtifactEventInPrivilegedContext(DataFlow::Node sink) {
149+
inPrivilegedContext(sink.asExpr(), result) and
150+
not exists(ControlCheck check |
151+
check.protects(sink.asExpr(), result, ["envvar-injection", "code-injection"])
152+
)
153+
}
154+
129155
/**
130156
* A taint-tracking configuration for unsafe user input
131157
* that is used to construct and evaluate an environment variable.
@@ -163,6 +189,18 @@ private module EnvVarInjectionConfig implements DataFlow::ConfigSig {
163189
exists(run.getScript().getAFileReadCommand())
164190
)
165191
}
192+
193+
predicate observeDiffInformedIncrementalMode() { any() }
194+
195+
Location getASelectedSourceLocation(DataFlow::Node source) { none() }
196+
197+
Location getASelectedSinkLocation(DataFlow::Node sink) {
198+
result = sink.getLocation()
199+
or
200+
result = getRelevantArtifactEventInPrivilegedContext(sink).getLocation()
201+
or
202+
result = getRelevantNonArtifactEventInPrivilegedContext(sink).getLocation()
203+
}
166204
}
167205

168206
/** Tracks flow of unsafe user input that is used to construct and evaluate an environment variable. */

0 commit comments

Comments
 (0)