Back to skill

Security audit

ofw-fpx

Security checks for vulnerabilities and agentic risk

Overview

The skill is transparent about its purpose, but it gives broad direct access to sensitive OurFamilyWizard records using a browser session token and an unpinned globally installed helper.

Install only if you are comfortable giving a globally installed helper and browser pairing access to your OFW session token. Treat every provided write or delete command as live and potentially permanent, verify IDs before running commands, avoid shell tracing or command logging, and consider using a pinned or isolated fpx installation instead of a global latest install.

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)

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:48
Finding
Bearer Token Exposed Through Curl Process Arguments## Vulnerability Details **File Location**: `SKILL.md:48-59`; `references/requests.md:6-8` **Vulnerability Type**: Exposure of authentication credentials through command-line arguments **Risk Level**: Medium ### Vulnerable Code `SKILL.md:48-59`: ```sh LS=$(fpx local-storage auth tokenExpiry -p ofw) TOKEN=$(jq -r '.auth' <<<"$LS") EXPIRES=$(jq -r '.tokenExpiry' <<<"$LS") ``` ```sh curl -s 'https://ofw.ourfamilywizard.com/pub/v2/profiles' \ -H "Authorization: Bearer $TOKEN" \ -H 'ofw-client: WebApplication' \ -H 'ofw-version: 1.0.0' \ | jq . ``` `references/requests.md:6-8`: ```sh AUTH_HEADERS=(-H "Authorization: Bearer $TOKEN" -H 'ofw-client: WebApplication' -H 'ofw-version: 1.0.0') ``` ### Technical Analysis The Skill extracts the authenticated OurFamilyWizard bearer token from browser local storage and expands it directly into a `curl` command-line argument. Shell variable expansion causes the complete `Authorization` header, including the live bearer token, to become part of the `curl` process argument vector. Depending on operating-system process visibility and host configuration, command-line arguments can be observed through process inspection interfaces or local monitoring and diagnostic tools. Shell tracing, terminal logging, or wrappers around `curl` can also capture the expanded argument. The token transfer to the declared HTTPS API is necessary for the Skill's functionality. The vulnerability is not the network destination itself, but the unnecessary exposure of the credential through a process argument while performing that transfer. ### Attack Path 1. The victim captures an authenticated OFW token into the `TOKEN` shell variable. 2. The victim runs one of the documented `curl` commands. 3. The shell expands `"Authorization: Bearer $TOKEN"` before starting `curl`. 4. A local process observer, monitoring tool, malicious wrapper, or command-logging facility ...[truncated 1183 chars]
Remediation
## Remediation Suggestions - Do not place the bearer token directly in a process command-line argument. - Provide the authorization header through a protected input mechanism that does not expose the token in the process argument vector. - One option is to generate a temporary curl configuration file with permissions set to `0600`, pass the configuration file to `curl`, and securely remove it immediately afterward. - Prefer an anonymous temporary file descriptor or standard-input-based configuration where supported, reducing the time the credential exists on disk. - Disable shell tracing with `set +x` before token capture and API invocation, and warn users not to run these commands under verbose shell tracing. - Avoid printing the token, the expanded header array, or commands containing the token in logs and error messages. - Clear sensitive shell variables after use, for example with `unset TOKEN LS AUTH_HEADERS`. - Document token revocation or invalidation procedures so users can respond promptly to suspected disclosure. - Consider replacing the shell workflow with a small reviewed client that stores the token in memory and sets the HTTP authorization header without exposing it through command-line arguments.

T08 · Insecure Dependencies

