Git, CI/CD & GitOpsLXVI · Third-Party Actions and PluginsRisk
Third-party actions are code — they execute on the runner
What you'll learn
- Recognise that a third-party action is arbitrary code, not a vetted library
- Identify the runner privileges an action inherits when its step runs
- Distinguish a first-party action from a third-party one by ownership
- Recognise why the marketplace is a discovery layer, not a trust layer
Prerequisites
Verified against Git 2.55.x teaching target; 2.40+ minimum · GitHub Actions continuous service; Aug 2026 documentation baseline · Argo CD v3.5.x teaching target; v3.0+ minimum · Flux v2.9.x · Sigstore Cosign v3.1.x · SLSA v1.2 · OCI Distribution Specification v1.1 · Git LFS v3.7.1 · Kubernetes (cross-course target) 1.36.x
A uses: line in a workflow is a code-fetch instruction. The
runner downloads the referenced action and executes it with
every secret, network path, and write privilege the job holds.
The trust you extend to the marketplace is the trust you extend
to the action’s author, to their node_modules, and to their
build pipeline. The marketplace is a discovery layer; it is not
a trust layer.
First-party versus third-party
Actions are categorised by ownership. A first-party action
lives in a repository owned by the same user or organisation as
the workflow file — actions/checkout, actions/setup-node,
and github/codeql-action are first-party because GitHub owns
them. A third-party action lives in a repository owned by
someone else. The trust boundary stops at the runner and resumes
at the action author’s repository.
flowchart LR
A["Workflow repo"] --> B["Runner"]
B --> C["First-party action"]
B --> D["Third-party action"]
C --> E["Same-org trust"]
D --> F["External trust"]
D --> G["Author deps"]
D --> H["Author build pipeline"]
A first-party action inherits the identity the runner already trusts. A third-party action extends that trust to a stranger, and to that stranger’s transitive dependencies and release pipeline.
What the runner actually executes
When the runner resolves uses: thirdparty/action@v1, three
things happen: resolve the reference, download the action’s
files (action.yml, index.js, Dockerfile, plus
node_modules for JavaScript actions), and execute the
action’s runs.using entry. The action inherits every
privilege the job has — read access to the checkout, every
secret in secrets.*, the runner’s network egress, and write
access to the runner’s filesystem during the job.
Why the marketplace is not a trust layer
The marketplace shows a verified badge, a star count, a download counter, and a maintainer name. The badge is a domain verification (the publisher controls the listed URL). The star count is social proof. The download counter is a number. The maintainer name is a GitHub account. None of these are a security audit of the action’s code, its dependencies, or its maintenance status. The marketplace is a catalogue; the trust evaluation is the consumer’s responsibility.
Production discipline
- Default to first-party actions.
actions/checkout,actions/setup-node,aws-actions/configure-aws-credentials. - Treat every third-party
uses:line as a code-review item. The PR must justify the maintainer and the version. - Read the action’s source. Not the README; the
action.yml, theindex.js, thepackage.json. - Pin the reference to a SHA, not a tag. Covered in LXVI-05.
- Restrict the runner’s privileges. Narrower secrets and shorter token TTLs shrink the blast radius.
Cross-course references
- Git, CI/CD & GitOps — Part LXV-04 (Runner as Actor) establishes the runner’s privilege model.
- Git, CI/CD & GitOps — Part LXV-03 (Dependency Trust) covers the package-level analogue.
- Linux for Production Sysadmins — Part XII (RepoSecurity) covers the apt/dnf trust model.
Quiz
Knowledge check · 4 questions
Q1. Which signal in the GitHub Marketplace is closest to a security review of a third-party action?
Q2. A third-party action runs with the same access to the job's secrets and filesystem as a first-party step written by your own team.
Q3. Name two distinguishing markers that separate a first-party action from a third-party action in GitHub Actions.
Q4. Identify the trust gap in the workflow and the rule that closes it.
Team T maintains `acme-corp/infra`, which builds Terraform modules. The workflow uses `acme-corp/setup-terraform` (first-party) and `thirdparty/notify-slack@v2` (third-party, tag-pinned, last updated three years ago). The `notify-slack` action receives the OIDC token the job uses to assume the AWS deploy role.
Passing score: 75%. Answers are checked in this browser.