Back to skill

Security audit

Tidepool

Security checks for vulnerabilities and agentic risk

Overview

The skill is coherent for building and deploying Tidepool web apps, but it gives agents production deployment, secret, database replacement, remote file deletion, and confirmation-skipping workflows without enough guardrails.

Install only if you trust the Tidepool package source and are comfortable letting an agent deploy production web apps. Before using push options, verify the target app, avoid inline secrets when logs or shell history are captured, back up data, and avoid -y, --replace-db, and --sync unless you explicitly intend those production changes.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T08 · Insecure Dependencies

Warning
Location
SKILL.md:39
Finding
Unpinned Third-Party Package Is Installed and Immediately Executed<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md`, line 39 **Vulnerability Type**: Supply-chain risk from an unpinned dependency **Risk Level**: Medium ### Vulnerable Code ```bash pip install tidepool && tidepool quickstart ``` Related package metadata at `SKILL.md`, lines 12-15: ```yaml kind: uv package: tidepool bins: - tidepool ``` ### Technical Analysis The Skill instructs users or autonomous agents to install the latest available release of the third-party `tidepool` package without a fixed version or integrity hash. It then immediately executes the installed `tidepool` CLI. Package installation may run package-controlled build or installation logic, while `tidepool quickstart` directly executes code supplied by the installed package. Because no version constraint, lockfile, artifact hash, or publisher-verification procedure is provided, the effective code can change after this Skill has been reviewed. This does not establish that the current package is malicious. The vulnerability is the absence of controls that would protect users if the package registry account, publishing process, dependency chain, or a future release were compromised. The separately flagged command at line 31 is not remote payload execution: ```bash curl -s https://tidepool.sh/api | python3 -m json.tool ``` It parses the response as JSON rather than executing it as shell or Python code, and the command does not transmit local sensitive information. ### Attack Path 1. An attacker compromises the package publisher, registry account, release pipeline, or an indirect dependency used by a future `tidepool` release. 2. The attacker publishes a malicious package version under the expected package name. 3. A user or autonomous agent follows the Skill instructions and runs `pip install tidepool`. 4. The package manager selects the attacker-controlled release because the command does not pin a reviewed version or verify an artifact hash. 5. Malicious code executes d ...[truncated 1080 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin the CLI to a specific reviewed version, for example: ```bash python3 -m pip install "tidepool==<reviewed-version>" ``` 2. Verify package artifacts with cryptographic hashes through a locked requirements file: ```text tidepool==<reviewed-version> --hash=sha256:<verified-hash> ``` Install it with: ```bash python3 -m pip install --require-hashes -r requirements.txt ``` 3. Document the canonical package registry, verified publisher identity, source repository, and release-signing process. 4. Separate installation and execution rather than chaining them with `&&`. This allows the package version, origin, files, and signatures to be inspected before running the CLI. 5. Use an isolated virtual environment or disposable container with only the filesystem and credentials required for the task. 6. Review dependency changes before upgrading the pinned version, and use automated dependency and provenance scanning in the release process. 7. Do not expose production secrets or deployment credentials during installation or initial verification. Grant them only when a reviewed operation specifically requires them. ]]>
Vulnerability Patterns
  • 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
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (7)

External Script Fetching

High
Category
Supply Chain
Content
Before building anything, fetch the full API reference:

```bash
curl -s https://tidepool.sh/api | python3 -m json.tool
```

This returns every endpoint, every `tp.*` runtime tool, and usage examples. Read it first.
Confidence
90% confidence
Finding
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

Credential Access

High
Category
Privilege Escalation
Content
| `tp.files` | `.read(name)`, `.write(name, data)`, `.list()`, `.delete(name)` |
| `tp.email()` | `tp.email('to@x.com', 'Subject', 'body', html='<p>hi</p>')` |
| `tp.http` | `tp.http.get(url)`, `.post(url, json={})` |
| `tp.secrets` | Read-only dict from `tp_data/secrets.json` |
| `tp.state` | Public JSON state, readable at `?format=json` |
| `tp.background()` | `@tp.background(seconds=3600)` for recurring tasks |
| `tp.markdown()` | Convert markdown string to HTML |
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
| `tp.files` | `.read(name)`, `.write(name, data)`, `.list()`, `.delete(name)` |
| `tp.email()` | `tp.email('to@x.com', 'Subject', 'body', html='<p>hi</p>')` |
| `tp.http` | `tp.http.get(url)`, `.post(url, json={})` |
| `tp.secrets` | Read-only dict from `tp_data/secrets.json` |
| `tp.state` | Public JSON state, readable at `?format=json` |
| `tp.background()` | `@tp.background(seconds=3600)` for recurring tasks |
| `tp.markdown()` | Convert markdown string to HTML |
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
| `tp.files` | `.read(name)`, `.write(name, data)`, `.list()`, `.delete(name)` |
| `tp.email()` | `tp.email('to@x.com', 'Subject', 'body', html='<p>hi</p>')` |
| `tp.http` | `tp.http.get(url)`, `.post(url, json={})` |
| `tp.secrets` | Read-only dict from `tp_data/secrets.json` |
| `tp.state` | Public JSON state, readable at `?format=json` |
| `tp.background()` | `@tp.background(seconds=3600)` for recurring tasks |
| `tp.markdown()` | Convert markdown string to HTML |
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The documentation advertises `--replace-db` and `--sync` as routine workflow steps but does not clearly warn that they can overwrite or delete production data. In an autonomous-agent context, this increases the chance of accidental destructive operations because an agent may execute these commands without understanding the blast radius.

Missing User Warnings

Medium
Confidence
86% confidence
Finding
The example shows overriding a secret on the command line (`--secret STRIPE_KEY=sk_xxx`) without warning that shell history, process listings, logs, and transcripts may expose secret values. In an agent-driven CLI environment, this can lead to inadvertent credential leakage even if the platform intends secrets to be handled securely.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
tidepool push --secret STRIPE_KEY=sk_xxx   # override a secret
tidepool push --replace-db                 # replace all db keys instead of merging
tidepool push --sync            # also delete remote files not present locally
tidepool push -y                # skip confirmation prompt
```

## Runtime (`import tp`)
Confidence
88% confidence
Finding
`tidepool push -y` suppresses confirmation for an operation that may include code, database, secret, and file changes to production. In an autonomous agent workflow, removing the last human checkpoint increases the likelihood of unintended deployment or destructive state changes.

Static analysis

No suspicious patterns detected.