Skip to content

Commit e6f587e

Browse files
authored
Merge pull request #21715 from knewbury01/knewbury01/adjust-actions-queries-untrusted-checkout
Improve actions/ql/src/Security/CWE-829/UntrustedCheckoutX queries
2 parents 2d2b690 + 6a8f9a9 commit e6f587e

8 files changed

Lines changed: 111 additions & 6 deletions
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* Altered 2 patterns in the `poisonable_steps` modelling. Extra sinks are detected in the following cases: scripts executed via python modules and `go run` in directories are detected as potential mechanisms of injection. For the go execution pattern, the pattern is updated to now ignore flags that occur between go and the specific command. This change may lead to more results being detected by the following queries: `actions/untrusted-checkout/high`, `actions/untrusted-checkout/critical`, `actions/untrusted-checkout-toctou/high`, `actions/untrusted-checkout-toctou/critical`, `actions/cache-poisoning/poisonable-step`, `actions/cache-poisoning/direct-cache` and `actions/artifact-poisoning/path-traversal`.

actions/ql/lib/ext/config/poisonable_steps.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ extensions:
7070
- ["(source|sh|bash|zsh|fish)\\s+([^\\s]+)\\b", 2]
7171
- ["(node)\\s+([^\\s]+)(\\.js|\\.ts)\\b", 2]
7272
- ["(python[\\d\\.]*)\\s+([^\\s]+)\\.py\\b", 2]
73+
- ["(python[\\d\\.]*)\\s+-m\\s+([A-Za-z_][\\w\\.]*)\\b", 2] # eg: pythonX -m anything(dir or file)
7374
- ["(ruby)\\s+([^\\s]+)\\.rb\\b", 2]
74-
- ["(go)\\s+(generate|run)\\s+([^\\s]+)\\.go\\b", 3]
75+
- ["(go)\\s+(generate|run)(?:\\s+-[^\\s]+)*\\s+([^\\s]+)", 3]
7576
- ["(dotnet)\\s+([^\\s]+)\\.csproj\\b", 2]
76-

actions/ql/src/Security/CWE-829/UntrustedCheckoutCritical.md

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,35 @@
11
## Overview
22

