T09 · Insecure Skill Coding Practices
- Location
src/apply.py:448- Finding
Untrusted Job Listings Can Exfiltrate Personal Data and Resume Files to Arbitrary Destinations
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is a real job-search helper, but it can submit applications and personal resume data with weak opt-out confirmation and conflicting privacy disclosures.
Install only if you are comfortable with a skill that can read your resume/profile, contact job sites, generate tailored files, and submit applications externally. Keep auto-apply disabled or use dry runs until the workflow requires explicit approval for each job, validates destination domains, removes generic auto-submit, and accurately discloses WhatsApp, SMTP, LinkedIn, and data-retention behavior.
src/apply.py:448Untrusted Job Listings Can Exfiltrate Personal Data and Resume Files to Arbitrary Destinations
src/confirm.py:50Automatic Applications Execute Without Affirmative Approval or Enforcement of the Confirmation Window
src/report.py:1Remote Job Metadata Can Inject Instructions into Agent-Consumed Reports
src/tailor.py:424Unescaped Remote Listing Values Are Injected into Generated DOCX XML
requirements.txt:1Open-Ended Dependency Constraints Make Builds Non-Reproducible
This mismatch indicates the skill may perform materially different actions than the user would infer from the description, including undeclared outbound submissions, browser automation, and local persistence. In security terms, deceptive or incomplete capability disclosure undermines informed consent and can enable unauthorized exfiltration of resumes, credentials, or application data to third parties.
This mismatch indicates the skill may perform materially different actions than the user would infer from the description, including undeclared outbound submissions, browser automation, and local persistence. In security terms, deceptive or incomplete capability disclosure undermines informed consent and can enable unauthorized exfiltration of resumes, credentials, or application data to third parties.
This mismatch indicates the skill may perform materially different actions than the user would infer from the description, including undeclared outbound submissions, browser automation, and local persistence. In security terms, deceptive or incomplete capability disclosure undermines informed consent and can enable unauthorized exfiltration of resumes, credentials, or application data to third parties.
This mismatch indicates the skill may perform materially different actions than the user would infer from the description, including undeclared outbound submissions, browser automation, and local persistence. In security terms, deceptive or incomplete capability disclosure undermines informed consent and can enable unauthorized exfiltration of resumes, credentials, or application data to third parties.
This mismatch indicates the skill may perform materially different actions than the user would infer from the description, including undeclared outbound submissions, browser automation, and local persistence. In security terms, deceptive or incomplete capability disclosure undermines informed consent and can enable unauthorized exfiltration of resumes, credentials, or application data to third parties.
This mismatch indicates the skill may perform materially different actions than the user would infer from the description, including undeclared outbound submissions, browser automation, and local persistence. In security terms, deceptive or incomplete capability disclosure undermines informed consent and can enable unauthorized exfiltration of resumes, credentials, or application data to third parties.
This mismatch indicates the skill may perform materially different actions than the user would infer from the description, including undeclared outbound submissions, browser automation, and local persistence. In security terms, deceptive or incomplete capability disclosure undermines informed consent and can enable unauthorized exfiltration of resumes, credentials, or application data to third parties.
The skill advertises automated job applications and tailored resume submission to third-party platforms but does not clearly warn that it may transmit personal data externally. Because resumes often contain sensitive personal, employment, and contact information, omission of this warning materially increases the risk of unintended disclosure and unauthorized actions on the user's behalf.
The docstring and surrounding comments describe a resume-tailoring write path that unpacks the original DOCX, replaces text content, and repacks it while preserving formatting. In practice, the code builds tailored_text but never uses it, and only inserts a [TAILORED FOR: ...] note into document.xml, leaving the original resume content otherwise unchanged.
The manifest description at L003 tells users to use the skill to 'apply to jobs automatically,' implying current support, while L022 explicitly says the auto-apply engine is 'coming in v1.1.0 (not in current release).' This is a direct intent/documentation inconsistency about a core capability.
The trigger text is overly broad and includes common phrases like 'find me remote jobs' and 'run my daily job search,' increasing the chance the skill is invoked in contexts where the user did not intend this specific automation. Because the skill processes resumes, performs external job-board queries, and may lead to outbound messaging, overbroad activation expands privacy and consent risk.
The README advertises sending top matches via WhatsApp but does not clearly warn that resume-derived job search information will be transmitted to an external messaging platform. This can expose sensitive employment interests, qualifications, and preferences to third-party services without sufficiently informed user consent.
The install command uses npx clawhub without pinning an exact package version, which can cause users to execute whatever version is currently published at install time. This creates a supply-chain risk: a compromised or malicious updated package could run arbitrary code on the user's system during installation.
The daily automation instructions tell the agent to read the report and send a WhatsApp message, but omit any privacy warning or consent checkpoint before external delivery. In the context of a job-hunting skill that handles resume and skill-gap information, this omission makes accidental external disclosure more likely.
The README security section claims that all data is written locally and nothing is sent externally, yet other sections instruct the agent to send job summaries over WhatsApp. This contradictory security claim can mislead users into sharing resume-derived or job-search data externally without informed consent, which is a privacy and trust violation.
The manifest declares an automation-heavy skill but provides no explicit tool scope such as allowed-tools or permissions. For a skill that is described as reading resumes, writing tailored application artifacts, and interacting with remote job platforms, the absence of declared boundaries increases the chance of over-broad file and network access and prevents meaningful user review of what the skill may do.
The description uses broad automation language like daily searching, scoring, identifying gaps, and auto-applying without defining triggers, limits, approval points, or target boundaries. In a job-application context, such ambiguity is risky because it could cause unattended browsing, submissions, or data sharing with external services using personal resume information.
The profile uses very broad matching phrases and title keywords such as "llm", "ai ", "ml ", and "data scientist", which can over-match unrelated postings and trigger the wrong automation path. In this skill, that risk is amplified because matches are later used for resume tailoring and auto-application, so false positives can lead to unintended applications and disclosure of personal resume data to irrelevant employers.
The profile uses very broad phrases and title keywords such as "qa", "quality", and "test" without additional activation constraints, which can cause the agent to match unrelated listings or trigger on generic text. In this skill's context, that is security-relevant because the system auto-applies to jobs, so overbroad matching can lead to unintended applications, poor targeting, and unsafe automation actions against third-party sites.
The LinkedIn Easy Apply flow blindly checks radio buttons rather than deriving answers from verified profile data or requiring user input. On job applications, these radios commonly encode eligibility, sponsorship, relocation, security-clearance, or legal-attestation questions, so generic answers can cause false representations to third parties and submit materially inaccurate personal information.
This code path clicks the final LinkedIn submit button without an in-flow confirmation step at the moment sensitive personal data is transmitted. In the context of an auto-apply skill, that increases the risk of unintended submissions, especially because prior steps may have filled or guessed answers inaccurately.
The Greenhouse flow submits completed forms directly to a remote ATS after auto-filling personal data and attachments. Without a visible confirmation or review checkpoint in this path, the user may unknowingly disclose resume contents, contact details, and generated cover-letter text to unintended recipients or inaccurate postings.
The Lever handler performs remote submission immediately once a submit button is found, with no final user review. Given that the skill is designed to mass-apply across external job sites, this behavior can propagate accidental or incorrect disclosures at scale.
The Workday flow navigates multiple application steps and then submits personal data without an explicit confirmation gate. Because Workday forms often include legal declarations and profile data, silent submission raises the likelihood of unintended disclosures and inaccurate attestations being sent externally.
The generic form path auto-fills arbitrary external pages and submits as soon as a matching submit control is found, with no domain-specific validation or final confirmation. In a browser automation context, a malicious or unexpected page could collect sensitive resume and contact data or trigger unintended actions because the code treats unknown sites as safe-to-submit by default.
No suspicious patterns detected.