Back to skill

Security audit

SEO Signal Research

Security checks for vulnerabilities and agentic risk

Overview

This skill is a disclosed workflow for using SignalDig's SEO MCP tools and does not contain hidden execution, exfiltration, or destructive behavior.

Install only if you intend to use SignalDig's external SEO data service. Use a dedicated, revocable API key, prefer environment-variable or client secret support over hardcoding tokens, keep any local MCP config out of version control, and remember that submitted keywords/domains are sent to SignalDig for analysis.

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/setup-guide.md:42
Finding
Setup Guide Encourages Plaintext API-Key Storage## Vulnerability Details **File Location**: `references/setup-guide.md`, lines 42–54 and 78–84 **Vulnerability Type**: Plaintext sensitive-data storage in project configuration and shell profiles **Risk Level**: Medium ### Vulnerable Code ```markdown Add to `.mcp.json` in your project: ```json { "mcpServers": { "signaldig-seo": { "type": "http", "url": "https://mcp.signaldig.com/data/seo/mcp", "headers": { "Authorization": "Bearer {SIGNALDIG_API_KEY}" } } } } ``` ``` ```markdown Set your API key as a user environment variable — never in `config.toml`, a project file, the repository, or chat: ```bash # macOS / Linux — add to ~/.zshrc or ~/.bashrc export SIGNALDIG_API_KEY="your_api_key" ``` ``` ### Technical Analysis The setup guide instructs users to place a SignalDig bearer token directly in a project-level `.mcp.json` file for one supported client. Project configuration files are commonly copied, shared, archived, or committed to source control. Substituting the placeholder with a real token would therefore create a plaintext secret in the project directory. The guide also recommends storing the token directly in `~/.zshrc` or `~/.bashrc`. Although this avoids embedding the token in the application configuration, shell initialization files still store it in plaintext and may be exposed through backups, support bundles, dotfile repositories, overly broad file permissions, or other processes running under the same account. The project does not contain a live credential, so this is an insecure configuration practice rather than evidence of an already compromised key. Nevertheless, the guidance can cause users to create an exploitable secret-storage condition. ### Attack Path 1. A user follows the setup guide and replaces `{SIGNALDIG_API_KEY}` or `your_api_key` with a valid bearer token. 2. The token is stored in project-level `.mcp.json` o ...[truncated 1111 chars]
Remediation
## Remediation Suggestions 1. Remove examples that place a literal bearer token in project-level `.mcp.json`. 2. Prefer client-supported environment-variable references, operating-system credential stores, or dedicated secret managers. 3. Where a client requires a header value, document a secure interpolation mechanism rather than instructing users to paste the token directly. 4. If shell-based loading is unavoidable, store the secret in a separate permission-restricted file outside the project and source it from the shell profile. Require owner-only permissions, such as `chmod 600`. 5. Explicitly require `.mcp.json`, `.env`, and other local secret-bearing files to be excluded from version control. 6. Recommend short-lived or narrowly scoped credentials where supported. 7. Add guidance for immediate key revocation and rotation after suspected disclosure. 8. Add automated secret scanning to detect accidentally committed SignalDig bearer tokens.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (5)

Agent Config Directory Access

High
Category
Agent Snooping
Content
### Codex

Codex does not read `mcpServers` JSON. Add the server to your **user-level**
`~/.codex/config.toml` (not the project `.codex/config.toml` — account-level
config):

```toml
Confidence
90% confidence
Finding
Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.

Natural-Language Policy Violations

Medium
Confidence
94% confidence
Finding
The skill explicitly requires certain user-facing outage/error messages to be delivered in English only, even though the rest of the skill supports multilingual responses. This can mislead or disadvantage non-English users during failure conditions, causing misunderstanding of setup or outage state and potentially prompting unsafe follow-up actions due to unclear instructions.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
Use for GEO/AI-search visibility analysis. Inputs are `keyword`, `domain`, `market`, `language`, and optional `idempotency_key`. The service internally collects search-volume context, Google AI-mode observations, LLM target metrics, and top-mentioned pages. Do not pass provider endpoint details.

The terminal result exposes the public `geo_analysis` section and shared `analysis_coverage`, `evidence`, `signals`, `limitations`, `usage`, and `field_semantics`. An empty LLM mentions subsection is valid coverage; do not convert it into a claim that the target has no visibility without checking returned counts and limitations.

## Tool: `submit_ranked_keywords`
Confidence
75% confidence
Finding
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Session Persistence

Medium
Category
Rogue Agent
Content
project file, the repository, or chat:

```bash
# macOS / Linux — add to ~/.zshrc or ~/.bashrc
export SIGNALDIG_API_KEY="your_api_key"
```
Confidence
90% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
setx SIGNALDIG_API_KEY "your_api_key"
```

Codex automatically sends `Authorization: Bearer $SIGNALDIG_API_KEY`. Fully
quit and reopen Codex Desktop (or run `/reload-plugins` from Claude Code),
start a new task, and confirm the tools from section 3 are listed.
Confidence
80% confidence
Finding
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Static analysis

No suspicious patterns detected.