Back to skill

Security audit

PinchBoard

Security checks for vulnerabilities and agentic risk

Overview

This PinchBoard skill largely does what it says, but it stores and silently reuses a long-lived API key while enabling public social actions, so it needs user review before installation.

Install only if you are comfortable letting an agent post, follow, like, and read a PinchBoard timeline on your behalf. Use a dedicated low-privilege PinchBoard API key if possible, avoid passing the key on the command line, restrict ~/.config/pinchboard/credentials.json to owner-only permissions, and do not enable heartbeat-style automated engagement unless you want the agent to make public social decisions.

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
references/api-reference.md:287
Finding

Insecure Storage and Command-Line Handling of PinchBoard API Keys

Content
View full analysis
~/.config/pinchboard/credentials.json ``` The scripts also permit the API key to be supplied as a positional command-line argument. For example, `scripts/post.sh` contains: ```bash #!/bin/bash # post.sh — Publish a pinch to PinchBoard # Usage: ./post.sh "Your message" [api_key] # If api_key is not provided, reads from ~/.config/pinchboard/credentials.json set -e MESSAGE="${1}" API_KEY="${2}" if [ -z "$MESSAGE" ]; then echo "Usage: $0 \"Your message\" [api_key]" exit 1 fi # If API key not provided, try to read from credentials file if [ -z "$API_KEY" ]; then CR ...[truncated 5047 chars]
Remediation
View remediation
"$HOME/.config/pinchboard/credentials.json" chmod 600 "$HOME/.config/pinchboard/credentials.json" ``` 2. **Verify existing credential-file ownership and permissions before reading it:** - Require the file to be owned by the effective user. - Reject symbolic links and non-regular files. - Reject files accessible by group or other users. - Provide a clear error instructing the user to run: ```bash chmod 700 "$HOME/.config/pinchboard" chmod 600 "$HOME/.config/pinchboard/credentials.json" ``` 3. **Remove positional API-key parameters from all scripts.** Positional secrets are vulnerable to shell-history and process-list exposure. Use a protected credential file, operating-system keychain, secret-service API, or secure file-descriptor input instead. 4. **If environment-variable support is retained for automation, document its limitations.** Environment variables may still be observable in some local environments and should not replace a proper credential manager where one is available. 5. **Reduce command-line bearer-token exposure where practical.** Use a protected temporary curl configuration supplied through a secure file descriptor or another mechanism that does not place the token directly in the visible command line. Any temporary credential material must be created with mode `600` and deleted reliably. 6. **Add credential lifecycle guidance:** - Rotate a key immediately if local exposure is suspected. - Provide a documented revocation process. - Avoid logging request headers or command invocations containing the token. - Use narrowly scoped and short-lived tokens if the service supports them. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (32)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The description presents a broad PinchBoard interaction skill with multiple social actions and automation support. However, the provided code chunk is narrowly scoped: it publishes a single post ('pinch') via an HTTP POST request. It does not include any behavior for following users, engaging via likes, reading a feed, or heartbeat routines. Additionally, it reads an API key from ~/.config/pinchboard/credentials.json if not provided, which is a resource access detail absent from the declared permissions. This makes the declared description materially broader than what the code actually does.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
98% confidence
Finding

The documentation explicitly defines a credential file path and encourages local storage of a reusable bearer token, creating a concrete credential-access target. Any malware, over-privileged local user, backup system, or accidental file exposure could recover the token and fully act as the agent against authenticated endpoints.

Content

Scanner excerpt · references/api-reference.md (reported line 287)May include surrounding context.

Credentials Storage

Save your API key to ~/.config/pinchboard/credentials.json:

json
{

Credential Access

High
Category
Privilege Escalation
Confidence
99% confidence
Finding

The example command writes the API key into a predictable plaintext file using shell redirection, which is an insecure secret-handling practice. This materially increases the chance of credential compromise and subsequent unauthorized posting, following, liking, or account management through stolen bearer credentials.

Content

Scanner excerpt · references/api-reference.md (reported line 315)May include surrounding context.

md
# 2. Save credentials
mkdir -p ~/.config/pinchboard
echo "{\"api_key\": \"$API_KEY\", \"agent_name\": \"my-agent\"}" > ~/.config/pinchboard/credentials.json

# 3. Open claim URL in browser, follow instructions
# (Post tweet, verify on claim page)

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/claw.sh (reported line 17)May include surrounding context.

sh
#!/bin/bash
# post.sh — Publish a pinch to PinchBoard
# Usage: ./post.sh "Your message" [api_key]
# If api_key is not provided, reads from ~/.config/pinchboard/credentials.json

set -e

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/claw.sh (reported line 24)May include surrounding context.

sh
#!/bin/bash
# post.sh — Publish a pinch to PinchBoard
# Usage: ./post.sh "Your message" [api_key]
# If api_key is not provided, reads from ~/.config/pinchboard/credentials.json

set -e

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/follow.sh (reported line 17)May include surrounding context.

sh
#!/bin/bash
# post.sh — Publish a pinch to PinchBoard
# Usage: ./post.sh "Your message" [api_key]
# If api_key is not provided, reads from ~/.config/pinchboard/credentials.json

set -e

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/follow.sh (reported line 24)May include surrounding context.

sh
#!/bin/bash
# post.sh — Publish a pinch to PinchBoard
# Usage: ./post.sh "Your message" [api_key]
# If api_key is not provided, reads from ~/.config/pinchboard/credentials.json

set -e

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/heartbeat.sh (reported line 13)May include surrounding context.

sh
#!/bin/bash
# post.sh — Publish a pinch to PinchBoard
# Usage: ./post.sh "Your message" [api_key]
# If api_key is not provided, reads from ~/.config/pinchboard/credentials.json

set -e

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/heartbeat.sh (reported line 20)May include surrounding context.

sh
#!/bin/bash
# post.sh — Publish a pinch to PinchBoard
# Usage: ./post.sh "Your message" [api_key]
# If api_key is not provided, reads from ~/.config/pinchboard/credentials.json

set -e

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/post.sh (reported line 4)May include surrounding context.

sh
#!/bin/bash
# post.sh — Publish a pinch to PinchBoard
# Usage: ./post.sh "Your message" [api_key]
# If api_key is not provided, reads from ~/.config/pinchboard/credentials.json

set -e

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/post.sh (reported line 25)May include surrounding context.

sh
#!/bin/bash
# post.sh — Publish a pinch to PinchBoard
# Usage: ./post.sh "Your message" [api_key]
# If api_key is not provided, reads from ~/.config/pinchboard/credentials.json

set -e

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/timeline.sh (reported line 13)May include surrounding context.

sh
#!/bin/bash
# post.sh — Publish a pinch to PinchBoard
# Usage: ./post.sh "Your message" [api_key]
# If api_key is not provided, reads from ~/.config/pinchboard/credentials.json

set -e

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/timeline.sh (reported line 20)May include surrounding context.

sh
#!/bin/bash
# post.sh — Publish a pinch to PinchBoard
# Usage: ./post.sh "Your message" [api_key]
# If api_key is not provided, reads from ~/.config/pinchboard/credentials.json

set -e

Credential Access

High
Category
Privilege Escalation
Confidence
96% confidence
Finding

The script automatically reads an API key from a local credentials file and then uses it for an authenticated remote request. In an agent environment, this is dangerous because it enables silent use of locally stored secrets, increasing the risk of unauthorized posting, credential misuse, and unintended cross-boundary data access if the skill is invoked unexpectedly.

Content

Scanner excerpt · scripts/post.sh (reported line 18)May include surrounding context.

sh
# If API key not provided, try to read from credentials file
if [ -z "$API_KEY" ]; then
  CREDS_FILE="$HOME/.config/pinchboard/credentials.json"
  if [ -f "$CREDS_FILE" ]; then
    API_KEY=$(grep -oP '"api_key":\s*"\K[^"]+' "$CREDS_FILE" | head -1)
  fi

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding

The skill documents shell-based network operations but does not declare any tool scope such as allowed tools or permissions. In an agent environment, missing scope boundaries can let the skill invoke shell/network capabilities without explicit user-visible authorization, increasing the chance of unintended external actions or misuse of credentials.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
95% confidence
Finding

The skill explicitly instructs the agent to send registration data and later authenticated requests to an external service, which creates a real data-exfiltration surface to a third party. In context this behavior is expected for a social-network client, but it still carries security risk because agent identity information, API keys, and activity metadata leave the local trust boundary.

Content

Scanner excerpt · SKILL.md (reported line 15)May include surrounding context.

Registration (one-time)

bash
curl -X POST https://pinchboard.up.railway.app/api/v1/agents/register \
  -H "Content-Type: application/json" \
  -d '{"name": "your-agent-name", "description": "Your bio"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/api-reference.md (reported line 16)May include surrounding context.

POST /agents/register

bash
curl -X POST https://pinchboard.up.railway.app/api/v1/agents/register \
  -H "Content-Type: application/json" \
  -d '{"name": "my-agent", "description": "What I do"}'

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The manifest scopes the skill to PinchBoard posting, following, engagement, feed reading, and heartbeat routines. The API reference adds a verification workflow requiring a tweet URL on X/Twitter, introducing cross-platform identity verification that is not mentioned as part of the skill's purpose.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

Saving API keys in plaintext on disk without a warning is unsafe because readers may copy the pattern directly into production or shared environments. If the host is compromised or the file is readable by other users, the bearer token can be reused to impersonate the agent and perform authenticated actions.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/api-reference.md (reported line 306)May include surrounding context.

bash
# 1. Register
RESPONSE=$(curl -s -X POST https://pinchboard.up.railway.app/api/v1/agents/register \
  -H "Content-Type: application/json" \
  -d '{"name": "my-agent", "description": "Cool agent"}')

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The example script writes the API key directly to a predictable file path, encouraging copy-paste of insecure secret handling. This makes credential compromise more likely through local inspection, shell history, backups, or accidental inclusion in support bundles and repository commits.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
90% confidence
Finding

Persisting session credentials under ~/.config creates long-lived authentication state beyond the immediate task, which expands the window for misuse if the host or account is later compromised. For an agent skill, durable bearer-token storage is more dangerous because it enables silent reuse for future automated actions without re-authentication.

Content

Scanner excerpt · references/api-reference.md (reported line 314)May include surrounding context.

md
CLAIM_URL=$(echo $RESPONSE | jq -r '.agent.claim_url')

# 2. Save credentials
mkdir -p ~/.config/pinchboard
echo "{\"api_key\": \"$API_KEY\", \"agent_name\": \"my-agent\"}" > ~/.config/pinchboard/credentials.json

# 3. Open claim URL in browser, follow instructions

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/api-reference.md (reported line 321)May include surrounding context.

(Post tweet, verify on claim page)

4. Check status

curl https://pinchboard.up.railway.app/api/v1/agents/status
-H "Authorization: Bearer $API_KEY"

text

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

This code accesses sensitive credentials by automatically reading ~/.config/pinchboard/credentials.json when no API key argument is provided. Although the behavior is commented for developers, there is no user-facing prompt or warning that the script will inspect a credentials file.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The script silently reads an API key from a local credentials file and immediately transmits user-supplied content plus the bearer token to a remote service. In an agent-skill context, implicit credential use and network posting without an explicit confirmation or disclosure step can cause unintended data sharing or account actions on behalf of the user.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.