Back to skill

Security audit

Job Auto Apply

Security checks for vulnerabilities and agentic risk

Overview

This job auto-apply skill is not clearly malicious, but it handles sensitive job-seeker data and promises real automation while leaving important privacy, scope, and accuracy controls underdefined.

Review this skill carefully before installing. Use dry-run only, do not provide real resumes or profile data unless you accept transmission to the named external AI APIs, and do not rely on non-dry-run submission records as proof that applications were actually filed. Avoid the CAPTCHA/proxy guidance and require explicit review before any real application activity.

Vulnerability Patterns
  • Tool Hijacking and SpoofingModifies or replaces tools so legitimate-looking calls execute attacker logic
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (3)

T09 · Insecure Skill Coding Practices

Warning
Location
job_search_apply.py:17
Finding

Applicant PII Transmitted to an External AI Service Without Adequate Data Minimization

Content
View full analysis
dict: r = requests.post( f"{_API_BASE}/pilot", headers={"Authorization": f"Bearer {SKILLBOSS_API_KEY}", "Content-Type": "application/json"}, json=body, timeout=60, ) return r.json() ``` The compatibility prompt includes applicant identity information: ```python prompt = ( f"Analyze this job posting and applicant profile for compatibility.\n\n" f"Job Title: {job.get('title')}\nCompany: {job.get('company')}\n" f"Description: {job.get('description', 'N/A')}\n\n" f"Applicant: {profile.full_name}, {profile.years_experience or 0} years experience.\n\n" f"Respond with JSON only: " f'{{ "match_score": <0.0-1.0>, "key_matches": [...], "missing_requirements": [...], "recommended": }}' ) result = _pilot({ "type": "chat", "inputs": {"messages": [{"role": "user", "content": prompt}]}, "prefer": "balanced", }) ``` The cover-letter prompt includes additional identifying information: ```python prompt = ( f"Write a professional, personalized cover letter for the following job application.\n\n" f"Job Title: {job.get('title')}\nCompany: {job.get('company')}\n" f"Job Description: {job.get('description', 'N/A')}\n\n" f"Applicant Name: {profile.full_name}\n" f"Years of Experience: {profile.years_experience or 'several'}\n" f"LinkedIn: {profile.linkedin_url or 'N/A'}" f"{template_hint}\n\n" f"Return only the cover letter text, no extra commentary." ) result = _pilot({ "type": "chat", "inputs": {"messages": [{"role": "user", "content": prompt}]}, "prefe ...[truncated 2197 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
platform_integration.md:151
Finding

Integration Guide Sends Complete Resume Contents to an Inconsistently Documented External Domain

Content
View full analysis
Remediation
View remediation

T07 · Tool Hijacking and Spoofing

Warning
Location
job_search_apply.py:188
Finding

Application Function Reports Successful Submission Without Performing or Verifying Any Submission

Content
View full analysis
Dict: """ Apply to a job posting. Args: job: Job posting data profile: Applicant profile dry_run: If True, don't actually submit applications Returns: Application result """ print(f"\n📝 {'[DRY RUN] ' if dry_run else ''}Applying to: {job['title']} at {job['company']}") print(f" Platform: {job['platform']}") print(f" URL: {job['url']}") # In real implementation, this would: # 1. Navigate to the application page # 2. Fill out application forms # 3. Upload resume/cover letter # 4. Answer screening questions # 5. Submit application result = { "job_id": job["id"], "status": "dry_run" if dry_run else "submitted", "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"), "platform": job["platform"], "job_title": job["title"], "company": job["company"], } if dry_run: print(" ⚠️ DRY RUN - Application not submitted") else: print(" ✅ Application submitted successfully") return result ``` ### Technical Analysis When `dry_run` is false, `apply_to_job()` reports a `submitted` status and prints a success message. However, the function performs no HTTP request, browser action, form completion, resume upload, or submission confirmation. The comments explicitly state that these operations would occur only in a future real implementation. The result therefore spoofs a successful platform operation. The surrounding workflow treats this fabricated result as a completed application and increments its application counter. This conflicts with the Skill's declared purpose and ca ...[truncated 1382 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
Findings (26)

Tainted flow: 'SKILLBOSS_API_KEY' from os.environ (line 15, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · job_search_apply.py (reported line 20)May include surrounding context.

python
def _pilot(body: dict) -> dict:
    r = requests.post(
        f"{_API_BASE}/pilot",
        headers={"Authorization": f"Bearer {SKILLBOSS_API_KEY}", "Content-Type": "application/json"},
        json=body,

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The skill description promises broad multi-platform search, automated application submission, and tracking behavior that the implementation reportedly does not actually provide. This mismatch is security-relevant because users and orchestrators may grant trust, data, or permissions based on claimed behavior, creating opportunities for unsafe assumptions, unintended automation, or hidden future capability expansion without proper review.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
95% confidence
Finding

The documentation states that AI-powered compatibility analysis and cover-letter generation are provided by SkillBoss API Hub, but it does not prominently warn that user profile, resume, and application data may be transmitted to that external service. Because this skill processes highly sensitive personal and employment information, lack of explicit disclosure undermines informed consent and increases privacy and compliance risk.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The compatibility-analysis flow sends applicant and job data to an external AI service without explicit notice, consent, minimization, or retention controls. In this skill context, the data may include sensitive employment history and personal identifiers, making undisclosed third-party transmission materially risky for privacy, compliance, and user trust.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

Cover-letter generation transmits applicant profile details and job information to an external API without explicit disclosure or consent. Because this skill is designed to automate applications at scale, it can repeatedly export personal data such as name, experience, and profile URLs across many jobs, amplifying privacy exposure.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · platform_integration.md (reported line 245)May include surrounding context.

Credential Storage

python
from cryptography.fernet import Fernet
import keyring

# Store credentials securely
keyring.set_password("job_automation", "linkedin", encrypted_password)

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · platform_integration.md (reported line 248)May include surrounding context.

Credential Storage

python
from cryptography.fernet import Fernet
import keyring

# Store credentials securely
keyring.set_password("job_automation", "linkedin", encrypted_password)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The skill advertises capabilities that imply environment access, file writes, and network operations, but it does not declare an explicit tool scope such as permissions or allowed-tools. In an automation skill that handles personal profile data and can trigger external requests, missing scope boundaries increases the chance of overbroad execution, unintended data access, or misuse by the hosting agent.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The manifest uses very broad trigger phrases like 'find and apply to jobs' and 'help me apply to multiple jobs automatically,' which can cause the skill to activate for ordinary career-assistance requests. In a skill capable of handling sensitive profile data and potentially submitting external applications, overbroad activation raises the risk of unintended invocation and actions beyond what the user expected.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The examples include production mode and auto-apply usage, but the documentation does not provide a prominent warning that this can submit real job applications on the user's behalf. In this context, accidental execution can create reputational harm, spam third-party platforms, and submit inaccurate or unwanted applications using the user's identity.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The top-level docstring says the script 'automates application submissions across multiple platforms,' and the workflow docstring says it will 'search jobs and apply automatically.' In practice, search_jobs returns no real jobs, apply_to_job never navigates or submits anything, and when dry_run is False it still marks the result as 'submitted' without performing a real application.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · job_search_apply.py (reported line 16)May include surrounding context.

python
from enum import Enum

SKILLBOSS_API_KEY = os.environ["SKILLBOSS_API_KEY"]
_API_BASE = "https://api.heybossai.com/v1"


def _pilot(body: dict) -> dict:

External Transmission

Medium
Category
Data Exfiltration
Confidence
83% confidence
Finding

This function performs external transmission to a third-party API endpoint, carrying prompts that may contain applicant and job data. In this skill, outbound transfer is more dangerous than in a generic utility because the workflow processes sensitive career and identity information and may do so repeatedly at scale.

Content

Scanner excerpt · job_search_apply.py (reported line 20)May include surrounding context.

python
def _pilot(body: dict) -> dict:
    r = requests.post(
        f"{_API_BASE}/pilot",
        headers={"Authorization": f"Bearer {SKILLBOSS_API_KEY}", "Content-Type": "application/json"},
        json=body,

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The docstring states the function will apply to a job posting, but the implementation contains only comments about what a real implementation would do. When dry_run is False, it prints success and returns status 'submitted' despite not interacting with any job platform.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The script stores job-search and application activity locally without warning or retention controls. While the saved fields shown are limited, they still reveal employment interests and activity history, which can be sensitive on shared systems or poorly secured environments.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The guidance explicitly recommends CAPTCHA-solving services and manual/automated bypass strategies as part of the workflow. In a job-application automation skill, this materially increases the capability to evade platform anti-bot controls and enables large-scale automated submissions beyond normal user interaction, creating abuse and compliance risk.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The resume tailoring function sends full resume content and job descriptions to a third-party API, which may contain highly sensitive personal, employment, and contact data. The markdown provides no clear requirement for explicit user consent, data minimization, retention review, or vendor trust validation before transmission.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
86% confidence
Finding

The detected external transmission at this line is not inherently malicious, but in context it sends resume and job data to a remote AI service. Because that data may include PII and employment history, the transmission is a real privacy risk unless governed by consent and minimization controls.

Content

Scanner excerpt · platform_integration.md (reported line 177)May include surrounding context.

md
def tailor_resume(resume_text, job_description):
    """Customize resume to highlight relevant skills via SkillBoss API Hub"""
    result = requests.post(
        "https://api.skillboss.com/v1/pilot",
        headers={"Authorization": f"Bearer {SKILLBOSS_API_KEY}", "Content-Type": "application/json"},
        json={

External Transmission

Medium
Category
Data Exfiltration
Confidence
86% confidence
Finding

The detected external transmission at this line is not inherently malicious, but in context it sends resume and job data to a remote AI service. Because that data may include PII and employment history, the transmission is a real privacy risk unless governed by consent and minimization controls.

Content

Scanner excerpt · platform_integration.md (reported line 177)May include surrounding context.

md
def tailor_resume(resume_text, job_description):
    """Customize resume to highlight relevant skills via SkillBoss API Hub"""
    result = requests.post(
        "https://api.skillboss.com/v1/pilot",
        headers={"Authorization": f"Bearer {SKILLBOSS_API_KEY}", "Content-Type": "application/json"},
        json={

External Transmission

Medium
Category
Data Exfiltration
Confidence
84% confidence
Finding

Referencing the third-party SkillBoss endpoint confirms the destination of sensitive resume-processing traffic. The risk is not the URL itself but the unqualified transfer of potentially sensitive applicant data to an external service without corresponding transparency and control requirements in the guidance.

Content

Scanner excerpt · platform_integration.md (reported line 178)May include surrounding context.

md
def tailor_resume(resume_text, job_description):
    """Customize resume to highlight relevant skills via SkillBoss API Hub"""
    result = requests.post(
        "https://api.skillboss.com/v1/pilot",
        headers={"Authorization": f"Bearer {SKILLBOSS_API_KEY}", "Content-Type": "application/json"},
        json={
            "type": "chat",

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The cover-letter generation flow transmits profile and company-research data to an external API without an explicit warning or consent checkpoint. Because profile objects commonly include personally identifying and career history data, this creates privacy and data-governance risk if users are unaware of the external disclosure.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
86% confidence
Finding

The external transmission here is part of normal feature behavior, but it still exports user profile content across trust boundaries to a third-party provider. In a job-application skill, the sensitivity of personal and career data makes this materially more dangerous than a generic outbound request.

Content

Scanner excerpt · platform_integration.md (reported line 201)May include surrounding context.

md
def generate_cover_letter(job, profile, company_research):
    """Create personalized cover letter via SkillBoss API Hub"""
    result = requests.post(
        "https://api.skillboss.com/v1/pilot",
        headers={"Authorization": f"Bearer {SKILLBOSS_API_KEY}", "Content-Type": "application/json"},
        json={

External Transmission

Medium
Category
Data Exfiltration
Confidence
86% confidence
Finding

The external transmission here is part of normal feature behavior, but it still exports user profile content across trust boundaries to a third-party provider. In a job-application skill, the sensitivity of personal and career data makes this materially more dangerous than a generic outbound request.

Content

Scanner excerpt · platform_integration.md (reported line 201)May include surrounding context.

md
def generate_cover_letter(job, profile, company_research):
    """Create personalized cover letter via SkillBoss API Hub"""
    result = requests.post(
        "https://api.skillboss.com/v1/pilot",
        headers={"Authorization": f"Bearer {SKILLBOSS_API_KEY}", "Content-Type": "application/json"},
        json={

External Transmission

Medium
Category
Data Exfiltration
Confidence
84% confidence
Finding

This destination line indicates third-party handling of cover-letter generation inputs, which likely include profile data and company-specific context. In this skill context, that raises privacy, data retention, and trust-boundary concerns that should not be hidden in implementation details.

Content

Scanner excerpt · platform_integration.md (reported line 202)May include surrounding context.

md
def generate_cover_letter(job, profile, company_research):
    """Create personalized cover letter via SkillBoss API Hub"""
    result = requests.post(
        "https://api.skillboss.com/v1/pilot",
        headers={"Authorization": f"Bearer {SKILLBOSS_API_KEY}", "Content-Type": "application/json"},
        json={
            "type": "chat",

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

Recommending residential proxies to avoid captcha blocks is an evasion technique that helps conceal automated activity from job platforms. This goes beyond legitimate job-search functionality and facilitates circumvention of rate limits, anti-abuse controls, and terms-of-service enforcement.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.