3-
GitHub workflows can be triggered through various repository events, including incoming pull requests (PRs) or comments on Issues/PRs. A potentially dangerous misuse of the triggers such as `pull_request_target` or `issue_comment` followed by an explicit checkout of untrusted code (Pull Request HEAD) may lead to repository compromise if untrusted code gets executed (e.g., due to a modified build script) in a privileged job.
3+
GitHub workflows can be triggered through various repository events, including incoming pull requests (PRs) or comments on Issues/PRs. Under certain conditions described below, attackers can take over a repository by opening malicious PRs from forks. The attacks can result in malicious code execution causing unauthorized changes to the repository or exfiltration of repository secrets and a compromise of connected systems.
4+
5+
## Workflow Security Model
6+
7+
In GitHub Actions, there is a distinction between unprivileged and privileged workflows. For example, a workflow with a `pull_request` trigger is unprivileged while a workflow with `pull_request_target` is privileged.
8+
9+
This is relevant especially for PRs from forks. Normal PRs can only be submitted by people who have write access to a repository, while PRs from forks can be submitted by anyone.
10+
11+
On a PR from a fork, an unprivileged `pull_request` workflow has only limited capabilities but a privileged `pull_request_target` workflow is much more dangerous. A privileged workflow:
12+
13+
* Runs in the context of the base repository
14+
* Has access to organization and repository secrets (e.g., API keys, deployment tokens)
15+
* Has a read/write `GITHUB_TOKEN` by default
16+
* Can access private resources
17+
18+
Certain triggers automatically grant a workflow elevated privileges:
19+
20+
* `pull_request_target` as described above
21+
* `workflow_run`: Triggered when another workflow completes.
22+
* `issue_comment`: Triggered when a comment is made on an issue or PR.
23+
24+
## Attack Details
25+
26+
* A repository has a privileged workflow
27+
* An attacker forks the repository and adds malicious code (e.g., in the build script)
28+
* The attacker opens a PR from the fork, and, if needed, comments on the PR
29+
* The workflow in the base repository checks out the forked code
30+
* The workflow runs, (e.g. the build script etc.), which contains the malicious code
31+
32+
Please note that not only build scripts can be malicious code vectors. There is a large number of other possibilities. Some of them are listed in the [LOTP](https://boostsecurityio.github.io/lotp/) catalog.
433

534
## Recommendation
635

@@ -133,3 +162,5 @@ jobs:
133162
## References
134163
135164
- GitHub Security Lab Research: [Keeping your GitHub Actions and workflows secure Part 1: Preventing pwn requests](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/).
165+
- Mitigating risks of untrusted checkout: [GitHub Docs](https://docs.github.com/en/enterprise-cloud@latest/actions/reference/security/secure-use#mitigating-the-risks-of-untrusted-code-checkout).
166+
- Living Off the Pipeline: [LOTP](https://boostsecurityio.github.io/lotp/).

actions/ql/src/Security/CWE-829/UntrustedCheckoutHigh.md

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,35 @@
11
## Overview
22

3-
GitHub workflows can be triggered through various repository events, including incoming pull requests (PRs) or comments on Issues/PRs. A potentially dangerous misuse of the triggers such as `pull_request_target` or `issue_comment` followed by an explicit checkout of untrusted code (Pull Request HEAD) may lead to repository compromise if untrusted code gets executed (e.g., due to a modified build script) in a privileged job.
3+
GitHub workflows can be triggered through various repository events, including incoming pull requests (PRs) or comments on Issues/PRs. Under certain conditions described below, attackers can take over a repository by opening malicious PRs from forks. The attacks can result in malicious code execution causing unauthorized changes to the repository or exfiltration of repository secrets and a compromise of connected systems.
4+
5+
## Workflow Security Model
6+
7+
In GitHub Actions, there is a distinction between unprivileged and privileged workflows. For example, a workflow with a `pull_request` trigger is unprivileged while a workflow with `pull_request_target` is privileged.
8+
9+
This is relevant especially for PRs from forks. Normal PRs can only be submitted by people who have write access to a repository, while PRs from forks can be submitted by anyone.
10+
11+
On a PR from a fork, an unprivileged `pull_request` workflow has only limited capabilities but a privileged `pull_request_target` workflow is much more dangerous. A privileged workflow:
12+
13+
* Runs in the context of the base repository
14+
* Has access to organization and repository secrets (e.g., API keys, deployment tokens)
15+
* Has a read/write `GITHUB_TOKEN` by default
16+
* Can access private resources
17+
18+
Certain triggers automatically grant a workflow elevated privileges:
19+
20+
* `pull_request_target` as described above
21+
* `workflow_run`: Triggered when another workflow completes.
22+
* `issue_comment`: Triggered when a comment is made on an issue or PR.
23+
24+
## Attack Details
25+
26+
* A repository has a privileged workflow
27+
* An attacker forks the repository and adds malicious code (e.g., in the build script)
28+
* The attacker opens a PR from the fork, and, if needed, comments on the PR
29+
* The workflow in the base repository checks out the forked code
30+
* The workflow runs, (e.g. the build script etc.), which contains the malicious code
31+
32+
Please note that not only build scripts can be malicious code vectors. There is a large number of other possibilities. Some of them are listed in the [LOTP](https://boostsecurityio.github.io/lotp/) catalog.
433

534
## Recommendation
635

@@ -133,3 +162,5 @@ jobs:
133162
## References
134163
135164
- GitHub Security Lab Research: [Keeping your GitHub Actions and workflows secure Part 1: Preventing pwn requests](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/).
165+
- Mitigating risks of untrusted checkout: [GitHub Docs](https://docs.github.com/en/enterprise-cloud@latest/actions/reference/security/secure-use#mitigating-the-risks-of-untrusted-code-checkout).
166+
- Living Off the Pipeline: [LOTP](https://boostsecurityio.github.io/lotp/).

actions/ql/src/Security/CWE-829/UntrustedCheckoutHigh.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* @name Checkout of untrusted code in trusted context
2+
* @name Checkout of untrusted code in privileged context without privileged context use
33
* @description Privileged workflows have read/write access to the base repository and access to secrets.
44
* By explicitly checking out and running the build script from a fork the untrusted code is running in an environment
55
* that is able to push to the base repository and to access secrets.

actions/ql/src/Security/CWE-829/UntrustedCheckoutMedium.md

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,35 @@
11
## Overview
22

3-
GitHub workflows can be triggered through various repository events, including incoming pull requests (PRs) or comments on Issues/PRs. A potentially dangerous misuse of the triggers such as `pull_request_target` or `issue_comment` followed by an explicit checkout of untrusted code (Pull Request HEAD) may lead to repository compromise if untrusted code gets executed (e.g., due to a modified build script) in a privileged job.
3+
GitHub workflows can be triggered through various repository events, including incoming pull requests (PRs) or comments on Issues/PRs. Under certain conditions described below, attackers can take over a repository by opening malicious PRs from forks. The attacks can result in malicious code execution causing unauthorized changes to the repository or exfiltration of repository secrets and a compromise of connected systems.
4+
5+
## Workflow Security Model
6+
7+
In GitHub Actions, there is a distinction between unprivileged and privileged workflows. For example, a workflow with a `pull_request` trigger is unprivileged while a workflow with `pull_request_target` is privileged.
8+
9+
This is relevant especially for PRs from forks. Normal PRs can only be submitted by people who have write access to a repository, while PRs from forks can be submitted by anyone.
10+
11+
On a PR from a fork, an unprivileged `pull_request` workflow has only limited capabilities but a privileged `pull_request_target` workflow is much more dangerous. A privileged workflow:
12+
13+
* Runs in the context of the base repository
14+
* Has access to organization and repository secrets (e.g., API keys, deployment tokens)
15+
* Has a read/write `GITHUB_TOKEN` by default
16+
* Can access private resources
17+
18+
Certain triggers automatically grant a workflow elevated privileges:
19+
20+
* `pull_request_target` as described above
21+
* `workflow_run`: Triggered when another workflow completes.
22+
* `issue_comment`: Triggered when a comment is made on an issue or PR.
23+
24+
## Attack Details
25+
26+
* A repository has a privileged workflow
27+
* An attacker forks the repository and adds malicious code (e.g., in the build script)
28+
* The attacker opens a PR from the fork, and, if needed, comments on the PR
29+
* The workflow in the base repository checks out the forked code
30+
* The workflow runs, (e.g. the build script etc.), which contains the malicious code
31+
32+
Please note that not only build scripts can be malicious code vectors. There is a large number of other possibilities. Some of them are listed in the [LOTP](https://boostsecurityio.github.io/lotp/) catalog.
433

534
## Recommendation
635

@@ -133,3 +162,5 @@ jobs:
133162
## References
134163
135164
- GitHub Security Lab Research: [Keeping your GitHub Actions and workflows secure Part 1: Preventing pwn requests](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/).
165+
- Mitigating risks of untrusted checkout: [GitHub Docs](https://docs.github.com/en/enterprise-cloud@latest/actions/reference/security/secure-use#mitigating-the-risks-of-untrusted-code-checkout).
166+
- Living Off the Pipeline: [LOTP](https://boostsecurityio.github.io/lotp/).
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: fix
3+
---
4+
* Fixed help file descriptions for queries: `actions/untrusted-checkout/critical`, `actions/untrusted-checkout/high`, `actions/untrusted-checkout/medium`. Previously the messages were unclear as to why and how the vulnerabilities could occur.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: queryMetadata
3+
---
4+
* Adjusted the name of `actions/untrusted-checkout/high` to more clearly describe which parts of the scenario are in a privileged context.

0 commit comments

Comments
 (0)