Back to skill

Security audit

Eidolon Search

Security checks for vulnerabilities and agentic risk

Overview

The core search skill is coherent, but a documented benchmark script attempts a privileged host-wide cache reset without clear warning.

Review before installing. The search and indexing parts are ordinary local tools, but only index directories you intentionally want copied into a SQLite database. Avoid running scripts/benchmark-cache.py on shared, production, or sensitive machines unless you understand that it may request sudo and evict host-wide OS caches; normal search does not require that benchmark.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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)

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
scripts/benchmark-cache.py:22
Finding
Privileged System-Wide Cache Eviction in Benchmark Script## Vulnerability Details **File Location**: `scripts/benchmark-cache.py`, lines 22-39 **Vulnerability Type**: Unnecessary privilege escalation and modification of a system-wide kernel control **Risk Level**: Medium ### Vulnerable Code ```python def drop_cache(): """Drop OS page cache (Linux only, requires sudo)""" try: # Drop page cache, dentries, inodes subprocess.run( ["sudo", "sync"], check=True, capture_output=True ) subprocess.run( ["sudo", "sh", "-c", "echo 3 > /proc/sys/vm/drop_caches"], check=True, capture_output=True ) return True except Exception as e: print(f"Warning: Could not drop OS cache ({e})") print("Running benchmark without cache drop...") return False ``` ### Technical Analysis The cache benchmark directly invokes `sudo` and uses a privileged shell to write `3` to `/proc/sys/vm/drop_caches`. This kernel interface evicts the host's page cache, dentries, and inode caches. It is a global system operation rather than an action scoped to the benchmark process or its SQLite database. Normal indexing and search operations do not require elevated privileges. Requesting authorization to modify a system-wide kernel control therefore violates least-privilege principles. The benchmark is also recommended in `SKILL.md` without a prominent warning that it may request administrative privileges and affect unrelated workloads. The command is represented as a fixed argument list, so no user-controlled command-injection path was identified. The security issue is the unnecessary privileged operation itself rather than arbitrary shell-command execution. ### Attack Path 1. A user follows the documented instruction to run `python3 scripts/benchmark-cache.py`. 2. The script immediately calls `drop_cache()` and launches `sudo sync`. 3. The s ...[truncated 1148 chars]
Remediation
## Remediation Suggestions 1. Remove automatic OS cache eviction from the standard benchmark and compare first-run and subsequent-run performance without elevated privileges. 2. Do not invoke `sudo` from application or benchmark code. If genuine cold-cache testing is required, document it as a separate manual administrative procedure. 3. Run cold-cache benchmarks inside a disposable virtual machine or otherwise isolated dedicated test host where global cache eviction cannot affect unrelated workloads. 4. If the feature must remain, require an explicit option such as `--drop-system-cache`; keep it disabled by default and display a clear confirmation describing the host-wide impact. 5. Detect shared or containerized environments and refuse the privileged operation where isolation cannot be guaranteed. 6. Update `SKILL.md` to disclose the privilege request, affected kernel interface, host-wide scope, and safer non-privileged benchmark mode. 7. Prefer process-scoped measurement controls, repeated trials, randomized query ordering, and statistical reporting rather than manipulating a global kernel cache.
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Memory PoisoningPersistent Context Injection, Context Window Stuffing, Memory Manipulation
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
Findings (15)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The skill is presented as an interactive retrieval tool, but it also includes evaluation scripts that write results and use fixed test data rather than serving user search requests. While less severe than privileged cache manipulation, this still broadens behavior beyond the declared purpose and may cause an agent to execute file-writing benchmark code in contexts where only read/search behavior was expected.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
The skill is presented as an interactive retrieval tool, but it also includes evaluation scripts that write results and use fixed test data rather than serving user search requests. While less severe than privileged cache manipulation, this still broadens behavior beyond the declared purpose and may cause an agent to execute file-writing benchmark code in contexts where only read/search behavior was expected.

Lp3

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding
The skill advertises executable workflows that invoke Python scripts and direct SQLite CLI commands, but the manifest declares no explicit tool scope or permission boundaries. In an agent environment, missing scope makes it easier for the skill to inherit broader-than-necessary file, shell, and environment access, increasing the blast radius if the scripts are misused or compromised.

