T03 · Remote Payload Retrieval and Execution
- Location
SKILL.md:8- Finding
Unverified Remote Installer Is Executed Directly by a Shell
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill is a coherent expert-memory MCP server, but its install path, remote pack loading, persistent memory, and local editing UI are too broad and under-controlled for automatic trust.
Install only after reviewing the source and pinning the version you run. Avoid the curl-to-shell installer path, be cautious with remote Engram packs, and do not store sensitive personal, health, credential, or business data in memory until category path validation, consent controls, and UI authentication are fixed. Do not leave the web UI running while browsing untrusted sites.
SKILL.md:8Unverified Remote Installer Is Executed Directly by a Shell
src/engram_server/server.py:301Mutable Remote Engram Packs Are Loaded as Trusted Agent Instructions
src/engram_server/loader.py:241Memory Category Path Traversal Permits Arbitrary File Modification and Persistent Prompt Poisoning
src/engram_server/server.py:545Automatic Persistent Collection of Personal Data and Tool Traces Enables Memory Poisoning
src/engram_server/web.py:73Unauthenticated Loopback Web UI Allows Cross-Origin Modification of Agent Instruction Files
Piping remote content directly into a shell is a classic command-chaining abuse pattern because it collapses fetch and execution into one step with no validation barrier. In the context of an AI tool README, users may copy-paste this command blindly, giving any compromise of the script source immediate code execution.
# macOS / Linux
brew install uv
# 或
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
The recommended prompt tells the agent to persist user facts, preferences, decisions, and tool activity by default, including globally shared memory. In practice this creates a broad surveillance-like memory layer inside the agent that may accumulate sensitive personal or behavioral data without meaningful user awareness or boundaries.
The example explicitly encourages storing identifying and potentially sensitive personal data such as name, age, city, occupation, language preference, and health conditions in shared global memory for reuse by all experts. This materially increases privacy and compliance risk because sensitive profile data is normalized as a reusable shared asset rather than tightly scoped context.
Piping network content directly into a shell is a chaining-abuse pattern because it collapses retrieval and execution into one step with no verification barrier. In security-sensitive tooling like an MCP server, this raises the chance that users will run compromised bootstrap code with their own privileges and then trust the installed agent thereafter.
# macOS / Linux
brew install uv
# or
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
The recommended system prompt directs the AI to proactively capture user facts, preferences, decisions, and global profile information, yet it does not require a user-facing notice or consent step before persistence. In an agent setting this can lead to covert collection and long-term storage of sensitive data across conversations and expert personas, increasing privacy, trust, and regulatory risk.
The global memory section explicitly instructs storing personal profile information once and replaying it across all experts. This broadens exposure across contexts and personas, making accidental disclosure, inappropriate reuse, or later compromise substantially more damaging than session-local memory.
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.
Project-level (.mcp.json in project root) or global (~/.claude/settings.json):
{
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.
Project-level (.mcp.json in project root) or global (~/.claude/settings.json):
{
The declared description says this skill is an MCP server for providing switchable expert memory to AI systems. However, the supplied code does not implement a server, MCP protocol handling, client integration, memory storage, retrieval, or persona/expert switching. Instead, it evaluates answer quality by matching expected and forbidden keywords, scoring checkpoints, assessing structure, comparing baseline and Engram responses, rendering a textual report, and optionally exporting CSV. This is a materially different primary purpose, so the description does not accurately represent the code.
The declared description generally matches the core theme—this is indeed an Engram MCP server that lets AI clients use switchable expert-memory packs. However, the description significantly understates the code’s capabilities. Beyond merely 'injecting expert memory,' the code provides broad management and persistence features: it installs packs from remote sources via git, initializes and materializes packs on disk, edits files, captures and mutates long-term memory/tool-trace data, and can start a local web UI and open a browser. Declared permissions are empty, yet the code clearly performs filesystem writes, subprocess git cloning, network retrieval of registry/repositories, and browser/UI launch behavior. These are material undeclared capabilities rather than incidental implementation details, so this should be flagged as a mismatch.
The declared description presents an MCP server whose purpose is to provide switchable expert memory to AI clients. The supplied code chunk does not implement or expose MCP server behavior, memory management, client integration, or expert-profile switching. Instead, it is a test harness for an evaluation script: it generates a case-study JSON file, invokes a scoring program, inspects textual scoring output, and validates a CSV report comparing baseline versus Engram answers. These behaviors are materially different from the declared primary purpose, so this chunk is mismatched with the description.
The skill explicitly directs the agent to capture and persist purchase history, complaints, product preferences, and contact preferences, including during onboarding, without any requirement to notify the user or obtain consent. In a brand-support context this is especially sensitive because the data is tied to customer identity and service history, creating privacy, compliance, and trust risks if stored unexpectedly or over-collected.
The description implies a fixed Japanese-speaking persona for several scenarios, which can override the user's preferred language or communication mode if the skill activates automatically. In an MCP/agent setting, this can degrade reliability, create unwanted prompt steering, and interfere with higher-priority user instructions because the behavior change occurs without clear opt-in.
Package name closely resembles a popular package, suggesting possible typosquatting. Attackers publish malicious packages with similar names to trick developers into installing them.
Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.
score += 12
elif name_l.startswith(token):
score += 8
elif token in name_l:
score += 6
if token in tags_l:
The generated system prompt explicitly instructs the model to persist user preferences, personal facts, decisions, inferred details, and even global shared attributes across conversations. This is a real privacy and data-minimization risk because it encourages collection and long-term retention of sensitive user data without any consent gate, purpose limitation, or clear access-control boundary shown in this file.
The capture_memory tool is designed to store personal context, decisions, history, tags, conversation IDs, expiry metadata, and even global shared user attributes for reuse in future conversations. This creates a substantial privacy risk because the interface encourages durable storage of sensitive and inferred data without demonstrating consent checks, least-privilege access, or safeguards around cross-context sharing.
The file is written as mandatory operating instructions in Chinese and does not offer any user language or locale choice. This creates a natural-language policy concern if the skill behavior implicitly assumes or enforces Chinese-language interaction without opt-in or justification.
The skill maps broad, everyday phrases such as finding, recommending, installing, exporting, or opening a UI directly to MCP tool calls without requiring clear confirmation. That creates a real risk of unintended side effects, especially for install or write-capable actions, because normal conversation can be interpreted as authorization to invoke external tools automatically.
The skill instructs the agent to broadly capture personal facts, preferences, stateful information, and detailed tool traces, with persistence across conversations and optional global scope. This creates a substantial data retention and privacy risk because sensitive user information may be stored without necessity minimization, explicit consent, or strong scoping, and tool traces can leak confidential prompts, project details, or operational metadata.
The README advertises automatic capture of user preferences and key information, plus cross-expert shared global memory, without a clear consent notice, retention policy, or sensitivity boundaries. This can lead to collection and reuse of personal data users did not realize would be persisted and shared across contexts.
The design encourages broad retention and reuse of user-provided profile and preference data across sessions and experts. Centralizing such data increases the risk of privacy leakage, unintended secondary use, and oversharing into unrelated expert contexts.
The README instructs users to run the MCP server via uvx --from git+https://... without pinning to a specific commit, tag, or immutable release. That causes every startup or install to trust the latest upstream repository state, so a compromised repo, malicious force-push, or hijacked dependency path could silently change code executed on the user's machine.
The recommended system prompt instructs the AI to automatically record all tool, MCP, subagent, and external tool activity, including failures, but does not clearly warn end users that these traces will be stored. Tool traces can contain sensitive arguments, filenames, prompts, or operational details that users may expect to remain ephemeral.
This command launches code fetched directly from GitHub at runtime without a pinned version. In an MCP context, that is especially risky because the fetched code becomes a trusted local tool with access to project data and potentially sensitive prompts or files.