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

Content
View full analysis

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
View 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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

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.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Context Window Stuffing

Medium
Category
Memory Poisoning
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.

Content

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

md
## 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

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/benchmark-cache.py (reported line 27)May include surrounding context.

python
"""Drop OS page cache (Linux only, requires sudo)"""
    try:
        # Drop page cache, dentries, inodes
        subprocess.run(
            ["sudo", "sync"],
            check=True,
            capture_output=True

subprocess module call

Medium
Category
Dangerous Code Execution
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.

Content

Scanner excerpt · scripts/benchmark-cache.py (reported line 32)May include surrounding context.

python
check=True,
            capture_output=True
        )
        subprocess.run(
            ["sudo", "sh", "-c", "echo 3 > /proc/sys/vm/drop_caches"],
            check=True,
            capture_output=True

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.