Back to skill

Security audit

Job Hunter

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent job-search assistant, but it deserves review because it stores sensitive CV data, fetches untrusted job postings, and pins a PDF parser version flagged as risky.

Install only after reviewing the data and dependency risks. Keep the skill in a private workspace, do not store tokens in config.json, update or avoid the pinned PDF parser before processing PDFs, confirm each web scan and file write, and treat all job posting text as untrusted content.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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 (2)

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:96
Finding

Untrusted Job-Posting Content Is Processed Without an Explicit Agent Instruction Boundary

Content
View full analysis
.json`) y llamá a `python3 scripts/match_jobs.py --profile data/profile.json --config data/config.json --job-file `. **Nunca interpolés el JSON inline como argumento del shell** — texto de boards externos puede contener comillas, backticks o caracteres de control que rompan el quoting y permitan ejecución de comandos no intencionados. - El script devuelve un score 0-100 + rationale + flags (salary_above_target, stack_perfect_match, seniority_mismatch, etc.) 4. Guardá todas las ofertas vistas en `data/seen_jobs.json` (incluso las que no matchean, para no reprocesarlas). ``` Related rendering behavior in `scripts/notify.py`, lines 136-151: ```python def _format_match_card(m: dict, prefix: str = "·") -> str: score = m.get("score", "?") title = m.get("title", "(sin título)") company = m.get("company", "(sin empresa)") flags = m.get("flags") or [] flag_str = f" ⚠ {', '.join(flags)}" if flags else "" rationale = m.get("rationale") or [] why = "; ".join(rationale[:2]) if rationale else "" url = m.get("url") or m.get("job_id", "") return ( f"{prefix} **{score}/100** — {title} @ {company}{flag_str}\n" f" {why}\n" f" {url}" ) ``` ### Technical Analysis The Skill ...[truncated 2733 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
requirements.txt:1
Finding

Dependency Installation Does Not Enforce Artifact Integrity or Fully Lock Transitive Packages

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (25)

Known Vulnerable Dependency: pdfminer.six==20231228 — 4 advisory(ies): CVE-2025-70559 (Insecure Deserialization (pickle) in pdfminer.six CMap Loader — Local Privesc); CVE-2025-64512 (Arbitrary Code Execution in pdfminer.six via Crafted PDF Input); CVE-2025-70559 (Insecure Deserialization (pickle) in pdfminer.six CMap Loader — Local Privesc) +1 more

Critical
Category
Supply Chain
Confidence
98% confidence
Finding

The requirements file pins pdfminer.six to version 20231228, and the supplied analysis indicates multiple known advisories including arbitrary code execution from crafted PDF input and insecure deserialization behavior. In this skill's context, parsing user-provided CVs and potentially third-party PDFs makes the dependency especially dangerous because untrusted document input is a normal workflow, increasing likelihood of exploitation.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
91% confidence
Finding

La descripción incluye un flujo amplio de job search automation: escaneo de boards/career pages, matching de oportunidades, propuestas de postulación y seguimiento. Este código solo cubre parcialmente la parte de análisis del perfil y compensación: estima seniority, calcula bandas salariales, detecta gaps y sugiere empresas target a partir de stack y config. Aunque arma cadenas de búsqueda para career pages, no realiza scraping, consultas de red, descubrimiento de vacantes ni tracking. Por lo tanto, la descripción sobrestima de forma material las capacidades reales del código suministrado.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

La descripción declara un asistente integral de búsqueda laboral proactiva, con capacidades externas de descubrimiento de vacantes, scoring de matches, recomendación de postulaciones y seguimiento. Sin embargo, el código mostrado solo implementa una pieza acotada de análisis de CV: lectura de archivos locales, extracción de texto, segmentación por secciones y detección heurística de skills, idiomas, contacto, títulos y experiencia. No hay lógica de red, scraping, acceso a boards/career pages, persistencia de seguimiento, ni cálculo salarial. Aunque 'analiza perfil basado en CV' sí coincide parcialmente, la conducta real representa solo un subcomponente preparatorio y omite la mayor parte de las capacidades declaradas, por lo que la descripción no representa fielmente lo que este chunk hace.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

La descripción declara un asistente integral de búsqueda laboral proactiva con análisis de CV, descubrimiento de vacantes, scoring y propuesta de postulaciones, además de seguimiento. El código suministrado solo cubre una parte acotada de ese alcance: el seguimiento de postulaciones ya cargadas, mediante operaciones CRUD sobre applications.json, cálculo de follow-ups y archivado de casos inactivos. No hay lógica de análisis de CV, scraping o escaneo de boards/career pages, matching, ni recomendación salarial. Por lo tanto, la descripción no representa fielmente lo que este chunk realmente hace; el comportamiento real es significativamente más limitado y diferente en su propósito principal.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The README makes a reassuring privacy claim that the skill 'does not send anything over the network by itself,' yet elsewhere it explicitly describes scanning external job boards, fetching URLs, and acknowledges that searches are logged by third-party sites. Even if network access is mediated by agent tools rather than embedded code, this wording can mislead users about real data exposure and consent boundaries, causing them to share sensitive CV or search data under false assumptions.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding

The skill instructs the agent to read and write local files and use network-backed browsing/scraping, but it does not declare any explicit tool scope such as permissions or allowed-tools. That creates an authorization gap: a host may grant broader capabilities than the skill actually needs, increasing the chance of unintended file access, persistence, or web access when the skill activates.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The description and operational instructions are written as mandatory Spanish behavior ('Asiste', 'Sos el copiloto laboral', 'Activate cuando el usuario'), but the skill also targets global markets and includes English trigger phrases. There is no indication that the user can choose another language or that Spanish-only operation is a justified regional constraint.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The activation criteria are broad enough to trigger on common career discussions or on merely receiving a CV file, which can cause the skill to ingest sensitive personal data and begin file/network operations without sufficiently clear user intent. In this context, the skill handles resumes, salary expectations, application history, and potentially web scanning, so overbroad activation increases privacy and least-astonishment risks.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The natural-language value "english-speaking team" imposes a language preference as a required condition. Under the policy, forcing a specific language without opt-in or a documented region-specific justification is a locale/language policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The file is written as an instruction/reference for another script and begins with Spanish-language content, indicating the skill's user-facing output is expected in Spanish. There is no visible opt-in, fallback, or instruction to respect the user's preferred language, which can violate language/locale policy requirements.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

This reference file uses Spanish throughout for instructions and content, which can impose a language constraint on users or downstream agents who may not have opted into that locale. The policy allows locale constraints only when choice or justification is provided, and neither appears in the file.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

This Python file contains natural-language instructions and user-facing output exclusively in Spanish, including the module docstring and later CLI/status messages. Under the policy, forcing a specific language without user opt-in is a natural-language policy violation unless the locale restriction is clearly documented and justified, which is not present here.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

Multiple user-visible strings such as help text, error messages, and result summaries are emitted only in Spanish. Because the script does not provide a locale switch or explain a justified regional scope, it imposes a language choice on users in a way the policy disallows.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The archive-stale command performs a state-changing write that marks active applications as ghosted and saves the modified data file. Although a --dry-run option exists, the non-dry-run path proceeds without any confirmation prompt before making bulk changes to user data.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The instruction sets a default language choice ('use English by default' for bilingual postings) without explicit user opt-in. While not a classic security flaw, it can cause the agent to act beyond user preference and submit or prepare application materials in an unintended language, which is a form of autonomy overreach in a user-facing agent.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The template instructs the agent to save output directly to data/applications/{slug}/cover-letter.md, which is a filesystem modification action, but it does not require explicit user confirmation at the moment of write or a clear warning that a file will be created/overwritten. In an agentic workflow, implicit writes can surprise users, overwrite existing drafts, or persist sensitive job-search data locally without informed consent.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This markdown template uses Spanish as the required interaction language in its natural-language instructions. Because the file does not indicate that Spanish is optional, user-selected, or justified as a region-specific constraint, it creates a language/locale policy concern.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The sample call-to-action tells the user to respond using Spanish phrases such as "Decime" and "sí", which implies a fixed interaction language. Without an opt-in or documented locale restriction, this can violate language-choice policy expectations.

Content

No source excerpt is available for this finding.

Vague Triggers

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The phrase 'o pasó tiempo desde el último scan' does not define how much time must pass or whether user consent is required before initiating a scan. This ambiguity can lead to unintended invocations or repeated scans in contexts where the user did not explicitly ask for one.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

Lines L039-L041 unconditionally reconfigure stdout to UTF-8, which imposes a specific output encoding/locale behavior on all users. Under the stated policy, forcing a language/locale-related setting without opt-in or a clearly documented justified constraint is a natural-language policy concern.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
91% confidence
Finding

This code file contains natural-language strings in the module docstring and later emits user-facing output in Spanish, but it does not indicate that the skill is intentionally Spanish-only or provide any user opt-in for language selection. Under the policy rule, forcing a specific language without user choice is a natural-language policy concern.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

The markdown digest content shown to the user is generated entirely in Spanish, including headings, guidance, and suggested actions. Because there is no configurable locale or explicit justification for a Spanish-only experience, this constitutes a language-policy issue.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

This is a natural-language policy issue because the file presents its description and usage text in a single language by default. There is no indication that the user can opt into Spanish or that the locale restriction is intentional and justified.

Content

No source excerpt is available for this finding.

Vague Triggers

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

This JSON schema contains natural-language descriptions such as 'Schema de cada item del array applications[]' and 'Snapshot del proceso de negociación si llegó a oferta' entirely in Spanish. For a general-purpose skill artifact, forcing a specific language without documenting user opt-in or a justified locale scope is a natural-language policy concern.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The prompt instructs the agent to write tailored CVs, change summaries, and cover letters into data/applications/{slug}/ without any notice, consent step, or retention guidance for the user's CV and application data. Because this content contains sensitive personal and employment information, silent local persistence can create privacy and data-handling risks if the workspace is shared, synced, or later accessed by other tools.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.