Back to skill

Security audit

myatriumhealth-mcp

Security checks for vulnerabilities and agentic risk

Overview

The skill is openly designed to read MyAtriumHealth data, but it gives a persistent browser relay broad access to sensitive health information and generic authenticated portal requests.

Review this before installing. It is not proven malicious, but only use it if you are comfortable granting a persistent browser relay access to your MyAtriumHealth session and having sensitive health data printed in a shell. Prefer pinned dependency versions, revoke the browser pairing after use, avoid storing tokens or full responses, and do not run generic helper calls against endpoints you have not reviewed.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (2)

T08 · Insecure Dependencies

Warning
Location
SKILL.md:26
Finding
Unpinned Global Installation of a Privileged Browser-Relay Dependency<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:26` **Vulnerability Type**: Supply-chain exposure through an unpinned dependency **Risk Level**: Medium ### Vulnerable Code ```sh npm i -g @fetchproxy/cli # also needs the Transporter Chrome extension ``` ### Technical Analysis The setup instructions install the latest available version of `@fetchproxy/cli` globally without an exact version pin, lockfile, package-integrity check, or documented verification procedure. This dependency is particularly sensitive because it participates in a persistent browser relay that sends authenticated requests through a signed-in MyAtriumHealth tab. According to the Skill documentation, the associated profile receives access to authentication cookies and relays requests that can return protected health information. Although the audited files contain no evidence that the current package is malicious, installing an unpinned latest release means the code executed by future users may differ from the version that was reviewed. A compromised package publisher, registry account, release pipeline, or newly published malicious version could therefore affect the trusted browser-session relay. ### Attack Path 1. An attacker compromises the npm package, maintainer credentials, or release process for `@fetchproxy/cli`. 2. The attacker publishes a malicious version under the legitimate package name. 3. A user follows the Skill instructions and runs `npm i -g @fetchproxy/cli`. 4. npm installs the attacker-controlled latest version globally. 5. The user pairs the CLI with the Transporter browser extension and creates the MyAtriumHealth profile. 6. The compromised dependency observes, alters, or redirects authenticated operations handled through the browser relay. 7. Protected health information or security material available to the relay may be exposed within the dependency's effective privileges. ### Impact Assessment Successful exploitation could affect the ...[truncated 527 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin `@fetchproxy/cli` to an exact, reviewed version rather than installing the latest release: ```sh npm install --global @fetchproxy/cli@<reviewed-version> ``` 2. Document the expected package publisher, official registry, and approved Transporter extension source. 3. Publish and verify expected package integrity information or signed release artifacts where supported. 4. Prefer a project-local installation with a committed lockfile over a global installation: ```sh npm install --save-exact @fetchproxy/cli@<reviewed-version> ``` 5. Invoke the locked local binary rather than relying on an unrestricted global executable. 6. Re-audit dependency updates before changing the pinned version. 7. Document how users can revoke the persistent browser pairing and remove the profile after use. ]]>

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
references/mah.sh:75
Finding
Generic Authenticated POST Helpers Exceed the Declared Read-Only Scope<![CDATA[ ## Vulnerability Details **File Location**: `references/mah.sh:75-88`, `references/mah.sh:91-101`, and `references/mah.sh:121-130` **Vulnerability Type**: Overprivileged authenticated request interface **Risk Level**: Medium ### Vulnerable Code ```sh # mah_api <area/Action> [json-body] — modern JSON endpoints. Default body {}. mah_api() { local ep="$1" body="${2:-{\}}" tok tok="$(mah_token)" if [ -z "$tok" ]; then echo "no antiforgery token — sign in to MyAtriumHealth in Chrome, then retry" >&2 return 2 fi fpx request "$MAH_BASE/api/$ep" -p "$MAH_PROFILE" -X POST \ -H "__RequestVerificationToken: $tok" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d "$body" } ``` ```sh # mah_legacy <Area/Controller/Action> [querystring] — older form-encoded endpoints. mah_legacy() { local ep="$1" qs="$2" tok tok="$(mah_token)" [ -n "$tok" ] || { echo "no antiforgery token — sign in first" >&2; return 2; } fpx request "$MAH_BASE/$ep?${qs}${qs:+&}noCache=0.$RANDOM" -p "$MAH_PROFILE" -X POST \ -H "__RequestVerificationToken: $tok" \ -H "X-Requested-With: XMLHttpRequest" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d '' } ``` ```sh # mah_legacy_form <Area/Controller/Action> <urlencoded-form-body> # Some legacy endpoints require a form BODY rather than query params — e.g. # Insurance/Coverages/GetCoverages needs isStandAlone=true, and returns the # "Oops!" error page without it. mah_legacy_form() { local ep="$1" form="$2" tok # Guard on EMPTINESS, not just exit status: mah_token exits 0 while printing # nothing when the page loads but the token regex does not match. tok="$(mah_token)" [ -n "$tok" ] || { echo "no antiforgery token — sign in to MyAtriumHealth in Chrome, then retry" >&2; return 2; } fpx request "$MAH_BASE/$ep?noCache=0.$RANDOM" -p "$MAH_PROFILE" -X POST \ -H "__RequestVerificationToken: $tok" \ -H "X-Requested-With: XMLHttpRequest" \ ...[truncated 2790 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Replace the generic exported request functions with narrowly scoped wrappers for each reviewed read-only endpoint. 2. Enforce an exact allowlist before sending a request. The allowlist should bind each endpoint to its expected HTTP method, content type, and permitted body schema. 3. Reject endpoint values containing traversal sequences, schemes, hostnames, fragments, query delimiters, or encoded equivalents. 4. Do not permit arbitrary form bodies or query strings. Validate parameters against endpoint-specific schemas and reject unknown fields. 5. Keep mutating operations out of this Skill. If they are added later, place them behind separate functions with explicit user confirmation and clear descriptions of their effects. 6. Minimize the persistent browser profile's cookie and host scope to the narrowest values supported by the relay. 7. Document a revocation procedure for deleting the profile and invalidating the browser pairing. 8. Add automated tests proving that unlisted endpoint paths and unsupported methods are rejected before `fpx request` is invoked. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (4)

Lp3

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding
The skill describes and enables network-capable operations against a healthcare portal but does not declare any explicit tool scope or permissions boundaries. In this context, the omission is dangerous because the skill processes highly sensitive PHI and browser-mediated authenticated requests, so unclear scope increases the chance of overbroad access, unintended invocation, or misuse without adequate user awareness or policy enforcement.

Unrestricted Tool Access

Medium
Category
Excessive Agency
Content
--cookie '_Host-MyChartLocale' --cookie 'MYCPERS' --cookie 'p-MYC-LBPersistence' \
      --capture-header 'cookie@my.atriumhealth.org'

Then sign in to MyAtriumHealth in Chrome and run any command below. The first one
prints a pair code — approve it in the Transporter popup. The trust persists.

## Use it
Confidence
80% confidence
Finding
Skill grants unrestricted tool access without appropriate constraints. An agent with unfettered tool access can perform arbitrary actions including file modification, network requests, and code execution.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The file gives step-by-step instructions for extracting live patient-portal data from an authenticated browser session and caching the resulting token, but provides no privacy, retention, or safe-handling guidance. In this context, the omission is security-relevant because it normalizes shell-level handling of PHI in ways that can leak through terminal history, logs, scripts, environment inheritance, or accidental full-response output.

Description-Behavior Mismatch

Medium
Confidence
90% confidence
Finding
The documentation materially broadens the skill’s effective data access beyond the stated scope of test results, medications, allergies, immunizations, health issues, visits, and goals into additional highly sensitive domains such as insurance, care team, and messages. In a healthcare context, this is dangerous because operators may invoke or expose access paths they did not intend to authorize, increasing the chance of over-collection and disclosure of PHI and other sensitive personal data.

Static analysis

No suspicious patterns detected.