feat(enrichment): flag deployment-trigger and webhook URLs in secret-scan - #3428
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> - 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 negative test asserts non-secret vendor URLs, a param-less Render URL, and a look-alike suffix host (...m.pipedream.net.evil.com) produce no finding; the Pipedream rule uses a negative-lookahead terminator to reject that suffix. 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. |
|
Caution 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥 🛑 Gittensory review result - reject/close recommendedReview updated: 2026-07-05 06:46:53 UTC
🛑 Suggested Action - Reject/Close
Review summary Blockers
Nits — 4 non-blocking
Why this is blocked
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.
|
|
Gittensory is closing this pull request on the maintainer's behalf (AI reviewers agree on a likely critical defect: review-enrichment/src/analyzers/secret-scan.ts:986: `https://example.m.pipedream.net-evil.com/path` is a valid look-alike hostname and this rule still reports `pipedream_webhook_url` because `(?![a-z0-9.])` allows `-`; change the terminator to reject all hostname continuation characters, e.g. `re: /https:\/\/[a-z0-9]+\.m\.pipedream\.net(?![A-Za-z0-9.-])/`, and add that exact near-miss case.). This is an automated maintenance action — to pursue this change, please open a new pull request with the issues resolved. Closed PRs may be analyzed later to improve review accuracy, but they are not automatically reopened or re-reviewed. |
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 a look-alike suffix host (
…m.pipedream.net.evil.com) does not match — thePipedream rule carries a negative-lookahead terminator to reject exactly that.
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.