T09 · Insecure Skill Coding Practices
- Location
llm_key_pool/config_loader.py:145- Finding
Unrestricted provider endpoint can disclose API credentials and prompt data
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill does what it claims, but it handles live LLM API keys and prompt data with weak endpoint and local secret protections that users should review before installing.
Install only if you are comfortable storing provider API keys locally and routing prompts through configured third-party LLM services. Use trusted HTTPS endpoints only, avoid custom or shared configs, set restrictive permissions on llm_config.yaml, never commit or share it, test with non-sensitive prompts, and monitor provider usage or billing.
llm_key_pool/config_loader.py:145Unrestricted provider endpoint can disclose API credentials and prompt data
assets/setup_helper.py:114Setup helper stores API credentials without enforcing restrictive file permissions
The skill context increases risk because it explicitly targets multi-vendor API key management and rate-limit avoidance, both of which involve high-value secrets and privileged outbound requests. If the code is actually unrelated, users may still create secret-bearing files and run commands, making the mismatch an effective lure for credential exposure or covert behavior.
The skill context increases risk because it explicitly targets multi-vendor API key management and rate-limit avoidance, both of which involve high-value secrets and privileged outbound requests. If the code is actually unrelated, users may still create secret-bearing files and run commands, making the mismatch an effective lure for credential exposure or covert behavior.
The skill context increases risk because it explicitly targets multi-vendor API key management and rate-limit avoidance, both of which involve high-value secrets and privileged outbound requests. If the code is actually unrelated, users may still create secret-bearing files and run commands, making the mismatch an effective lure for credential exposure or covert behavior.
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.
# 创建 skills 目录(如果不存在)
mkdir -p ~/.claude/skills
# 克隆或复制项目到 skills 目录
git clone https://github.com/OpenClaw/llm-key-pool.git ~/.claude/skills/llm-key-pool
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
# 创建 skills 目录(如果不存在)
mkdir -p ~/.claude/skills
# 克隆或复制项目到 skills 目录
git clone https://github.com/OpenClaw/llm-key-pool.git ~/.claude/skills/llm-key-pool
The README explicitly instructs users to place real API keys into a local YAML file and emphasizes convenience, but it does not clearly warn that these credentials are highly sensitive or that prompts and data will be transmitted to third-party model providers. In a key-pooling tool that routes requests across multiple external vendors, this omission increases the chance of accidental credential mishandling and unintended disclosure of sensitive user data.
The skill describes capabilities that inherently involve reading configuration files, managing sensitive API keys, and making outbound network calls, yet it declares no explicit tool scope or permission boundaries. In an agent environment, this weakens least-privilege controls and can allow broader-than-expected file and network access when handling secrets.
The manifest description and the entire user-facing markdown content are written in Chinese, and the file does not offer an alternative language option or state that the skill is intended only for a Chinese-speaking or region-specific audience. Under the policy for natural-language constraints, this constitutes a locale/language restriction without user opt-in or documented justification.
The guide explicitly instructs users to copy a YAML file, edit it, and replace placeholders with real API keys in a local plaintext configuration file that is then consumed by subsequent CLI commands. Although the document briefly says not to commit the file to version control, it does not clearly frame the file as sensitive secret material, recommend safer secret-loading mechanisms, or warn about local exposure risks such as shell history, backups, screenshots, or accidental sharing.
The guide explicitly instructs users to place real API keys directly into a YAML config file, but does not warn about file permissions, secret storage, or accidental commits to version control. In a key-pool skill that encourages multiple third-party credentials, this increases the chance of credential leakage, unauthorized API usage, and billing abuse.
The test commands send user-supplied prompts to external model providers, but the guide does not clearly disclose that entered data leaves the local environment and is transmitted to third-party APIs. Users may unknowingly send sensitive code, internal documents, or regulated data during setup validation.
The quickstart explicitly instructs users to place real API keys into a local YAML file in plaintext, while only later giving a brief generic warning not to commit the file to version control. That guidance does not adequately address local plaintext secret exposure risks such as shell history, backups, shared workstations, accidental file disclosure, or permissive filesystem permissions.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
model: "Qwen/Qwen2.5-7B-Instruct"
api_keys:
- "sk-你的真实API-Key"
base_url: "https://api.siliconflow.cn/v1"
global:
max_retries: 3
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
model: "Qwen/Qwen2.5-7B-Instruct"
api_keys:
- "sk-你的真实API-Key"
base_url: "https://api.siliconflow.cn/v1"
global:
max_retries: 3
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
model: "Qwen/Qwen2.5-7B-Instruct"
api_keys:
- "sk-你的真实API-Key"
base_url: "https://api.siliconflow.cn/v1"
global:
max_retries: 3
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
model: "Qwen/Qwen2.5-7B-Instruct"
api_keys:
- "sk-你的真实API-Key"
base_url: "https://api.siliconflow.cn/v1"
global:
max_retries: 3
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
model: "Qwen/Qwen2.5-7B-Instruct"
api_keys:
- "sk-你的真实API-Key"
base_url: "https://api.siliconflow.cn/v1"
global:
max_retries: 3
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
model: "Qwen/Qwen2.5-7B-Instruct"
api_keys:
- "sk-你的真实API-Key"
base_url: "https://api.siliconflow.cn/v1"
global:
max_retries: 3
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
model: "Qwen/Qwen2.5-7B-Instruct"
api_keys:
- "sk-你的真实API-Key"
base_url: "https://api.siliconflow.cn/v1"
global:
max_retries: 3
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
model: "Qwen/Qwen2.5-7B-Instruct"
api_keys:
- "sk-你的真实API-Key"
base_url: "https://api.siliconflow.cn/v1"
global:
max_retries: 3
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
model: "Qwen/Qwen2.5-7B-Instruct"
api_keys:
- "sk-你的真实API-Key"
base_url: "https://api.siliconflow.cn/v1"
global:
max_retries: 3
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
model: "Qwen/Qwen2.5-7B-Instruct"
api_keys:
- "sk-你的真实API-Key"
base_url: "https://api.siliconflow.cn/v1"
global:
max_retries: 3
The file's docstring and all user-facing console messages and prompts are written only in Chinese, and the example prompts explicitly direct Chinese output. For a general example script, this imposes a specific language/locale without opt-in, which matches the natural-language policy violation criteria.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
'tier': 'primary',
'model': 'xiaolongxia-72b',
'api_keys': [api_key],
'base_url': 'https://api.xiaolongxia.com/v1'
}
print("✓ 小龙虾配置完成")
print()
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
'tier': 'primary',
'model': 'xiaolongxia-72b',
'api_keys': [api_key],
'base_url': 'https://api.xiaolongxia.com/v1'
}
print("✓ 小龙虾配置完成")
print()
No suspicious patterns detected.