T09 · Insecure Skill Coding Practices
- Location
scripts/jd_generator.py:10- Finding
API Credential and Recruitment Data Transmitted over Plaintext HTTP
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This appears to be a paid job-description generator, but it sends credentials and hiring details to an undisclosed plaintext HTTP backend and has material documentation and runtime mismatches.
Review before installing. Use only if you are comfortable sending hiring details and the configured JD_API_USER_KEY to the provider, and require the publisher to switch to HTTPS, disclose the backend/operator and transmitted fields, fix the documented command examples, declare dependencies, and repair the script syntax before use.
scripts/jd_generator.py:10API Credential and Recruitment Data Transmitted over Plaintext HTTP
scripts/jd_generator.py:37Commercial Content Injected into Operational Command Output
scripts/jd_generator.py:8Undeclared and Unpinned Nonstandard HTTP Dependency
scripts/jd_generator.py:10Undefined SKILL_ID Causes Import-Time Denial of Service
SKILL.md:76Documented Interface and Credential Description Do Not Match the Implementation
The skill requires an environment secret (JD_API_USER_KEY) and appears to rely on networked API access, but it does not declare any explicit tool scope or permissions boundaries. This creates unnecessary ambiguity about what capabilities the skill may exercise at runtime and weakens reviewability, increasing the risk of secret misuse or unexpected outbound requests.
The manifest description is entirely in Chinese and presents the skill as Chinese-language oriented, but it does not state that the skill is region-specific or offer language choice. Under the policy, a forced language or locale without opt-in can be a natural-language policy violation.
The activation conditions are broad enough to trigger on normal recruiting or career discussions, not just clear requests to generate a job description. Over-broad triggering can cause unintended skill invocation, leading to unnecessary transmission of user-provided recruiting data to external services and reducing user control over when paid or networked functionality is used.
Nearly all natural-language strings, including the description, prompts, status messages, and argument help, are hard-coded in Chinese. This effectively forces a single language/locale experience without user opt-in or an explicit statement that the tool is intended only for Chinese-speaking users.
The script transmits user-supplied job data and account identifiers to a remote backend API, including a hard-coded default host over plain HTTP, without any explicit privacy notice or transport-security guarantee. This creates risk of silent data exfiltration, interception of sensitive HR/recruiting data, and leakage of the user key in transit.
The code sends data to an external backend using POST/GET requests, and the configured default API base is a raw IP address using HTTP rather than HTTPS. In the context of an HR-focused tool, transmitted position details, requirements, and account keys may be intercepted or redirected, making the external transmission materially dangerous.
if method == "GET":
resp = requests.get(url, headers=h, params=data or {}, timeout=30)
else:
resp = requests.post(url, headers=h, json=data or {}, timeout=60)
if resp.status_code >= 400:
try:
err = resp.json()
The skill is presented as a job-description generator, but it also exposes account registration, balance lookup, and a broader service-catalog API. This scope expansion means users may unknowingly interact with unrelated remote services and disclose identifiers or metadata beyond what is necessary for JD generation, violating least functionality and increasing attack surface.
The 'services' command enumerates a remote provider's full AI service catalog even though the advertised purpose is only generating job descriptions. This can expose internal or broader commercial capabilities to users without clear need, and it creates an unnecessary discovery surface for additional remote endpoints and data flows.
No suspicious patterns detected.