Vague Triggers

Medium
Confidence
95% confidence
Finding
The trigger language is broad enough to match many ordinary requests involving search, retrieval, files, or limited context. In an agentic system, overbroad activation can cause the skill to be selected inappropriately, leading to unnecessary indexing, shell execution, or access to larger portions of the filesystem than the user intended.

Context Window Stuffing

Medium
Category
Memory Poisoning
Content
## When to Use

- **Memory search**: Find specific information across many daily notes or memory files
- **Token-limited contexts**: When reading all files would exceed context limits
- **Repeated searches**: Index once, search many times
- **Large workspaces**: 10+ markdown files with cumulative size >50KB
Confidence
80% confidence
Finding
Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Natural-Language Policy Violations

Medium
Confidence
90% confidence
Finding
This markdown file contains user-facing guidance exclusively in Korean, and it does not provide an opt-in language choice or explain that the skill is intentionally limited to a Korean-language audience. Under the policy, forcing a specific language without user choice can be a natural-language policy violation.

Context-Inappropriate Capability

Medium
Confidence
96% confidence
Finding
The benchmark script includes privileged cache-dropping behavior that is outside the core search skill's purpose and affects the host system globally. In an agent-skill context, bundling system-level actions with a search utility increases the chance of unintended privileged execution and violates least surprise.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The script attempts privileged OS cache-dropping commands without a strong user-facing disclosure before execution. Even though `sudo` may prompt or fail, silently attempting system-wide cache manipulation is hazardous in shared or sensitive environments and is more dangerous because this skill's stated purpose is memory search, not system administration.

subprocess module call

Medium
Category
Dangerous Code Execution
Content
"""Drop OS page cache (Linux only, requires sudo)"""
    try:
        # Drop page cache, dentries, inodes
        subprocess.run(
            ["sudo", "sync"],
            check=True,
            capture_output=True
Confidence
70% confidence
Finding
subprocess module calls execute external commands. Without careful input validation, this enables command injection.

subprocess module call

Medium
Category
Dangerous Code Execution
Content
check=True,
            capture_output=True
        )
        subprocess.run(
            ["sudo", "sh", "-c", "echo 3 > /proc/sys/vm/drop_caches"],
            check=True,
            capture_output=True
Confidence
88% confidence
Finding
This subprocess call executes a privileged shell command to write to `/proc/sys/vm/drop_caches`, altering global OS cache state. Although the command string is fixed and not injection-prone, it performs a system-wide side effect unrelated to normal memory-search functionality and can disrupt system performance or surprise users if the script is run in a privileged environment.

Natural-Language Policy Violations

Medium
Confidence
93% confidence
Finding
The module docstring and function docstrings/instructions are written in Korean, which imposes a specific language on users and maintainers without any opt-in or explanation of a locale-specific requirement. This matches the policy category for language or locale constraints that are not optional or justified.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The manifest frames the skill as 'AI Agent memory search using SQLite FTS5,' which suggests querying existing indexed data. This file performs database initialization, deletion of prior entries, and insertion of file contents into the FTS table, which is a distinct index-construction/write capability rather than search itself.

Natural-Language Policy Violations

Low
Confidence
85% confidence
Finding
This markdown file includes several benchmark query examples written only in Korean alongside English content, which can imply a language-specific expectation without explicit opt-in or documented regional scope. The policy requires avoiding forced language/locale constraints unless the skill offers a choice or clearly justifies the limitation.

Missing User Warnings

Low
Confidence
78% confidence
Finding
The code creates a docs directory and writes benchmark results to benchmark-cache.json. While it prints the saved path afterward, there is no prior warning in comments, prompts, or user-facing messaging that the script will modify the filesystem by creating directories and files.

Natural-Language Policy Violations

Low
Confidence
92% confidence
Finding
The function docstring contains only Korean text ("메모리 검색"), which imposes a specific language in the skill's natural-language content without offering any language choice or documenting a locale-specific purpose. This can violate language/locale policy expectations for skills intended for general use.

Static analysis

No suspicious patterns detected.