Skip to content

Treat reusable-workflow secret inheritance as privileged execution #29

Description

@rmcdaniel

Problem

The public qualification scanner marks a job as privileged when it has write permissions, requests an environment, or contains an explicit ${{ secrets.* }} expression. A reusable-workflow caller with secrets: inherit has none of those shapes, so it is not treated as privileged when the workflow also supports workflow_dispatch. The scanner can therefore accept an unguarded manual-dispatch job that invokes a local or external reusable workflow and passes repository or organization secrets from a non-target ref.

For a local reusable workflow, the selected dispatch ref also selects the called workflow source. This permits contributor-controlled workflow code from an unprotected ref to receive inherited credentials while the portable trust scan remains green.

Acceptance criteria

  • Any job-level secrets declaration, including secrets: inherit and explicit reusable-workflow secret maps, is classified as privileged.
  • A privileged reusable-workflow caller reachable from workflow_dispatch is rejected unless its effective condition fails closed outside the repository target ref.
  • Pull-request and other untrusted contribution paths cannot pass inherited or explicitly mapped release, deployment, package-publish, cross-repository, or environment credentials.
  • Local reusable workflows cannot use an unprotected caller ref to select contributor-controlled workflow source with inherited secrets.
  • Focused regressions reject unguarded local and external secrets: inherit calls and unguarded explicit secret maps, while accepting a protected-target caller and a genuinely credential-free reusable workflow.

Delete when every reusable-workflow credential path participates in the same protected-ref and untrusted-contribution checks as direct secret expressions.

Metadata

Metadata

Assignees

No one assigned

    Labels

    authority:githubGitHub is the authoritative lifecycle record for this workbeta:blockerMust be resolved before the first 2.0 betacompletion:evidence-requiredClose only after all explicit acceptance and operational evidence is publiccompletion:evidence-verifiedAcceptance, fixed version, and required operational evidence are publicly verifiedkind:defectA public product behavior is incorrectpriority:P1High-priority product or release riskrepo:github-control-planeOwned by the public organization control planestatus:doneDerived from the authoritative closed issue state

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions