Back to skill

Security audit

RuRussian MCP

Security checks for vulnerabilities and agentic risk

Overview

This Russian tutoring MCP is mostly purpose-aligned, but it asks agents to handle paid checkout and stores/transmits learner identity, credentials, and study data with weaker boundaries than users should accept blindly.

Review before installing. Use only the official HTTPS backend unless you fully trust an alternate endpoint, keep the API key out of shared or committed config files, require explicit human approval for every purchase step, and assume learner emails, submitted text, and progress data may be sent to the backend or stored locally in plaintext.

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
rurussian_mcp/config.py:5
Finding

Bearer credentials and learner content can be transmitted to arbitrary or plaintext API endpoints

Content
View full analysis
str: endpoint = endpoint.strip() if endpoint.startswith("https://") or endpoint.startswith("http://"): return endpoint if not endpoint.startswith("/"): endpoint = f"/{endpoint}" return f"{self.api_base_url}{endpoint}" ``` ```python # rurussian_mcp/services/auth_service.py:31-38 def get_headers(self, include_auth: bool = True) -> dict[str, str]: headers = { "User-Agent": self.user_agent, "Content-Type": "application/json", } if include_auth and self.api_key: headers["Authorization"] = f"Bearer {self.api_key}" return headers ``` ### Technical Analysis `RURUSSIAN_API_URL` is accepted without validating its scheme, hostname, port, or origin. The endpoint normalization logic explicitly permits both HTTP and HTTPS URLs. Authentic ...[truncated 2328 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
rurussian_mcp/services/memory_service.py:128
Finding

Learner profile data is stored in plaintext without restrictive permissions or atomic writes

Content
View full analysis
= 0.85: if profile["review_due"]: profile["review_due"] = profile["review_due"][1:] else: for mistake in request.mistakes: if mistake not in profile["weak_grammar"]: profile["weak_grammar"].append(mistake) if mistake not in profile["review_due"]: profile["review_due"].append(mistake) ``` ```python # rurussian_mcp/services/memory_service.py:128-138 def _load_store(self) -> dict[str, Any]: if not os.path.exists(self.store_path): return {"learners": {}} with open(self.store_path, "r", encoding="utf-8") as handle: data = json.load(handle) if "learners" not in data or not isinstance(data["learners"], dict): data["learners"] = {} return data def _save_store(self, store: dict[str, Any]) -> None: os.makedirs(os.path.dirname(self.store_path), exist_ok=True) with open(self.store_path, "w", encoding="utf-8") as handle: json.dump(store, handle, ensure_ascii=False, indent=2) ``` ### Technical Analysis The MCP persists learner profiles in a plaintext JSON file. Stored data can include scores, mistakes, we ...[truncated 2564 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (37)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description promises substantial end-user functionality related to Russian tutoring and possibly monetization. However, the supplied code chunk is only a minimal package initializer that exposes a main symbol from another module. There is no evidence in this chunk of the declared capabilities or any other behavior besides module export wiring. Because the actual provided code does not substantiate the described primary purpose, this is a mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

Based on the provided chunk, the code appears to define or document a memory/storage component for persistent learning state. The declared description emphasizes end-user tutoring features such as vocabulary analysis, sentence breakdowns, paid activation, and dictionary assistance. Those behaviors are not present in this code snippet. While a memory backend could support a tutoring system, this chunk’s actual purpose is materially narrower and different from the declared feature-oriented description.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The code is broadly consistent with a Russian tutor skill: it supports vocabulary help, sentence breakdowns, grammar explanation, lessons, reviews, answer evaluation, and conversation simulation. However, the declared description includes additional capabilities that are not reflected in this code chunk, especially paid activation and helping create or improve a Russian dictionary. The code only defines educational workflow schemas and does not show billing, activation, dictionary-maintenance functionality, or bot/platform-specific integration. Therefore the description overstates capabilities relative to the supplied code.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The code does match part of the description related to Russian tutoring features such as vocabulary analysis and sentence breakdowns. However, several prominently declared capabilities are absent: there is no payment or activation handling, no integration that 'turns an OpenClaw bot' into anything, no functionality for creating or improving a Russian dictionary, and no individualized teacher/persona behavior. The code is a standalone language analysis service, so the description overstates and misrepresents the implemented scope.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
88% confidence
Finding

The code is related to Russian-learning support, so it is not wholly unrelated to the description. However, the declared description emphasizes tutoring features like vocabulary analysis, sentence breakdowns, dictionary improvement, and paid activation. This specific code chunk does not perform vocabulary analysis, sentence breakdowns, or dictionary-editing/help functionality. Instead, its primary behavior is persistence and personalization: maintaining a learner profile, logging activities and mistakes, promoting proficiency level, recommending lesson focus, and reading/writing learner data from storage. It also relies on auth/purchase context to identify a learner, which is only loosely implied by 'paid activation' rather than clearly described. Because the actual code's main function is a memory/progress-tracking subsystem with filesystem persistence and learner identification, the description does not accurately represent this chunk's concrete behavior.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
88% confidence
Finding

The code substantially matches the core tutoring aspects of the description: vocabulary-related support, sentence breakdowns, lesson creation, review, answer evaluation, and conversation simulation all fit a Russian tutor/personal teacher purpose. However, the description also claims paid activation and helping create/betterize a Russian dictionary, and those capabilities do not appear in this code chunk. Additionally, the code accesses learner memory and backend personalization services, which are undeclared, though they are somewhat supportive of tutoring. Because key declared features are missing and there is minor undeclared data use, this is a description-behavior mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The supplied code does not implement any Russian tutoring, linguistic analysis, dictionary assistance, or educational behavior described in the skill purpose. Its functionality is focused entirely on account/payment infrastructure: authentication, pricing plans, checkout creation, purchase confirmation, and enabling paid access. While the description briefly mentions paid activation, that is only one supporting aspect of the declared tutor skill; here it is the entire code chunk's purpose. This is therefore a material description-behavior mismatch.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
94% confidence
Finding

