Skip to content

fix(percy): disable runPercyScan#285

Merged
gaurav-singh-9227 merged 1 commit intobrowserstack:mainfrom
manoj-k04:PMAA-100-disable-runpercyscan
Apr 27, 2026
Merged

fix(percy): disable runPercyScan#285
gaurav-singh-9227 merged 1 commit intobrowserstack:mainfrom
manoj-k04:PMAA-100-disable-runpercyscan

Conversation

@manoj-k04
Copy link
Copy Markdown
Collaborator

@manoj-k04 manoj-k04 commented Apr 27, 2026

Summary

  • Temporary fix for PMAA-100 / HackerOne #3576387: runPercyScan was embedding the server-fetched Percy token in plaintext inside the tool response (export PERCY_TOKEN="<actual_token>").
  • Disables the runPercyScan MCP tool registration in src/tools/percy-sdk.ts so the leaking code path is no longer reachable via tools/list / tools/call.
  • Underlying source (src/tools/run-percy-scan.ts) is untouched — it remains exported and unit-tested. The proper fix (replacing the interpolated token with a placeholder) will land in the planned sprint per Gaurav's note on the ticket.
  • Note: a similar plaintext-token emission pattern exists in src/tools/sdk-utils/percy-web/handler.ts (called from expandPercyVisualTesting). Reporter flagged it under "Code References" in the original H1 submission. Out of scope for this temp fix per Pradum's instruction; should be addressed in the proper-fix PR.

Test plan

  • npm run lint
  • npx tsc --noEmit
  • npm test — 122/122 pass
  • Reviewer: confirm runPercyScan no longer appears in tools/list from a connected MCP client

@gaurav-singh-9227 gaurav-singh-9227 merged commit d6f20a7 into browserstack:main Apr 27, 2026
1 check passed
manoj-k04 added a commit to manoj-k04/mcp-server that referenced this pull request Apr 30, 2026
The Percy token fetched from api.browserstack.com was being interpolated
verbatim into runPercyScan tool output (and the percy-web /
percy-automate SDK handlers), exposing a server-side credential across a
trust boundary into MCP client / AI-assistant context (HackerOne
#3576387, CVSS 6.5).

PMAA-100 (PR browserstack#285) mitigated this by disabling the runPercyScan tool
registration. This change removes the underlying leak so the tool can be
safely re-enabled.

Output sanitization
- run-percy-scan.ts: generatePercyTokenInstructions returns
  placeholder-only text and points users to the Percy dashboard. The
  token is still fetched (preserves the existing project-validation
  side effect of fetchPercyToken) but is intentionally not echoed.
- percy-web/handler.ts and percy-automate/handler.ts: same treatment in
  runPercyWeb and runPercyAutomateOnly. Parameter signatures are kept
  for upstream compatibility; SECURITY comments document why the token
  must not be interpolated.

Tool re-enabled
- percy-sdk.ts: restore the runPercyScan import, schema import, and
  tool registration block that PMAA-100 commented out.
- percySdk.test.ts: restore the matching import, mock, name assertion,
  and "runPercyScan - SUCCESS" test.

Regression coverage
- runPercyScan.test.ts: assertions inverted — output must NOT contain
  the fetched token; the placeholder must be present.
- percyTokenLeak.test.ts (new): pin the no-leak contract on
  runPercyWeb and runPercyAutomateOnly directly so any future regression
  fails CI.

Refs: HackerOne #3576387, PMAA-100, PMAA-103

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants