Back to skill

Security audit

FadNote

Security checks for vulnerabilities and agentic risk

Overview

This skill does what it claims, but it can automatically send highly sensitive secrets to a remote note service and documents unsafe command-line secret handling.

Install only if you are comfortable sending locally encrypted notes to the configured FADNOTE_URL service. Prefer piping content through stdin from a protected source, avoid putting passwords/API keys/private keys directly in command-line arguments, and require explicit confirmation before the agent creates notes for sensitive credentials.

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

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/fadnote.js:31
Finding
Sensitive note content exposed through command-line arguments and shell history<![CDATA[ ## Vulnerability Details **File Location**: `scripts/fadnote.js:31-55`; insecure usage is documented in `SKILL.md:54` and `SKILL.md:75-76` **Vulnerability Type**: Sensitive information exposure through process arguments **Risk Level**: Medium ### Vulnerable Code ```js function parseArgs() { const args = process.argv.slice(2); const options = { ttl: 86400, json: false, content: '', help: false }; const contentArgs = []; for (let i = 0; i < args.length; i++) { if (args[i] === '-h' || args[i] === '--help') { options.help = true; } else if (args[i] === '--ttl' && i + 1 < args.length) { const ttl = parseInt(args[i + 1], 10); if (isNaN(ttl) || ttl <= 0) { throw new Error('Invalid TTL: must be a positive number'); } options.ttl = ttl; i++; } else if (args[i] === '--json') { options.json = true; } else { contentArgs.push(args[i]); } } options.content = contentArgs.join(' '); return options; } ``` The affected interface is explicitly promoted with sensitive-data examples: ```bash fadnote "My secret message" fadnote --ttl 3600 "Expires in 1 hour" ``` The documentation also encourages using the Skill for API keys, passwords, credentials, and private SSH keys. ### Technical Analysis The program accepts note plaintext directly from `process.argv`. Command-line arguments are not an appropriate transport for secrets because they can be exposed outside the application's encryption boundary before client-side encryption occurs. Depending on the operating system and host configuration, the argument vector may be observable through process inspection facilities, process-monitoring software, audit systems, telemetry agents, crash diagnostics, or automation logs. Commands entered interactively can also remain in persistent shell history. The subsequent AES-256-GCM encryption does not protect these earlier plaintext copies. This behavior is not required for the declared fun ...[truncated 1560 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove positional plaintext input for secrets, or disable it by default and require an explicit unsafe compatibility flag. 2. Make stdin the primary non-interactive input mechanism: ```bash printf '%s' "$SECRET" | fadnote ``` This prevents the secret from appearing in the FadNote process argument vector, although callers must still avoid embedding literal secrets in the shell command itself. 3. Add a hidden interactive input mode using a terminal interface that disables input echo. Do not implement secret prompting with ordinary `readline` input unless terminal echo is securely suppressed. 4. Update `SKILL.md` to remove examples that place secrets directly in command-line arguments. Clearly warn that command-line literals can be retained in shell history, process listings, telemetry, and automation logs. 5. For automation, recommend passing content through stdin from a protected secret source without expanding the secret into a logged command line. 6. Add tests verifying that secret content is accepted through stdin and is not present in `process.argv`. 7. Consider rejecting positional content with a clear message directing users to stdin or secure interactive entry. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (3)

Lp3

Medium
Category
MCP Least Privilege
Confidence
96% confidence
Finding
The skill requires environment access and network communication but does not declare any explicit tool scope such as permissions or allowed-tools. In an agent ecosystem, that omission weakens reviewability and consent boundaries, making it easier for a skill that transmits sensitive user data to run with broader capabilities than users or the host expect.

Missing User Warnings

Medium
Confidence
83% confidence
Finding
The description emphasizes security properties but does not clearly warn users that their note content is still transmitted as ciphertext to a remote server endpoint. Even with client-side encryption, omission of that fact can mislead users about data flow, privacy expectations, jurisdiction, metadata exposure, and reliance on a third-party service.

Vague Triggers

Medium
Confidence
91% confidence
Finding
The trigger phrases are broad enough to match ordinary user requests like 'share this securely' or 'secure this API key', which can cause the agent to automatically send highly sensitive content to an external service. Because this skill is specifically designed to handle secrets, overbroad activation materially increases the chance of unintended exfiltration of credentials, keys, or private data.

Static analysis

No suspicious patterns detected.