T09 · Insecure Skill Coding Practices
- Location
scripts/resume_optimizer.py:11- Finding
Sensitive resume data and user credentials transmitted over plaintext HTTP
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This resume optimizer is review-worthy because its documentation misstates how credentials and resume data are handled while the script is designed to send them to an undocumented plaintext API endpoint.
Review carefully before installing. Do not provide a real DeepSeek key or sensitive resume content to this skill unless the publisher fixes the documentation, uses a verified HTTPS endpoint, clearly identifies the data recipient, and obtains consent before upload. If you already used a real third-party API key with it, rotate that key.
scripts/resume_optimizer.py:11Sensitive resume data and user credentials transmitted over plaintext HTTP
SKILL.md:72Misleading setup instructions redirect a purported DeepSeek API key to an unrelated endpoint
SKILL.md:83Documented commands and local file workflow do not match the implemented paid remote service
scripts/resume_optimizer.py:88Successful optimization forcibly appends unrelated commercial advertising
scripts/resume_optimizer.py:11Undefined SKILL_ID causes failure during module initialization
The skill processes resumes and job descriptions, both of which commonly contain sensitive personal, educational, and employment information, but it does not clearly warn users that this content will be sent to DeepSeek's external API. This undermines informed consent and can result in privacy, confidentiality, or compliance issues if users submit PII or proprietary hiring materials unknowingly.
The user's resume text, which commonly contains sensitive personal data such as name, contact details, employment history, and education, is sent to a remote third-party API without any explicit notice, consent flow, or privacy warning. Because the default API endpoint is an external IP address over plain HTTP, the privacy risk is heightened by possible interception and undisclosed downstream retention.
The skill requires environment access and communicates with an external API, but it does not declare an explicit tool scope such as permissions or allowed-tools. This creates an authorization and transparency gap: a host may not clearly constrain what the skill can access or transmit, increasing the risk of unintended data exposure from resume contents or API keys.
The trigger conditions are broad enough to match many ordinary career or writing requests, which can cause the skill to activate unexpectedly. In this case that matters because the skill may encourage transmission of sensitive personal and employment data to an external service without the user having explicitly chosen this tool.
The skill is explicitly configured to send data to an external API endpoint. In the context of resume optimization, that transmission likely includes highly sensitive personal data and potentially confidential job descriptions, so the external transmission is security-relevant unless it is clearly disclosed, consented to, and properly minimized.
export RESUME_API_USER_KEY="你的DeepSeek API Key"
# 可选:自定义API地址
export DEEPSEEK_BASE_URL="https://api.deepseek.com/v1"
The note '目前只支持中文简历优化' establishes a fixed language constraint. The file does not offer users a language choice, an opt-in flow, or a documented region/compliance justification for restricting operation to Chinese only.
User-facing strings in the module docstring, CLI description, help text, and runtime output are all Chinese-only. This forces a specific language experience without presenting an option to choose locale or documenting a justified regional restriction.
The script performs external transmission of user data to a remote API, and in this file the default backend is a hard-coded plain-HTTP endpoint. This exposes sensitive resume contents and account identifiers to interception or tampering in transit and sends data to infrastructure outside the local trust boundary.
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 manifest describes a narrowly scoped resume-optimization assistant, but the code implements additional SaaS account functions: user registration, account info retrieval, and listing all available AI services. Those behaviors go beyond merely optimizing resumes and introduce a broader service-portal role not reflected in the skill description.
The services command enumerates all backend AI services exposed by the remote API, which expands visibility beyond the stated purpose of the skill. This can aid reconnaissance by revealing unrelated capabilities, pricing, and backend surface area to any user able to invoke the script.
No suspicious patterns detected.