Back to skill

Security audit

Resume Score for the resume

Security checks for vulnerabilities and agentic risk

Overview

This resume-scoring skill is mostly local and purpose-aligned, but it needs review because its CLI can silently save resume-derived output to a hard-coded local path.

Install only if you are comfortable with a Chinese-language, local rule-based resume scorer. Avoid passing highly sensitive resumes or arbitrary file paths unless you understand what the agent will read, and do not run the Python CLI until the fixed output path is removed or replaced with an explicit user-chosen destination.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/resume_scorer.py:677
Finding

Hard-Coded External Output Path Causes Unconditional File Overwrite

Content
View full analysis

Vulnerability Details

File Location: scripts/resume_scorer.py, lines 677–678
Vulnerability Type: Hard-coded external path and unsafe file overwrite
Risk Level: Medium

python
output_path = "C:/Users/UncleC/Desktop/AIresumejudge/.workbuddy/skill_output_test.md"
with open(output_path, "w", encoding="utf-8") as f:

Technical Analysis

The command-line entry point writes every generated report to a developer-specific absolute path. Opening the destination in w mode immediately creates the file or truncates an existing file without asking for confirmation.

The destination is neither selected by the caller nor safely scoped to the project or current working directory. Consequently, running the scorer has an undocumented filesystem side effect outside its core résumé-scoring purpose. The fixed path also makes the CLI non-portable: on systems where the parent directory does not exist, report generation fails with an unhandled exception.

The destination cannot be directly changed through résumé input, so this is not an arbitrary-path write vulnerability. Exploitation requires the fixed path to resolve to an existing target, or an attacker to prepare that path or redirect it using filesystem links where platform permissions permit.

Attack Path

  1. An attacker or local user prepares the hard-coded destination path, potentially arranging for the final path to resolve to a file whose contents should be preserved.
  2. A victim invokes python scripts/resume_scorer.py <resume_text_or_file>.
  3. The application completes résumé scoring and reaches the fixed output operation.
  4. Python opens the destination with w mode, truncating any existing file.
  5. The generated report replaces the previous contents. If the directory is absent, the program instead terminates during output with an unhandled filesystem error.

Impact Assessment

The write occurs with the privileges of the user executing the skill. It can destroy or replace data ...[truncated 508 chars]

Remediation
View remediation

Remediation Suggestions

  1. Return the generated report through standard output by default and avoid implicit writes outside the project.
  2. Add an explicit command-line option such as --output PATH when file output is required.
  3. Resolve and validate the requested destination before writing. Apply an allowlist or workspace boundary if the skill must only write within an approved directory.
  4. Use exclusive creation mode (x) by default, or check for an existing destination and require an explicit --force option before replacement.
  5. Do not create missing parent directories without informed user consent.
  6. Write to a securely created temporary file in the destination directory and atomically rename it after successful generation.
  7. Catch filesystem exceptions and return a clear error without leaving a partial output file.
  8. Remove the developer-specific absolute path from production code and document all filesystem side effects.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Output HandlingUnvalidated Output Injection, Cross-Context Output, Unbounded Output
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (12)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The declared behavior is resume scoring, but the implementation reportedly also writes results to a fixed local path and uses a materially different scoring mechanism than described. This mismatch is dangerous because hidden file writes can persist sensitive resume-derived data locally without informed consent, and behavior drift undermines trust and reviewability of the skill.

Content

No source excerpt is available for this finding.

Unvalidated Output Injection

High
Category
Output Handling
Confidence
80% confidence
Finding

Model output is used without validation or sanitization. Unvalidated output injected into downstream contexts (SQL, shell, HTML) enables injection attacks and arbitrary code execution.

Content

Scanner excerpt · assets/index.html (reported line 757)May include surrounding context.

html
// Improvements
  const listEl = document.getElementById("improvementList");
  listEl.innerHTML = result.suggestions.map((s, i) =>
    `<li><span class="num">${i + 1}</span><span>${s}</span></li>`
  ).join("");
}

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The skill documentation indicates it can read user-supplied files and the associated implementation reportedly has file read/write capability, but the skill declares no explicit tool scope or permissions. Undeclared filesystem access is dangerous because it weakens user consent and platform enforcement, especially for a resume-processing skill that will handle sensitive personal data.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill explicitly accepts file-path resumes for parsing but does not warn users that local files will be accessed and processed. Because resumes commonly contain PII such as phone numbers, email addresses, employment history, and education records, silent local file access increases privacy and data-handling risk.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The usage examples encourage users to provide direct local file paths without any privacy, consent, or minimization guidance. This is risky in context because the skill processes resumes, a highly sensitive document class, and examples normalize unsafe sharing patterns that may expose more local data than users expect.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The HTML declares lang="zh-CN" and the title/UI text are entirely Chinese, which imposes a specific language/locale on users. The file does not provide any language selector, opt-in, or explanation that this skill is intentionally region-specific.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The comment at L501 says this is a pure-JS scoring engine consistent with scorer.py, but in scoreTechDepth the tools bonus uses tools.filter(t => t.includes(t)), which is always true for every non-empty tool string and therefore awards a fixed bonus regardless of resume content. This directly undermines the claim of logic consistency because the implemented behavior is not a meaningful content-based scoring rule.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

This markdown file contains user-facing natural language exclusively in Chinese, and there is no indication that the skill is limited to a Chinese-speaking audience or region. Under the policy, forcing a specific language without user opt-in or documented justification is a natural-language policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The natural-language description and all user-facing report strings are fixed in Chinese, indicating the skill is designed to operate in a single language without opt-in or locale selection. This matches the policy category for language or locale constraints that are imposed without offering a user choice.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The script treats a short argument as a file path and reads it if it exists, allowing access to arbitrary local files rather than only resume content intentionally supplied through a controlled interface. In an agent or tool-execution context, this broadens the trust boundary and can expose sensitive local files if an attacker can influence the argument value.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The CLI writes a Markdown report and raw JSON derived from the resume to a hard-coded local path without user consent. Resume data commonly contains sensitive personal information, so this creates an unintended local data disclosure and persistence risk, especially on shared machines or when the path is synchronized, monitored, or later accessed by other processes/users.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The code stores resume-derived output, including the original input reference and structured scoring data, to a fixed file without warning or confirmation. Because resumes often contain PII and employment history, silent persistence increases privacy, retention, and unauthorized access risks beyond the expected scoring function.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.