Skip to content

SRE-915: Split the App private key out of the Renovate job (not viable) - #94

Closed
TimDiekmann wants to merge 1 commit into
mainfrom
t/sre-915-narrow-vault-dev-role-housekeeping-workflow
Closed

SRE-915: Split the App private key out of the Renovate job (not viable)#94
TimDiekmann wants to merge 1 commit into
mainfrom
t/sre-915-narrow-vault-dev-role-housekeeping-workflow

Conversation

@TimDiekmann

@TimDiekmann TimDiekmann commented Aug 5, 2026

Copy link
Copy Markdown
Member

🌟 What is the purpose of this PR?

Closed unmerged β€” the approach cannot work. create-github-app-token registers the token with core.setSecret, and the runner drops job outputs whose value matches a registered secret:

##[warning]Skip output 'installation-token' since it may contain secret.

The consuming job received an empty RENOVATE_TOKEN and Renovate exited with "You must configure a GitHub token". A secret cannot be handed between jobs this way, and the alternatives β€” a shared symmetric key, or an artifact β€” are both worse than the problem.

Superseded by the transit-signing approach: Vault holds the App key as a non-exportable transit key and only signs the App JWT, so the key never enters CI at all. Tracked in Linear.

The original intent was to split the Renovate workflow into two jobs so the job running npm ci and Renovate would not hold the GitHub App private key.

πŸ”— Related links

πŸ” What was learned

  • Job outputs are not a transport for secrets. They are dropped, not merely unmasked.
  • Splitting jobs would not have helped against the payload seen in INC-29 anyway: vault-action calls core.setSecret on every retrieved value regardless of exportEnv, so a payload reading the runner's own memory recovers the key either way. Every mitigation at the workflow-configuration layer shares that limit.
  • What does work is one layer up β€” not executing untrusted install code, which the lockfile install in SRE-901: Install Renovate from the lockfileΒ #93 already covers β€” or one layer down, keeping the permanent credential out of CI entirely.

One job mints the installation token, the other installs and runs Renovate with needs. The second holds no id-token: write and never sees the private key, so code executing during npm ci or inside Renovate can take an hour-long token scoped to one repo rather than a permanent key covering the whole installation.

Every step in the minting job is a SHA-pinned third-party action or an inline run. A local uses: ./... would resolve from the caller's checked-out tree, which any token with contents: write can rewrite, and that would put attacker code back into the privileged job.

Job outputs are not masked like secrets, so the consuming job re-registers the token before anything else runs.
@TimDiekmann TimDiekmann self-assigned this Aug 5, 2026
@TimDiekmann TimDiekmann changed the title SRE-915: Split the App private key out of the Renovate job SRE-915: Split the App private key out of the Renovate job (not viable) Aug 5, 2026
@TimDiekmann TimDiekmann closed this Aug 5, 2026
@TimDiekmann
TimDiekmann deleted the t/sre-915-narrow-vault-dev-role-housekeeping-workflow branch August 5, 2026 12:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant