Back to skill

Security audit

RUNSTR Fitness

Security checks for vulnerabilities and agentic risk

Overview

This skill is meant to read RUNSTR fitness backups, but it asks for a full Nostr private key and directs agents to persist sensitive health summaries without clear opt-in controls.

Review this carefully before installing. Do not paste a main Nostr nsec into the agent; use a dedicated fitness-only identity or a local signer/key manager if possible. Treat any saved health summary as sensitive and only allow memory persistence after explicit consent, with a plan to review and delete it. Prefer a pinned, verified nak version rather than installing a mutable latest release.

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 (3)

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:37
Finding

Nostr Private Key Exposed Through Chat and Process Arguments

Content
View full analysis
Keys** (or your Nostr key manager). **Tell your bot:** "Here's my RUNSTR nsec: nsec1..." Your bot uses the nsec to decrypt your encrypted fitness backup from Nostr. The nsec is never stored, logged, or transmitted — it's used only for the decryption step in your current session. ``` ```bash content=$(nak req -k 30078 -a $hex_pk -t d=runstr-workout-backup -l 1 \ wss://relay.damus.io wss://nos.lol | jq -r '.content') # Decrypt (NIP-44 self-decryption: user to own pubkey) decrypted=$(echo "$content" | nak encrypt --sec $hex_sk $hex_pk --decrypt) ``` ```javascript // /tmp/decrypt-runstr.mjs — run with: node /tmp/decrypt-runstr.mjs '' import { gunzipSync } from 'zlib'; import NDK, { NDKPrivateKeySigner } from '@nostr-dev-kit/ndk'; const signer = new NDKPrivateKeySigner(process.argv[2]); const user = await signer.user(); const decrypted = await signer.decrypt(user, process.argv[3]); try { console.log(gunzipSync(Buffer.from(decrypted, 'base64')).toString()); } catch { console.log(decrypted); } ``` ### Technical Analysis The skill directs the user to disclose a complete Nostr private key directly to the agent. This places the credential in the conversation context, where it may be retained in session history, telemetry, diagnostics, or platform logs. The decoded key is subsequently expanded into a shell command and, in the Node.js fallback, supplied explicitly through `process.argv`. Command-line arguments can be visible to local process-inspection tools and may be captured by shell history, process accounting, monitoring software, crash reports, or diagnostic ...[truncated 1597 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:225
Finding

Sensitive Health and Behavioral Data Persisted Without Explicit Consent or Retention Controls

Content
View full analysis
## Recent Activity (Last 30 Days) - Total workouts: X - Running: X workouts, Y km, avg pace Z/km - Walking: X workouts, Y km - Cycling: X workouts, Y km ## Frequency - X workouts/week avg - Most active: [weekday] ## Habits - [Habit]: X day streak ## Mood & Energy - Avg mood: [level], Avg energy: X/5 ## Steps - Avg: X,XXX/day ## Insights - [Patterns and observations] ``` ``` ### Technical Analysis The skill explicitly instructs the agent to save a structured health summary in long-term memory. The retained information can include identity attributes, exercise history, behavioral habits, mood, energy, steps, and inferred patterns. Although retaining a user-requested summary can be a legitimate feature, these instructions do not require explicit opt-in consent, define a retention period, limit access, specify deletion procedures, or minimize the stored fields. The data was originally protected by an encrypted Nostr backup, but the proposed memory record is a decrypted derivative whose protection depends entirely on the agent platform’s memory controls. This issue is classified as insecure storage rather than agent memory poisoning because the stored content is health data, not attacker-controlled instructions intended to alter future agent behavior. ### Attack Path 1. The agent obtains and decrypts the RUNSTR backup. 2. It extracts sensitive workout, habit, journal, mood, energy, and step information. 3. Following the skill instructions, it write ...[truncated 1062 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
SKILL.md:58
Finding

Unpinned Third-Party Tool Installed From a Mutable Latest Version

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (6)

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill instructs the user to provide their Nostr private key directly to the bot, which is a highly sensitive credential capable of broader account actions beyond merely decrypting fitness backups. Presenting this as a normal setup step without a strong warning about account compromise, impersonation, and irreversible exposure conditions users to hand secrets to an AI agent and creates a direct path to credential misuse or leakage.

Content

No source excerpt is available for this finding.

Ssd 3

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

Telling users to give a private key directly to the bot exposes the most sensitive Nostr credential to an untrusted processing environment. If logged, cached, leaked through telemetry, or mishandled by downstream tooling, the key could enable account takeover, impersonation, decryption of protected data, and abuse beyond the stated fitness use case.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill directs the agent to retain a persistent health summary across conversations without a clear user warning or opt-in, despite the data including workouts, habits, mood, journal content, and steps. Because this is sensitive health-adjacent personal data, silent persistence materially raises privacy risk, secondary-use risk, and harm from accidental disclosure or model memory access in future interactions.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill tells users their nsec is only used transiently for decryption, but later instructs the agent to retain a derived health summary for future conversations. Even if the private key itself is not stored, persisting outputs derived from decrypted health data undermines the stated privacy boundary and creates an unauthorized long-term retention path for sensitive personal information.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The instruction to store a reusable long-term memory profile includes sensitive health, mood, habit, and activity data that exceeds what is necessary to answer a single user request. Persistent profiling of health-related data increases exposure in later sessions, expands breach impact, and may violate user expectations and privacy requirements for sensitive data handling.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

Persisting a structured summary of health and mood data creates a durable repository of sensitive personal information that can be accessed outside the original task context. This broadens the attack surface and magnifies the consequences of memory leakage, unauthorized retrieval, or reuse in unrelated conversations.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.