Safeguard
Supply Chain•

What are externalParameters in SLSA provenance and who checks them?

externalParameters are build inputs a user controls, so SLSA treats them as untrusted and says they must be verified downstream. Here is how to check them.

Safeguard Security Team
4 min read

externalParameters are the inputs to a build that come from outside the build platform, such as a repository, a branch or a workflow file. SLSA treats them as untrusted, so the provenance must record them and a consumer must verify them. The platform's own settings are a different field.

If you only check that provenance exists and is signed, you can miss the field that tells you what a person actually asked the builder to do.

Where the field lives

In the SLSA v1.1 provenance format, buildDefinition holds the inputs and runDetails describes the run. Inside buildDefinition you find four items:

FieldWho controls itTrust level
buildTypeThe template for how the build runsIdentifies the template, with docs
externalParametersUsers and callersUntrusted, must be verified
internalParametersThe build platformTrusted, optional
resolvedDependenciesFetched during the buildBest effort completeness

The spec text says external parameters MUST be included in the provenance and MUST be verified downstream. That is strong wording for a spec that is otherwise flexible.

Why untrusted

Anyone who can start a build can influence these values. If a build can be pointed at an unusual repository or an unexpected workflow, the provenance will faithfully record that. A valid signature on provenance that says "built from a stranger's fork" is still a valid signature.

The SLSA threats overview lists modified external build parameters as a way to publish software that was not built from the purported sources. Recording the values is only useful if someone compares them with what was expected.

What a verifier should do

The verification page says the expectations should cover at least the builder identity, the canonical source repository, the build type and the external parameters. It also says verifiers should reject unrecognized fields in externalParameters. A parameter may allow a range of values if every value in that range is known to be safe.

A practical approach:

  1. Write down the full list of parameters your pipeline legitimately passes.
  2. Decide the allowed value or range for each, such as one repository and a protected branch pattern.
  3. Fail verification when a parameter is missing, new or out of range.
  4. Review the list whenever the pipeline definition changes.

What you do not need to verify

The provenance page says there is no need to verify internalParameters, because the platform is already trusted. They are useful for debugging and incident response, and sometimes for reproducing a build. Spend your checking effort on external inputs.

Common mistakes

Teams commonly verify the signature and the subject digest, then stop. Others accept any value for a parameter such as a branch name because the field "looks like metadata." Both leave a gap.

A related error is writing expectations once and never revisiting them. When a new workflow input is added, verification should fail until someone approves it. That failure is the control working.

Safeguard's policies and gates can enforce rules on pull requests and dependencies, which complements checking build inputs at deploy time. You can start with the free scan at https://gold.safeguard.sh/scan.

Quick check

Are externalParameters signed by the builder?

They are recorded in the provenance, which the builder signs. The values themselves still originate outside the platform, so they remain untrusted.

Should I verify internalParameters too?

The spec says there is no need, because the platform is already trusted.

Sources

Last reviewed: 19 October 2026.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.