Skip to content

security(aggregator): fleet-feed push exposes the proxy credential in process argv and disables SSH host-key verification #948

Closed

Description

@dezren39

Finding

pm-stack/aggregator/scripts/push-fleet-feed.sh (added by PR #892, commit 46584cefaef5) hands the egress-proxy credential to socat by interpolating it into the SSH ProxyCommand string, so the proxy username/password appears in the ssh/scp/socat process command lines — readable by any local user via ps for the duration of every ~5-minute feed push. The same connection disables SSH host-key verification entirely.

Evidence (current main a2eef6f7920a)

  • pm-stack/aggregator/scripts/push-fleet-feed.sh:48:
    proxycmd = f"socat - PROXY:{u.hostname}:100.99.113.103:22,proxyport=3130,proxyauth={user}:{pw}"
  • :54 passes it as -o ProxyCommand={proxycmd} to scp and ssh (:60-67). Command lines are world-readable on Linux (/proc/<pid>/cmdline), so the shared proxy credential — read at runtime from HTTPS_PROXY / the mcpx daemon env — is exposed to any process on the sandbox for each push window.
  • :50-51: StrictHostKeyChecking=no with UserKnownHostsFile=/dev/null — the laptop's host key is never verified, on a connection authenticated with the sandbox's ~/.ssh/id_ed25519. A spoofed endpoint on the proxy route silently receives the feed push and the remote mv.
  • git grep proxyauth origin/main hits only this file — the pattern exists nowhere else in the repo.

The credential itself is not in the diff or the repo (it is read from a file/env at runtime) — this is about the hand-off mechanism, not a committed secret.

Why it matters

The proxy credential is a shared fleet secret (the same egress proxy mcpx uses). argv is the weakest place a secret can sit: it needs no file permission, no ptrace, no root — just ps. And with host-key checking off, the SSH transport the push relies on provides authentication of the client but none of the server, so the credential exposure and the MITM surface compound on the same connection.

Acceptance criteria

  • The proxy credential no longer appears in any process command line (e.g. env/fd-based hand-off to socat, or a mode-600 config file socat reads), verified by inspecting ps//proc during a push.
  • The laptop host key is pinned and verified (checked-in known-hosts entry, or Tailscale SSH), and a push to a mismatched key fails.
  • A grep-level guard or test asserts neither proxyauth= interpolation nor StrictHostKeyChecking=no reappears in push-fleet-feed.sh.
  • Normal fleet-feed pushes keep working end to end (feed arrives on the laptop, remote mv completes).

Found by the pr-diff-review job reviewing PR #892 against current main. Dedupe: searches for proxyauth / StrictHostKeyChecking push-fleet-feed returned no existing issue.

Activity

  1. added
    kind/securitySecurity issue or security hardening
    task/triageQueue packet kind: verify, reproduce, and route this item
    priority/highImportant and time-sensitive
    queue/queuedHas a queued task in the Supabase agent queue
    on Oct 26, 2026
  2. developing-today commented on Oct 26, 2026

    @developing-today
    Contributor
  3. dezren39 commented on Oct 26, 2026

    @dezren39
    MemberAuthor

    Agent note — state: filed; Agent: pr-diff-review job; Session/ID: pr-diff-review run 2026-10-25 23:37 CDT; Found via: filed this run (PR diff review against current main a2eef6f). A repo-task/v1 packet for this issue is being enqueued to the repo-health-code-pilot queue.

  4. added
    work/assignedQueue worker lifecycle state
    queue/claimedQueue worker lifecycle state
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Oct 26, 2026
  5. 6 remaining items

  6. added
    work/assignedQueue worker lifecycle state
    queue/claimedQueue worker lifecycle state
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Oct 26, 2026
  7. dezren39 commented on Oct 26, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · picked up

  8. dezren39 commented on Oct 26, 2026

    @dezren39
    MemberAuthor

    Agent note — claim finished, PR opened.

    The queue worker (task 1111) completed the implementation and pushed branch queue/1111-948-fleet-feed-proxy-hostkey (checkpoint: implementation_complete), but its run ended before it could open the PR or close out the task — the claim evaporated and the task sat capped at 2/2 attempts. As part of the queue repair Drew ordered today, the attempt cap was raised, the task was re-claimed and completed through the normal verbs, and the PR is open: #970.

  9. added
    task/small-fixQueue packet kind: bounded fix with reproduction and targeted tests
    and removed
    task/triageQueue packet kind: verify, reproduce, and route this item
    on Oct 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

app/aggregatorPackage/app: aggregator (pm-stack in this repo)kind/securitySecurity issue or security hardeningpriority/highImportant and time-sensitivesource/pr-diff-reviewFiled by the pr-diff-review jobstatus:donetask/small-fixQueue packet kind: bounded fix with reproduction and targeted tests

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions