T09 · Insecure Skill Coding Practices
- Location
scripts/solver.py:383- Finding
Sensitive credentials and task data exposed through command-line arguments
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill does what it says, but it solves anti-bot challenges by sending API keys, proxy credentials, page data, and challenge/session material to a third-party service with limited safety disclosure.
Install only if you intentionally want a third-party CAPTCHA/anti-bot solving service and are authorized to use it on the target sites. Treat the CapSolver API key, proxy credentials, WAF tokens, returned cookies, page HTML, and challenge data as sensitive; avoid putting secrets directly on the command line or in shared logs, and use an isolated environment with reviewed dependency versions.
scripts/solver.py:383Sensitive credentials and task data exposed through command-line arguments
requirements.txt:1Dependencies are installed using unbounded versions without integrity verification
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
.env file in the root directory based on the .env.example file:cp .env.example .env
.env file:YARA rule matched a hack tool or exploit indicator (offensive tools, reconnaissance, privilege escalation, or exploit frameworks).
---
name: capsolver
description: Use capsolver to automatically resolve Geetest, reCAPTCHA v2, reCAPTCHA v3, MTCaptcha, DataDome, AWS WAF, Cloudflare Turnstile, and Cloudflare Challenge, etc.
homepage: https://capsolver.com/
credentials:
- API_KEY
env:
required:
- API_KEY
---
# CapSolver Skill
Use this skill to automatically resolve various CAPTCHA challenges using the CapSolver API service. The skill supports Geetest, reCAPTCHA v2/v3, MTCaptcha, DataDome, AWS WAF, Cloudflare Turnstile, Cloudflare Challenge, and more.
**Authentication:** Set `API_KEY` in your environment or in a `.env` file in the repo
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
import requests
from dotenv import load_dotenv
# Load environment variables from .env file
load_dotenv()
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
import requests
from dotenv import load_dotenv
# Load environment variables from .env file
load_dotenv()
The README instructs users to handle API keys, proxies, cookies, and captured HTML used in anti-bot/captcha-solving workflows, but provides no warning about storing, transmitting, or redacting sensitive data. In this context, those artifacts can contain secrets, session tokens, identifying browser data, or full challenge pages, increasing the risk of accidental credential leakage, privacy violations, or misuse of live session material.
The skill documents use of environment variables and outbound network access to a third-party CAPTCHA-solving API, but it does not declare any explicit tool scope such as permissions or allowed-tools. That weakens least-privilege controls and transparency, making it easier for an agent or user to invoke networked behavior and secret access without clear policy boundaries.
This skill sends CAPTCHA images, page URLs, user-agent values, HTML challenge pages, cookies, and similar browsing artifacts to an external service, but the description does not warn users that this data leaves their environment. That creates a privacy and compliance risk because sensitive browsing/session data may be transmitted to a third party without informed consent.
This outbound POST transmits collected task data to a third-party API, including the clientKey and potentially sensitive challenge material, HTML, proxy details, or session-related values. In a captcha-solving skill, this external transmission is inherent to functionality, but it still creates a real data exposure boundary and can facilitate abuse of anti-bot bypass workflows.
raise TypeError(f"Unsupported type: {args.command}")
def create_task(self) -> tuple[str, Any]:
response = requests.post(
f"{self.api_base}{self.create_task_endpoint}",
headers=self.headers,
json=self.create_task_payload,
The script sends the API key plus user-supplied captcha, challenge, proxy, and session-related data to capsolver.com as part of normal operation, but it does so without any explicit runtime warning or consent mechanism about third-party disclosure. In this skill’s context, that is more concerning because the tool is specifically designed to bypass anti-bot controls and may transmit sensitive tokens, cookies, HTML, or challenge artifacts from other sites to an external service.
This POST sends the API key and task identifier to the external service to retrieve results. Although less sensitive than the initial task submission, it still transmits credentials to a third party and continues a workflow intended to solve or bypass access controls.
def get_task_result(self, task_id: str) -> Optional[Dict[str, Any]]:
self.get_task_result_payload['taskId'] = task_id
response = requests.post(
f"{self.api_base}{self.get_task_result_endpoint}",
headers=self.headers,
json=self.get_task_result_payload,
The dependency uses a lower-bound specifier only, which makes builds non-reproducible and allows installation of different versions over time. In a security-sensitive skill that interacts with anti-bot and challenge-solving services, this increases supply-chain risk and makes it hard to verify whether a safe or vulnerable version of requests is actually deployed.
requests>=2.32.4
python-dotenv>=0.9.9
requests has multiple known advisories across historical versions, and because the manifest does not pin a specific release, it is impossible to verify from this file whether deployment will avoid affected versions. The risk is amplified by the network-heavy nature of this skill, since requests is likely a core runtime dependency handling outbound HTTP interactions.
python-dotenv is also unpinned, so installations may resolve to different versions depending on timing and environment. This weakens reproducibility and can silently introduce vulnerable or incompatible releases, which is avoidable in production-oriented skills.
requests>=2.32.4
python-dotenv>=0.9.9
python-dotenv has known advisories in some versions, and the unpinned requirement prevents verification that a safe release will be installed. If dotenv file handling is used by the skill, a vulnerable version could affect local file safety or configuration integrity depending on how environment files are managed.
The code automatically loads a .env file and reads API_KEY from the environment for authentication. Although this is functionally expected, there is no explicit user-facing warning in the main help text that local credentials will be consumed automatically.
No suspicious patterns detected.