Warning
Location
SKILL.md:31
Finding
Unpinned Global Installation of a Credential-Accessing Dependency## Vulnerability Details **File Location**: `SKILL.md:31-35` **Vulnerability Type**: Unpinned third-party dependency with access to browser authentication data **Risk Level**: Medium ### Vulnerable Code ```sh npm install -g @fetchproxy/cli fpx profile add ofw --domain ourfamilywizard.com fpx profile declare ofw --local-storage auth --local-storage tokenExpiry fpx pair -p ofw ``` ### Technical Analysis The setup instructions install the latest available version of `@fetchproxy/cli` globally without specifying a reviewed version or verifying package integrity. The resulting `fpx` command is then paired with a browser extension and used to retrieve `localStorage["auth"]`, which contains the OFW bearer token. An unpinned installation is not reproducible: the dependency installed by a future user may differ from the version that was reviewed during this audit. npm installation may also run package lifecycle scripts with the installing user's privileges. A compromised publisher account, malicious package update, or upstream supply-chain compromise could therefore introduce code that executes during installation or captures credentials when `fpx` is invoked. Global installation increases the impact because the command is placed in the user's general executable environment rather than being isolated to this Skill. The dependency access is functionally necessary to bridge the signed-in browser session, but using an unconstrained package version exceeds the minimum supply-chain trust required for that purpose. ### Attack Path 1. An attacker compromises the package publisher, package distribution channel, or a future package release. 2. The victim follows the documented command, which resolves and installs the latest available package rather than a previously reviewed version. 3. Malicious code executes through an installation lifecycle script or when the globally installed `fpx` command is invoked. 4. The victim pairs the tool ...[truncated 1206 chars]
Remediation
## Remediation Suggestions - Pin `@fetchproxy/cli` to a specific version that has been reviewed, rather than installing the latest release implicitly. - Verify package provenance and integrity before installation, including the expected npm publisher, registry, package signature or attestation where available, and a documented integrity hash. - Record the reviewed version and expected integrity data in the Skill documentation. - Avoid global installation. Use a project-local, locked dependency or an isolated execution environment so the tool does not become a general command in the user's environment. - Use a lockfile with integrity metadata and review changes before upgrading. - Disable npm lifecycle scripts during installation where compatible with the package, or explicitly audit all required lifecycle scripts before allowing them. - Run the dependency with the least-privileged operating-system account and restrict its access to unrelated files and environment variables. - Review the browser extension and pairing trust model because the CLI is deliberately granted access to sensitive browser local-storage values. - Establish a controlled update process in which new versions are reviewed before the pinned version is changed.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (8)

External Transmission

Medium
Category
Data Exfiltration
Content
attachments:{myFileIDs:$myFileIDs}, draft:($draft=="true"),
    includeOriginal:($includeOriginal=="true"), replyToId:$replyToId}')

RESP=$(curl -s -X POST 'https://ofw.ourfamilywizard.com/pub/v3/messages' \
  "${AUTH_HEADERS[@]}" -H 'Content-Type: application/json' --data "$BODY")

NEW_ID=$(jq -r '.id // .entityId // empty' <<<"$RESP")
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
This command performs bulk deletion of messages or drafts but does not include a prominent destructive-action warning. In a shell-oriented skill, omission of that warning increases the chance of accidental irreversible deletion of OFW communications, which may have personal or legal significance.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The example downloads attachment bytes directly to a local file via `-o` without an explicit warning that it will modify the filesystem. In a skill intended for shell use, users may copy-paste commands verbatim; silent writes can overwrite files, store sensitive OFW data insecurely, or leave confidential records on disk unintentionally.

External Transmission

Medium
Category
Data Exfiltration
Content
eventFor: "neither",
  children: [67890]
}')
curl -s -X POST 'https://ofw.ourfamilywizard.com/pub/v1/calendar/events' \
  "${AUTH_HEADERS[@]}" -H 'Content-Type: application/json' --data "$BODY" | jq .
```
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
**Update an event** (send only the fields you're changing):

```sh
curl -s -X PUT "https://ofw.ourfamilywizard.com/pub/v1/calendar/events/${EVENT_ID}" \
  "${AUTH_HEADERS[@]}" -H 'Content-Type: application/json' \
  --data '{"title":"Soccer practice (moved)","startDate":"2026-07-20T17:00:00"}' | jq .
```
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The calendar deletion example removes user data without clearly warning that it is a destructive action. Because OFW calendar entries may be important co-parenting records, a copy-pasted delete can cause unintended loss of potentially court-relevant information.

External Transmission

Medium
Category
Data Exfiltration
Content
**Create an expense** (write):

```sh
curl -s -X POST 'https://ofw.ourfamilywizard.com/pub/v2/expense/expenses' \
  "${AUTH_HEADERS[@]}" -H 'Content-Type: application/json' \
  --data '{"amount": 45.00, "description": "Cleats for soccer"}' | jq .
```
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
**Create an entry** (write — journal entries are a permanent court record):

```sh
curl -s -X POST 'https://ofw.ourfamilywizard.com/pub/v1/journals' \
  "${AUTH_HEADERS[@]}" -H 'Content-Type: application/json' \
  --data '{"title": "Missed pickup", "body": "Co-parent arrived 45 min late without notice."}' | jq .
```
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Static analysis

No suspicious patterns detected.