diff --git a/ql/lib/codeql/actions/dataflow/ExternalFlow.qll b/ql/lib/codeql/actions/dataflow/ExternalFlow.qll index 1d1b0c6a719..9ddba387b51 100644 --- a/ql/lib/codeql/actions/dataflow/ExternalFlow.qll +++ b/ql/lib/codeql/actions/dataflow/ExternalFlow.qll @@ -1,6 +1,7 @@ +private import actions private import internal.ExternalFlowExtensions as Extensions private import codeql.actions.DataFlow -private import actions +private import codeql.actions.security.ArtifactPoisoningQuery /** * MaD sources @@ -91,6 +92,12 @@ predicate madStoreStep(DataFlow::Node pred, DataFlow::Node succ, DataFlow::Conte or input.trim().matches("input.%") and pred.asExpr() = uses.getArgumentExpr(input.trim().replaceAll("input.", "")) + or + input.trim() = "artifact" and + exists(UntrustedArtifactDownloadStep download | + pred.asExpr() = download and + download.getAFollowingStep() = uses + ) ) and succ.asExpr() = uses ) diff --git a/ql/lib/ext/manual/read-file-actions.model.yml b/ql/lib/ext/manual/read-file-actions.model.yml new file mode 100644 index 00000000000..1b9bd745a65 --- /dev/null +++ b/ql/lib/ext/manual/read-file-actions.model.yml @@ -0,0 +1,33 @@ +extensions: + - addsTo: + pack: github/actions-all + extensible: actionsSummaryModel + data: + - ["juliangruber/read-file-action", "*", "artifact", "output.content", "taint", "manual"] + - ["bfren/read-file", "*", "artifact", "output.contents", "taint", "manual"] + - ["igorskyflyer/action-readfile", "*", "artifact", "output.content", "taint", "manual"] + - ["komorebitech/read-files-action", "*", "artifact", "output.content", "taint", "manual"] + - ["jaywcjlove/github-action-read-file", "*", "artifact", "output.content", "taint", "manual"] + - ["andstor/file-reader-action", "*", "artifact", "output.contents", "taint", "manual"] + - ["Reedyuk/read-properties", "*", "artifact", "output.value", "taint", "manual"] + - ["browniebroke/read-nvmrc-action", "*", "artifact", "output.node_version", "taint", "manual"] + - ["jbutcher5/read-yaml", "*", "artifact", "output.data", "taint", "manual"] + - ["christian-draeger/read-properties", "*", "artifact", "output.*", "taint", "manual"] + - ["traversals-analytics-and-intelligence/file-reader-action", "*", "artifact", "output.content", "taint", "manual"] + - ["pietrobolcato/action-read-yaml", "*", "artifact", "output.*", "taint", "manual"] + - ["satya-500/read-file-github-action", "*", "artifact", "output.contents", "taint", "manual"] + - ["guibranco/github-file-reader-action-v2", "*", "artifact", "output.contents", "taint", "manual"] + - ["gagle/package-version", "*", "artifact", "output.version", "taint", "manual"] + - ["ActionsTools/read-json-action", "*", "artifact", "output.*", "taint", "manual"] + - ["madhead/read-java-properties", "*", "artifact", "output.*", "taint", "manual"] + - ["pietrobolcato/action-read-yaml", "*", "artifact", "output.*", "taint", "manual"] + - ["rexdefuror/read-package-json", "*", "artifact", "env.*", "taint", "manual"] + - ["BrycensRanch/read-properties-action", "*", "artifact", "output.*", "taint", "manual"] + - ["kurt-code/gha-properties", "*", "artifact", "output.*", "taint", "manual"] + - ["SebRollen/toml-action", "*", "artifact", "output.value", "taint", "manual"] + - ["simonblund/version-reader", "*", "artifact", "output.version", "taint", "manual"] + - ["mindsers/changelog-reader-action", "*", "artifact", "output.*", "taint", "manual"] + - ["nichmor/minimal-read-yaml", "*", "artifact", "output.*", "taint", "manual"] + - ["miraai/read-helm-chart-yaml", "*", "artifact", "output.*", "taint", "manual"] + - ["dangdennis/toml-action", "*", "artifact", "output.value", "taint", "manual"] + - ["artlaman/conventional-changelog-reader-action", "*", "artifact", "output.*", "taint", "manual"] diff --git a/ql/test/query-tests/Security/CWE-094/.github/workflows/artifactpoisoning5.yml b/ql/test/query-tests/Security/CWE-094/.github/workflows/artifactpoisoning5.yml index 633c45661e5..4a2b9b50eb6 100644 --- a/ql/test/query-tests/Security/CWE-094/.github/workflows/artifactpoisoning5.yml +++ b/ql/test/query-tests/Security/CWE-094/.github/workflows/artifactpoisoning5.yml @@ -19,5 +19,5 @@ jobs: with: path: ./artifact.txt - name: Use artifact - run: echo ${{ steps.artifact.outputs.contents }} + run: echo ${{ steps.artifact.outputs.content }} diff --git a/ql/test/query-tests/Security/CWE-094/CodeInjectionCritical.expected b/ql/test/query-tests/Security/CWE-094/CodeInjectionCritical.expected index 370241c7ac0..2e0f79da4a0 100644 --- a/ql/test/query-tests/Security/CWE-094/CodeInjectionCritical.expected +++ b/ql/test/query-tests/Security/CWE-094/CodeInjectionCritical.expected @@ -9,6 +9,8 @@ edges | .github/workflows/artifactpoisoning4.yml:9:9:17:6 | Uses Step | .github/workflows/artifactpoisoning4.yml:19:14:19:58 | echo "::set-output name=id::$(