Back to skill

Security audit

compass-fpx

Security checks for vulnerabilities and agentic risk

Overview

This skill is a disclosed Compass data-fetching helper, but users should treat its browser-bridge setup and unpinned global CLI install with care.

Install only if you are comfortable pairing fetchproxy with a Compass browser tab. Prefer pinning a reviewed @fetchproxy/cli version or installing locally, keep the fpx profile limited to compass.com, and replace the documented fixed /tmp paths with a private temporary directory for address queries or fetched pages.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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:32
Finding
Unpinned Global Installation of a Privileged Third-Party CLI<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:32` **Vulnerability Type**: Supply-chain exposure through an unpinned dependency **Risk Level**: Medium ### Vulnerable Code ```sh npm install -g @fetchproxy/cli # provides `fpx` ``` ### Technical Analysis The setup instructions globally install the latest version of `@fetchproxy/cli` without a version constraint, lockfile, or integrity verification. Consequently, the code installed and executed can change after this Skill has been reviewed. This dependency occupies a security-sensitive position because the Skill subsequently instructs the user to pair the CLI with a browser extension and route requests through a browser tab carrying a valid Compass session. Although no evidence indicates that the named package is currently malicious, an unpinned package release, registry compromise, or maintainer-account compromise could introduce arbitrary installation-time or runtime behavior. Global installation also makes the package available outside this Skill's directory and may increase the duration and scope of exposure compared with a project-local, version-locked installation. ### Attack Path 1. An attacker compromises the npm package, its maintainer account, or its publication pipeline. 2. The attacker publishes a malicious release under the legitimate package name. 3. A user follows the Skill instructions and runs `npm install -g @fetchproxy/cli`. 4. npm retrieves the latest compromised release; package lifecycle scripts may execute immediately with the user's operating-system privileges. 5. The installed CLI can subsequently access inputs, outputs, and browser-bridge capabilities made available during pairing and Skill execution. 6. The malicious package may read user-accessible files, intercept Compass requests or responses, or send accessible information to an attacker-controlled destination. ### Impact Assessment Successful exploitation would permit code execution with the p ...[truncated 471 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin the CLI to a specifically reviewed version, for example: ```sh npm install --global @fetchproxy/cli@REVIEWED_VERSION ``` 2. Publish the expected package version and npm integrity hash in the Skill documentation. 3. Prefer a project-local installation governed by a committed lockfile rather than a global installation. 4. Use `npm ci` with a reviewed `package-lock.json` where practical. 5. Verify that the package is obtained from the official npm registry and document its authoritative publisher and repository. 6. Review package lifecycle scripts before installation. Consider installation with scripts disabled if the package does not require them: ```sh npm install --ignore-scripts ``` 7. Periodically review and deliberately update the pinned version instead of automatically consuming the latest release. ]]>

T09 · Insecure Skill Coding Practices

Note
Location
references/requests.md:133
Finding
Predictable Shared Temporary Files Permit Local Disclosure and Symlink Clobbering<![CDATA[ ## Vulnerability Details **File Location**: `references/requests.md:133-137` **Additional Locations**: `SKILL.md:50`; `references/requests.md:9,35-36,77-81,160-161` **Vulnerability Type**: Unsafe temporary-file handling **Risk Level**: Low ### Vulnerable Code ```sh cat > /tmp/omni.json <<'JSON' {"q": "158 Raven Blvd Lake Lure NC", "sources": [0]} JSON fpx post-json 'https://www.compass.com/api/v3/omnisuggest/autocomplete' @/tmp/omni.json -p compass \ | jq '.categories[] | select(.name==1) | .items[] | {id, text, subText, redirectUrl}' ``` The same fixed-path pattern is repeatedly used for fetched pages and extracted data, including: ```sh fpx get 'https://www.compass.com/homes-for-sale/brooklyn-ny/2-3-bed/500000-1500000-price/type-condo/' -p compass > /tmp/search.html node extract-global.mjs /tmp/search.html uc > /tmp/search.json ``` ```sh fpx get 'https://www.compass.com/homedetails/162-04-12th-Rd-Queens-NY-11357/2109718971930079225_lid/' -p compass > /tmp/detail.html node extract-global.mjs /tmp/detail.html __INITIAL_DATA__ > /tmp/detail.json ``` ### Technical Analysis The documented commands create files with predictable names directly in the shared `/tmp` namespace. Shell redirection opens these paths without checking whether they already exist or are symbolic links. On a multi-user system, another local user may predict these paths and create symbolic links before the commands run. The shell will follow such a link when processing `>` and overwrite the linked target if the victim has permission to write it. The files may also contain street addresses, listing details, agent records, search criteria, and full Compass HTML or JSON responses. Depending on the user's umask and operating-system temporary-directory protections, this information may become readable by other local users. The issue affects only documented shell workflows; `references/extract-global.mjs` itself merely reads the caller-selected file or standard input and does ...[truncated 1407 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Create a private temporary directory using `mktemp -d` rather than fixed paths: ```sh umask 077 tmpdir="$(mktemp -d)" || exit 1 trap 'rm -rf -- "$tmpdir"' EXIT HUP INT TERM cat > "$tmpdir/omni.json" <<'JSON' {"q": "158 Raven Blvd Lake Lure NC", "sources": [0]} JSON fpx post-json \ 'https://www.compass.com/api/v3/omnisuggest/autocomplete' \ "@$tmpdir/omni.json" -p compass ``` 2. Apply the same private-directory pattern to HTML and extracted JSON files. 3. Set `umask 077` before creating files that may contain addresses, queries, or fetched response data. 4. Prefer pipelines that avoid persistent files where feasible: ```sh fpx get 'https://www.compass.com/homes-for-sale/manhattan-ny/' -p compass \ | node references/extract-global.mjs - uc \ | jq '...' ``` 5. Register cleanup with `trap` so temporary data is removed on normal exit and interruption. 6. Advise users not to run these commands with elevated privileges. ]]>
Vulnerability Patterns
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (1)

Lp3

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding
The skill clearly instructs the user to perform live network access to compass.com via the `fpx` CLI and browser extension, but it does not declare any explicit tool scope such as `permissions` or `allowed-tools`. That mismatch weakens least-privilege controls and makes it easier for an agent runtime to invoke broader networked behavior than a reviewer or policy layer expects.

Static analysis

No suspicious patterns detected.