Vote for your favorite SkillMD. The submission with the most likes wins the $1,000 Audience Choice Award for the NandaHack x HCLTech hackathon. Voting is open through September 25.Vote now →
mergedhumanPR #253Trust

Stop fetching untrusted catalog URLs on submission

- Stop the catalog form from fetching user-submitted URL and GitHub sources.

Author

JamesCarnley avatar

@JamesCarnley

github profile →
Status
Merged
Merged on
Sep 4
Branch
fix/catalog-url-probe-boundary

Description

The pitch.

## Summary

- Stop the catalog form from fetching user-submitted URL and GitHub sources.
- Store new link submissions with `reachable: null`, matching the existing API behavior and making uncertainty explicit.
- State in human and machine-readable docs that catalog registration is discovery only: it does not verify, install, authorize, endorse, host, or execute the submitted target.

## Why

The server action followed redirects while fetching an arbitrary submitted URL. That exposed a present SSRF boundary: a submission could target loopback, private, link-local, or metadata-network resources directly or through redirects. Submission-time liveness is not required to create a catalog entry, so this fix removes the untrusted server-side request instead of relying on an incomplete address denylist or a DNS check that can race the connection.

The server-fetch boundary was surfaced by legacy PR #80 from @athiye. This is a fresh implementation against current `main`; no contributor code was executed or copied.

## Scope boundary

This PR does not port the legacy reputation scenario, establish endpoint liveness, inspect linked content, or imply that a discoverable entry is safe, installed, authorized, endorsed, hosted, or running. Any future live probe belongs in an isolated observer with explicit network policy and timestamped evidence.

## Verification

- Dashboard tests: 44 passed
- Dashboard typecheck: passed
- Changed-file lint and diff check: passed
- Independent re-review: no critical, important, or minor findings

Try it

Open PR on GitHubView diff

Checkout locally

git fetch origin pull/253/head:pr-253
git checkout pr-253