feat(enrichment): flag deployment-trigger and webhook URLs in secret-scan - #3442
Conversation
…scan Add seven high-confidence RULES for deployment-trigger and webhook URLs that embed a secret, following the existing URL-credential rules — a committed URL of this shape leaks a capability (trigger a deploy, suppress a monitor's alerts). - netlify_build_hook_url: api.netlify.com/build_hooks/<id> - vercel_deploy_hook_url: api.vercel.com/v1/integrations/deploy/prj_<id>/<token> - render_deploy_hook_url: api.render.com/deploy/srv-<id>?key=<key> - healthchecks_ping_url: hc-ping.com/<uuid> (case-insensitive) - pipedream_webhook_url: <endpoint>.m.pipedream.net - azure_logic_app_url: <host>.logic.azure.com/workflows/...?sig=<sas> - google_apps_script_url: script.google.com/macros/s/<deployment-id>/exec Each match is a full vendor URL (host + secret path/param), so an ordinary string cannot trip it and there is no token length to guess. The Pipedream rule ends at the host, so its terminator rejects every hostname-continuation char (`.`, `-`, alphanumeric) — a look-alike suffix host (`...m.pipedream.net.evil.com` or `...m.pipedream.net-evil.com`) is not matched, both asserted in the negative test. All kinds are new and inserted before the generic-assignment rule. SecretFinding.kind is a plain string, so there is no types/render/metadata change.
|
Superagent didn't find any vulnerabilities or security issues in this PR. |
|
Warning 🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨 ⏸️ Gittensory review result - manual review recommendedReview updated: 2026-07-05 07:11:57 UTC
⏸️ Suggested Action - Manual Review Review summary Nits — 5 non-blocking
Review context
Contributor next steps
Signal definitions
🟩 Safe / merged · 🟦 Advisory · 🟨 Held for review · 🟥 Blocked / closed 💰 Earn for open-source contributions like this. Gittensor lets GitHub contributors earn for the work they already do — register to start earning →. Checked by Gittensory, a quiet PR intelligence layer for OSS maintainers.
|
Summary
Extends the secret-scan analyzer with 7 new high-confidence rules for deployment-trigger and webhook URLs
that embed a secret. These follow the existing URL-credential rules (
slack_webhook_url/discord_webhook_url/
teams_webhook_url/zapier_webhook_url/google_chat_webhook_url): a committed URL of this shape leaks acapability — anyone who has it can trigger a production deploy or suppress a monitor's alerts.
netlify_build_hook_urlapi.netlify.com/build_hooks/<id>vercel_deploy_hook_urlapi.vercel.com/v1/integrations/deploy/prj_<id>/<token>render_deploy_hook_urlapi.render.com/deploy/srv-<id>?key=<key>healthchecks_ping_urlhc-ping.com/<uuid>pipedream_webhook_url<endpoint>.m.pipedream.netazure_logic_app_url<host>.logic.azure.com/workflows/…?sig=<sas>sig=)google_apps_script_urlscript.google.com/macros/s/<deployment-id>/execWhy these are false-positive-safe. Every match is a full vendor-specific URL (host + the secret
path/param), so an ordinary string can't trip them, and there is no length to guess (the precision class that has
caused past regressions doesn't apply — the host anchors the match). The negative test asserts that vendor
API/docs/dashboard URLs with no secret segment produce nothing, that a Render deploy URL without the
keyquery param is not flagged, and that both a dot-joined and a hyphen-joined look-alike suffix host
(
…m.pipedream.net.evil.com,…m.pipedream.net-evil.com) do not match — the Pipedream rule is the only one whosematch ends at the host, so its terminator rejects every hostname-continuation character.
All 7 are new kinds (verified against the analyzer's current rule kinds — no duplicate) and inserted before
the generic-assignment rule so the specific kind wins.
SecretFinding.kindis a free-formstring, so there isno
types.ts/render.ts/analyzer-metadata.jsonchange — a two-file, rules-only diff.No linked issue: additive detection-coverage extending an existing analyzer along its own established lines; each
rule is a self-evident, industry-standard credential URL with no public API/schema/deploy surface change — fits
the repo's
preferred(not required) linked-issue policy.Scope
type(scope): short summaryConventional Commit format, for examplefix(api): restore profile access checks.CONTRIBUTING.mdand does not reintroduce GitHub Pages, VitePress,site/, orCNAME.Validation
git diff --checknpm run typechecknpm run rees:test— the review-enrichment build + analyzer suite (see note below)npm run test:coverage(N/A — this analyzer is inreview-enrichment/, outside the rootsrc/**Codecov scope)npm run ui:buildnpm audit --audit-level=moderateIf any required check was skipped, explain why:
git diff --check(clean), the review-enrichment TypeScript build (exit 0), and the secret-scansuite via
node --test— 104/104 pass, including a table test asserting each of the 7 new URL formatsproduces exactly one finding of its own kind at high confidence, and a negative test asserting non-secret
vendor URLs, a param-less Render URL, and a look-alike suffix host produce none.
metadata:checkstep ofrees:test. This change adds onlyRULES entries (no analyzer descriptor field), so the committed
analyzer-metadata.json/ UI mirror areunchanged (a local regeneration produces a zero-content diff) and
metadata:checkpasses on CI (Linux). Onthis Windows dev box
metadata:checkreports a spurious line-ending difference; it fails identically onunmodified
main.analyzer-metadata.jsonwas NOT modified.Safety
UI Evidencesection below with JPG/JPEG or PNG screenshots arranged as organized, captioned, clickable thumbnails. SVG screenshots are not used as review evidence. Review-only screenshots or recordings are not committed to the repository.Notes
rule or the analyzer descriptor changed, so current findings and
analyzer-metadata.jsonare unaffected. Eachnew kind reports only
file:line+ the public-safe kind, never the matched value.so GitHub push protection does not flag this fixture file.