fix(security): token exposed in git-push argv via http.extraheader — use askpass or credential helper #381

Closed
opened 2026-07-04 20:29:48 +02:00 by bosun · 0 comments
Owner

Empirical finding (external cold-read round 4)

git -c http.extraheader='Authorization: token TOKEN' push ... puts the token into the process argv. Visible via ps auxww and captured by system audit logs (auditd on many distros). Same class as embedding tokens in remote URLs (alcatraz-infra#89 fixed that adjacent case).

Meta-class: grep-sweep-missed-siblings — the alcatraz-infra#89 fix targeted URL-embedded tokens; the sibling argv-embedded token case survived because the sweep was for the URL pattern, not the semantic class of 'token visible outside process env.'

Blocking rationale

v1.0.0 signals broad-adoption readiness. Adopters running release-toolkit on shared runners (multi-tenant self-hosted, CI providers with sidecar containers) leak the release token to co-tenants and audit logs. Security-blocking for v1.0.0.

Fix path

Options:

Option A (preferred): GIT_ASKPASS script echoing token from env — token stays in env, never in argv
Option B: git credential-store credential helper — matches alcatraz-infra#89's discipline pattern
Option C: pipe token via stdin using --credential-fill — clean but git-version-sensitive

Verification AC

  • ps auxww | grep git during release-cut shows no token in argv
  • Regression test: mock push command, assert token absent from argv snapshot
  • External cold-read round 5 finds no argv-leak concern

Anchor

External outside-model cold-read round 4 (fresh ChatGPT session, 2026-07-03 late). Verdict: 'promising but not yet trustworthy' — SAME TIER as round-3 despite round-3 delta cycle. Meta-pattern named this round: grep-sweep-missed-siblings — the sweep-pattern targeted the literal grep-target, not the semantic class, so class-axis closed PARTIALLY per round. Operator ratified filing round-4 trackers 2026-07-04. This tracker addresses one of the round-4 findings. Success criterion: subsequent external cold-read returns no further objections of this class.

BLOCKING v1.0.0.

## Empirical finding (external cold-read round 4) `git -c http.extraheader='Authorization: token TOKEN' push ...` puts the token into the process argv. Visible via `ps auxww` and captured by system audit logs (auditd on many distros). Same class as embedding tokens in remote URLs (alcatraz-infra#89 fixed that adjacent case). **Meta-class**: grep-sweep-missed-siblings — the alcatraz-infra#89 fix targeted URL-embedded tokens; the sibling argv-embedded token case survived because the sweep was for the URL pattern, not the semantic class of 'token visible outside process env.' ## Blocking rationale v1.0.0 signals broad-adoption readiness. Adopters running release-toolkit on shared runners (multi-tenant self-hosted, CI providers with sidecar containers) leak the release token to co-tenants and audit logs. Security-blocking for v1.0.0. ## Fix path Options: **Option A (preferred)**: `GIT_ASKPASS` script echoing token from env — token stays in env, never in argv **Option B**: `git credential-store` credential helper — matches alcatraz-infra#89's discipline pattern **Option C**: pipe token via stdin using `--credential-fill` — clean but git-version-sensitive ## Verification AC - `ps auxww | grep git` during release-cut shows no token in argv - Regression test: mock push command, assert token absent from argv snapshot - External cold-read round 5 finds no argv-leak concern ## Anchor External outside-model cold-read round 4 (fresh ChatGPT session, 2026-07-03 late). Verdict: 'promising but not yet trustworthy' — SAME TIER as round-3 despite round-3 delta cycle. Meta-pattern named this round: grep-sweep-missed-siblings — the sweep-pattern targeted the literal grep-target, not the semantic class, so class-axis closed PARTIALLY per round. Operator ratified filing round-4 trackers 2026-07-04. This tracker addresses one of the round-4 findings. Success criterion: subsequent external cold-read returns no further objections of this class. BLOCKING v1.0.0.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
frankenbit/release-toolkit#381
No description provided.