The recommended workflow allows the bot to complete hosted checkout and then confirm the purchase, but it lacks a strong warning about irreversible financial actions and the exact conditions under which the bot may proceed. In practice, this can normalize autonomous payment behavior and create real monetary loss if the bot misunderstands user intent or is manipulated by prompt injection/social engineering.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
93% confidence
Finding

This code explicitly requests and returns an API key/token from the purchase confirmation endpoint, then exposes it to callers. Returning backend-issued secrets through a client-facing skill materially increases the risk of credential leakage, account abuse, replay by other components, and use of the key outside the intended purchase flow; in a Russian tutoring skill, this capability is not obviously necessary and therefore is more suspicious.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
85% confidence
Finding

The README advertises purchase flows and persistent learning memory without clear warnings that the agent may trigger transactions or modify stored user data. In an agent-executed MCP context, that increases the risk of unintended purchases, silent state changes, and privacy-impacting writes because users and integrators may not realize these tools are side-effectful.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding

The skill declares no explicit tool scope or permissions while its metadata and workflow require a networked MCP server plus implied access to environment secrets and potentially local state. In an agent platform, missing scope boundaries increases the chance the skill is granted broader capabilities than users or reviewers expect, which can enable unintended data access or exfiltration through the remote server.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill explicitly enables bots to buy access and open hosted checkout on a learner's behalf, but it does not impose a strong, explicit consent and confirmation boundary in the skill contract. In an autonomous-agent context, that can lead to unintended purchases, social engineering, or ambiguous authority over financial actions.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

The skill instructs agents to use learner email addresses for retrieving saved sentences and generating study content without a clear privacy notice, minimization guidance, or verification that the email belongs to the requesting user. In a tutoring context this can expose personal data or enable cross-account access if an agent accepts arbitrary emails.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
80% confidence
Finding

The skill is designed for self-serve agents that can complete checkout after user approval, which introduces autonomous decision-making around financially sensitive actions. Even if intended for convenience, delegating this authority to an agent raises the risk of the agent making or advancing purchases based on ambiguous prompts or manipulated context.

Content

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

md
- Self-serve educational agents that can complete checkout after user approval

Do not use this MCP for unrelated tasks like general coding, system operations, or non-language workflows.
Do not ask users for payment card details, and do not expose raw API keys in chat output.

## Required Setup

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The guide instructs users to place a live API key directly into a persistent config file without warning about file permissions, secret storage, or avoiding commits/logging. In an agent/bot integration context, config files are commonly copied, backed up, or checked into repositories, so this increases the chance of credential disclosure and downstream account abuse.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

The purchase flow tells integrators to collect an email, create a checkout session, and open a hosted payment URL, but it omits privacy and consent guidance around transmitting personal data and redirecting users to an external payment flow. In a bot setting, this is more sensitive because users may not realize their email is being sent to a third-party backend or that the bot is initiating a commercial workflow.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The request example sets "native_language": "English", which reflects a fixed language/locale assumption in natural-language-facing behavior. Under the policy, forcing a specific language without user opt-in is a violation unless the constraint is explicitly justified or alternatives are offered.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

This code makes multiple HTTP requests that send potentially sensitive user or account data to backend services, including email addresses, free-form sentence/text content, and payment session information. There are no confirmation prompts, user-facing log messages, or explanatory comments/docstrings in this file disclosing that this data is transmitted off-process.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The manifest focuses on Russian tutoring features like vocabulary analysis, sentence breakdowns, and helping build a dictionary, but this file also contains billing-oriented capabilities for creating purchase sessions and confirming purchases. In particular, purchase confirmation can request and return an API key, which is a materially different operational behavior from tutoring or language analysis.

Content

No source excerpt is available for this finding.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The code uses the learner's email from the purchase/auth context as a persistent identifier and exposes it via get_active_learner_email, linking identity directly to stored learning data. This creates a privacy risk because personally identifiable information is unnecessarily bound to behavioral profile data, making correlation, tracking, and disclosure more damaging if the datastore is accessed or leaked.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The service persists learner profile data, including activity history, mistakes, interests, vocabulary, and timestamps, to a local JSON file without any visible consent, minimization, retention control, or protection in this code path. Even if this is intended functionality, storing educational-behavior data in plaintext on disk increases privacy risk if the host is shared, compromised, backed up insecurely, or inspected by other local users/processes.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The code fetches the active learner's email from memory and includes it in a backend request (user_email) when generating reading content, but this file shows no consent check, minimization, or disclosure before transmitting that identifier. Email addresses are personally identifiable information, and sending them to another service without clear necessity or user awareness increases privacy and data-handling risk if the backend is compromised, misconfigured, or used beyond user expectations.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

At L082, the tool sends the purchase-session request to a backend, and the request includes the buyer email collected at L068 and populated at L074. This is a privacy-relevant network transmission, but the function contains no confirmation prompt, user-facing log/print, or explanatory comment/docstring disclosing that the email will be sent to an external service.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The tool sends user-provided text, language preference, and proficiency level to workflow_service.explain_text_for_learner, which is a network/backend-style service interaction. In this file there is no confirmation prompt, logging/print disclosure, or comment/docstring warning users that their content is transmitted for processing.

Content

No source excerpt is available for this finding.