T09 · Insecure Skill Coding Practices
- Location
scripts/property_listing.py:214- Finding
MiniMax API Credential and Listing Data Can Be Routed to Undeclared Third-Party Providers
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill mostly does what it claims, but its code can send a MiniMax API key and listing data to LLM providers that are not disclosed in the skill description.
Review this skill before installing. It stores listing and agent data locally and uses an LLM for generation; only install it if you are comfortable sending property details and agent names to a remote service. Keep LLM_BASE_URL unset unless you understand the routing behavior, and use a restricted MiniMax API key because the current code can send that key to undeclared LLM hosts if the environment is configured that way.
scripts/property_listing.py:214MiniMax API Credential and Listing Data Can Be Routed to Undeclared Third-Party Providers
The skill explicitly persists sensitive business data locally and sends property specs plus agent contact details to an external LLM API. This creates session persistence and third-party exposure risks, especially because the stored data includes phone numbers, profiles, listings, and monthly counters that may outlive the user session.
name: mena-property-listing-generator
version: 1.0.1
author: "NASSER AL-SOLAITTI"
description: "AI-powered bilingual property listing generator for MENA real estate agents. Input: basic property specs. Output: SEO-optimized Arabic + English listing text, Instagram caption, TikTok script, Facebook post, and WhatsApp follow-up scripts. Use when user says 'create property listing', 'real estate listing', 'listing in Arabic', 'PropertyFinder listing', or wants to reduce manual copywriting time.
permissions:
- network: send listing text and agent details to minimax LLM API (api.minimax.chat) only
- filesystem-write: write generated listings to ~/.openclaw/mena-property-listing-generator/
The activation guidance is overly broad because it includes a generic trigger like wanting to 'reduce manual copywriting time,' which could cause the skill to activate in contexts beyond real-estate listing generation. Over-broad invocation increases the chance of unintended data handling and external transmission to the configured LLM API when the user did not specifically request this skill.
The description repeatedly presents bilingual Arabic + English generation as the default behavior, including the tagline and core output list. This can violate language/locale policy when a skill forces specific languages without stating that the user can choose or opt in to that locale behavior.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Hardcoded defaults per provider (credential is keyed to provider)
LLM_DEFAULTS = {
"MINIMAX_API_KEY": "https://api.minimax.chat/v1",
"OPENAI_API_KEY": "https://api.openai.com/v1",
"LLM_API_KEY": "https://api.minimax.chat/v1",
}
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Hardcoded defaults per provider (credential is keyed to provider)
LLM_DEFAULTS = {
"MINIMAX_API_KEY": "https://api.minimax.chat/v1",
"OPENAI_API_KEY": "https://api.openai.com/v1",
"LLM_API_KEY": "https://api.minimax.chat/v1",
}
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Hardcoded defaults per provider (credential is keyed to provider)
LLM_DEFAULTS = {
"MINIMAX_API_KEY": "https://api.minimax.chat/v1",
"OPENAI_API_KEY": "https://api.openai.com/v1",
"LLM_API_KEY": "https://api.minimax.chat/v1",
}
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Hardcoded defaults per provider (credential is keyed to provider)
LLM_DEFAULTS = {
"MINIMAX_API_KEY": "https://api.minimax.chat/v1",
"OPENAI_API_KEY": "https://api.openai.com/v1",
"LLM_API_KEY": "https://api.minimax.chat/v1",
}
The script sends listing contents and agent information to an external LLM service when a MINIMAX_API_KEY is present, but this network transmission is not clearly disclosed at the point of use or gated by explicit opt-in. Because agent names, phone numbers, and property details are included in the prompt, users may unknowingly exfiltrate business or personal data to a third party.
The LLM request includes property and agent data and transmits it to a remote API without explicit runtime disclosure or consent beyond the presence of an environment variable. In a CLI skill context, hidden third-party transmission is more concerning because users may assume formatting is local-only based on the tool's primary purpose.
The skill automatically generates bilingual English/Arabic output and injects Arabic translations into listing data without exposing any language selection or opt-in mechanism. Under the policy, forcing a specific language or locale without user choice is a natural-language policy violation unless the constraint is explicitly justified.
The skill description mandates bilingual Arabic and English output by default without indicating that the user can choose a single language. This can lead to unnecessary disclosure of user-provided property and agent details in additional generated outputs and may produce content the user did not request.
Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.
level = logging.INFO
env_level = os.environ.get("CLAWHUB_LOG_LEVEL", "").upper()
if env_level in ("DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"):
level = getattr(logging, env_level)
logging.basicConfig(
level=level,
format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
The inline comment at L231-L232 says the function is scoped to MINIMAX only and will not accept OPENAI_API_KEY or LLM_API_KEY. But nearby documentation/configuration at L222-L227 still describes hardcoded defaults for OPENAI_API_KEY and LLM_API_KEY as provider mappings, which contradicts the stated intent and can mislead maintainers about actual supported credential scope.