Back to skill

Security audit

Buy McDonald

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent McDonald's purchase helper, but it needs Review because it handles wallet tokens and real spending through an insufficiently disclosed third-party service with credential exposure risks.

Install only if you trust the claw_pay service operator and understand that the access_token functions like a wallet credential. Treat the token as secret, confirm every purchase before use, avoid workflows that expose base_url to user or model input, and prefer a version that redacts tokens from URLs and logs and clearly documents the payment service, revocation, and dispute process.

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

T09 · Insecure Skill Coding Practices

Error
Location
skill.py:99
Finding

Wallet Access Token Exposure Through Request URLs and Application Logs

Content
View full analysis
Dict[str, Any]: """Send an HTTP request.""" url = f"{self.base_url}{endpoint}" headers = { "Content-Type": "application/json", "Accept": "application/json" } try: response = requests.request( method=method, url=url, headers=headers, timeout=30, **kwargs ) response.raise_for_status() return response.json() except requests.exceptions.RequestException as e: logger.error(f"Request failed: {url}, error: {str(e)}") raise Exception(f"API request failed: {str(e)}") ``` The relevant balance lookup constructs the endpoint as follows: ```python def get_balance(self, access_token: str) -> Dict[str, Any]: endpoint = f"/api/v1/claw_pay/balance/{access_token}" logger.info(f"Querying balance: access_token={access_token[:10]}...") try: result = self._make_request("GET", endpoint) logger.info( f"Balance query succeeded: " f"claw_name={result.get('claw_name')}, " f"balance={result.get('balance')}" ) return result except Exception as e: logger.error(f"Balance query failed: {str(e)}") raise ``` The displayed English log messages are faithful translations of the source literals; the execution behavior and interpolated values are unchanged. ### Technical Analysis The balance API places `access_token`, a wallet credential, directly in the URL path. Sensitive credentials should not be transported in URL paths or query strings because URLs are routinely retained by: - Application and framework logs - Reverse-proxy access logs - API gateways and loa ...[truncated 1927 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
skill.py:73
Finding

Financial Credentials Transmitted to a Fixed Third-Party Service Without Adequate Trust Disclosure

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
skill.py:161
Finding

Unrestricted Base URL Override Can Redirect Wallet Credentials to an Attacker-Controlled Server

Content
View full analysis
Dict[str, Any]: """ Purchase a McDonald's product through the convenience interface. """ skill = BuyMcdonaldSkill(base_url=base_url) return skill.buy_product( sku_id=sku_id, sku_name=sku_name, access_token=access_token, claw_name=claw_name, claw_introduce=claw_introduce ) ``` The displayed English docstrings are faithful translations of the source text; function signatures and execution behavior are unchanged. ### Technical Analysis The public convenience functions accept an arbitrary `base_url` and pass it to `BuyMcdonaldSkill` without scheme, hostname, port, or destination validation. The purchase method subsequently sends the wallet token and account data to that destination. If an application exposes `base_url` through request parameters, agent-generated arguments, configuration, environment variables, or other untrusted input, an attacker can replace the legitimate destination with a server under their control. The library will then submit the complete purchase payload to that server. The same primitive can potentially be used for server-side request forgery when the library executes in a network environment that can access internal services. However, actual internal reachability and response behavior are environment-dependent; the directly demonstrated risk is credential redirection. ### Attack Path ...[truncated 1473 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • 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
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (6)

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

The declared description says the skill is for purchasing McDonald's products, but the body also includes balance-query and product-listing capabilities that are not clearly declared in the metadata. This mismatch can mislead reviewers and users about the skill's actual behavior, reducing transparency for a payment-handling integration and potentially enabling broader data access than expected.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The skill describes network-capable operations against payment-related endpoints but does not declare any explicit tool scope or allowed-tools boundary. In a financial workflow, missing scope declarations increases the risk of unintended or overly broad network access, making it harder to enforce least privilege and audit what the skill is permitted to call.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill instructs users to provide an access_token used as an account key for balance checks and purchases, but it does not clearly warn that this credential is sensitive or that using it triggers real-money spending. In this context, disclosure or mishandling of the token could let someone query balances or make unauthorized purchases, creating direct financial risk.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The module title, top-level description, and class docstring are written in Chinese, and no surrounding text indicates that the skill is region-specific or that users may choose another language. Under the policy, a skill that imposes a specific language without opt-in is a natural-language policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
92% confidence
Finding

The module description includes only Chinese explanatory text alongside the English title, which indicates the skill documentation is language-specific without offering a user choice or opt-in. This matches the language/locale policy concern for natural-language content in code files.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The manifest describes the skill as purchasing McDonald's products via claw_pay balance payment, which implies a transactional purchase function. However, the code and module docstring explicitly include and implement standalone balance-query operations via get_balance and check_balance_sufficient, expanding behavior beyond pure purchasing.

Content

No source excerpt is available for this finding.