Back to skill

Security audit

Felo Search

Security checks for vulnerabilities and agentic risk

Overview

This is a real-time web search skill, but it is too broadly triggered and uses unsafe shell instructions that could expose prompts or execute unintended commands.

Install only if you are comfortable sending search queries to Felo. Avoid using it for secrets, private project details, account data, or sensitive business content. The skill should be narrowed to explicit search requests and rewritten to serialize JSON safely with a unique temporary file or no temporary file at all before broad use.

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

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:89
Finding

Command Injection Through Unsafe Heredoc Query Substitution

Content
View full analysis
/tmp/felo_query.json << 'EOF' {"query": "USER_QUERY_HERE"} EOF # Call Felo API curl -s -X POST https://openapi.felo.ai/v2/chat \ -H "Authorization: Bearer $FELO_API_KEY" \ -H "Content-Type: application/json" \ -d @/tmp/felo_query.json # Clean up rm -f /tmp/felo_query.json ``` The accompanying instruction states: ```text Replace `USER_QUERY_HERE` with the actual user query ``` ### Technical Analysis The skill directs the agent to place an untrusted user query directly into an executable Bash heredoc. Quoting the delimiter as `'EOF'` disables shell expansion within the heredoc body, but it does not prevent delimiter injection. If the query contains a newline followed by `EOF` at the beginning of a line, that line prematurely terminates the heredoc. Any subsequent query content is then interpreted by Bash as shell commands. This converts an ordinary search query into executable shell syntax. Direct substitution also fails to serialize quotation marks, backslashes, control characters, and newlines as JSON. Even when command injection is not attempted, these characters can produce malformed request bodies. ### Attack Path 1. An attacker supplies a search query containing an embedded heredoc terminator and shell commands, conceptually: ```text harmless query EOF attacker_command # ``` 2. The agent follows the skill instruction and replaces `USER_QUERY_HERE` with the query verbatim. 3. Bash encounters the injected standalone `EOF` line and terminates the heredoc early. 4. The subsequent attacker-controlled text is parsed as shell commands. 5. Those commands execute under the operating-system identity and permissions of the agent process. ### Impact Assessment ...[truncated 653 chars]
Remediation
View remediation
"$tmpfile" curl --fail-with-body --silent --show-error \ -X POST 'https://openapi.felo.ai/v2/chat' \ -H "Authorization: Bearer $FELO_API_KEY" \ -H 'Content-Type: application/json' \ --data-binary "@$tmpfile" ``` Additional hardening measures: 1. Preserve the query as data rather than generating a Bash script from it. 2. Use a JSON-aware serializer such as `jq`, Python's `json` module, or an equivalent library. 3. Never instruct the agent to perform literal placeholder replacement inside executable shell syntax. 4. Validate API responses before displaying fields. 5. Add `--fail-with-body`, `--show-error`, and a reasonable timeout to ensure HTTP failures are detected safely. 6. Avoid logging command lines or request headers that could expose the bearer token. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:89
Finding

Predictable Shared Temporary File Enables File Clobbering and Request Tampering

Content
View full analysis
/tmp/felo_query.json << 'EOF' {"query": "USER_QUERY_HERE"} EOF # Call Felo API curl -s -X POST https://openapi.felo.ai/v2/chat \ -H "Authorization: Bearer $FELO_API_KEY" \ -H "Content-Type: application/json" \ -d @/tmp/felo_query.json # Clean up rm -f /tmp/felo_query.json ``` The same fixed path is used repeatedly in the documented examples: ```bash cat > /tmp/felo_query.json << 'EOF' {"query": "What's the weather in Tokyo today?"} EOF curl -s -X POST https://openapi.felo.ai/v2/chat \ -H "Authorization: Bearer $FELO_API_KEY" \ -H "Content-Type: application/json" \ -d @/tmp/felo_query.json rm -f /tmp/felo_query.json ``` ### Technical Analysis The skill always writes request data to the predictable path `/tmp/felo_query.json`. Shared temporary directories can be accessed by other local users and processes. Using shell redirection on a predictable path introduces several risks: - The path may already be a symbolic link, allowing a write to be redirected to another file. - Another process can replace or modify the file between creation and the `curl` operation. - Concurrent skill invocations can overwrite or delete one another's request files. - Default file permissions are controlled by the process umask and may permit unintended local disclosure. - Unconditional cleanup can remove a path whose ownership or identity changed during execution. Some operating systems enable protections against following untrusted symlinks in sticky directories, but such controls are platform-dependent and do not eliminate request races or concurrent-run collisions. ### Attack Path A local attacker or competing process can exploit the predictable path as follows: 1. Monitor or anticipate e ...[truncated 1291 chars]
Remediation
View remediation
"$tmpfile" curl --fail-with-body --silent --show-error \ -X POST 'https://openapi.felo.ai/v2/chat' \ -H "Authorization: Bearer $FELO_API_KEY" \ -H 'Content-Type: application/json' \ --data-binary "@$tmpfile" ``` The following controls should also be applied: 1. Replace every documented use of `/tmp/felo_query.json`, including all examples. 2. Use `mktemp` rather than deriving a filename from process IDs, timestamps, or user input. 3. Set file permissions to owner-only access. 4. Quote the temporary-file variable in every command. 5. Register an exit trap immediately after creation so cleanup occurs on failures and interruptions. 6. Prefer avoiding a temporary file entirely where the execution environment can safely pipe serialized JSON to `curl`. 7. Do not use `curl -d` with an untrusted filename; keep the generated path internal and non-user-controlled. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (10)

Vague Triggers

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill description and usage guidance define a very broad activation scope for any question involving current information, which can cause the skill to trigger on many ordinary prompts. Because the skill sends user queries to an external API, unintended invocation increases the chance of unnecessary third-party data disclosure and bypasses user expectations about when external search is used.

Content

No source excerpt is available for this finding.

Vague Triggers

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The listed trigger words are extremely generic across multiple languages, including words like 'what', 'where', and 'how', which appear in normal conversation. In this skill, that broad matching is dangerous because it can activate external search and transmit prompts to Felo even when the user did not intend third-party lookup.

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
85% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

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

-d @/tmp/felo_query.json

Clean up

rm -f /tmp/felo_query.json

text

**Notes:**

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
85% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

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

-d @/tmp/felo_query.json

Clean up

rm -f /tmp/felo_query.json

text

**Notes:**

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
85% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

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

-d @/tmp/felo_query.json

Clean up

rm -f /tmp/felo_query.json

text

**Notes:**

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
85% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

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

-d @/tmp/felo_query.json

Clean up

rm -f /tmp/felo_query.json

text

**Notes:**

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
85% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

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

-d @/tmp/felo_query.json

Clean up

rm -f /tmp/felo_query.json

text

**Notes:**

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% 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.

Content

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

md
1. Visit [felo.ai](https://felo.ai) and log in (or register)
2. Click your avatar in the top right corner → Settings
3. Navigate to the "API Keys" tab
4. Click "Create New Key" to generate a new API Key
5. Copy and save your API Key securely

### 2. Configure API Key

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The execution instructions tell the agent to send the user's query to Felo's API but do not require a clear user-facing warning or consent step before transmission. This creates a privacy and trust issue because users may not realize their prompts are being shared with an external provider.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
93% confidence
Finding

This command transmits the full user query to an external third-party endpoint, which is a real data egress path. In the context of a generally triggered search skill, that can expose sensitive or proprietary information if prompts are forwarded without user awareness or filtering.

Content

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

md
EOF

# Call Felo API
curl -s -X POST https://openapi.felo.ai/v2/chat \
  -H "Authorization: Bearer $FELO_API_KEY" \
  -H "Content-Type: application/json" \
  -d @/tmp/felo_query.json

Static analysis

No suspicious patterns detected.