Back to skill

Security audit

Resume Generator

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly performs local resume generation, but its HTML export can turn resume text or imported Markdown into executable browser content.

Review before installing. Use a trusted, pinned source rather than an unverified latest PyPI install when possible, avoid processing resumes or Markdown files from people you do not trust, and treat generated HTML as potentially unsafe until the exporter escapes or sanitizes all user-provided 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 (3)

T09 · Insecure Skill Coding Practices

Warning
Location
generator.py:277
Finding

Stored HTML and Script Injection in Generated Resumes

Content
View full analysis
') else: html_lines.append('') elif in_code_block: html_lines.append(line) elif line.startswith('# '): html_lines.append(f'

{line[2:]}

') elif line.startswith('## '): html_lines.append(f'

{line[3:]}

') elif line.startswith('### '): html_lines.append(f'

{line[4:]}

') elif line.startswith('- '): html_lines.append(f'
  • {line[2:]}
  • ') elif line.startswith('>'): html_lines.append(f'
    {line[1:].strip()}
    ') elif line.strip(): html_lines.append(f'

    {line}

    ') else: html_lines.append('
    ') ``` ### Technical Analysis Resume data supplied through JSON or command-line arguments is first converted to Markdown and then inserted directly into HTML elements. The converter does not HTML-escape text before placing it inside headings, paragraphs, list items, blockquotes, or code blocks. Consequently, HTML in fields such as the applicant name, self-introduction, employer, project description, or skills is interpreted as active markup rather than plain text. For example, a field containing an image element with an `onerror` handler can introduce JavaScript into the generated document. The same issue also affects the document title construction at `generator.py:259`, where the applicant name is concatenated directly into the `` element. ### Attack Path 1. An attacker prepares resume JSON containing an HTML payload in a supported field, for example: ```json { "name": "<img src=x onerro ...[truncated 1113 chars]
    Remediation
    View remediation
    `, event-handler attributes, closing-tag breakouts, and malformed HTML. A safe basic conversion should follow this pattern: ```python from html import escape safe_text = escape(line[2:], quote=True) html_lines.append(f'

    {safe_text}

    ') ``` ]]>

    T09 · Insecure Skill Coding Practices

    Warning
    Location
    cli.py:84
    Finding

    HTML Injection Through Markdown Export

    Content
    View full analysis
    简历导出 body {{ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; max-width: 800px; margin: 40px auto; padding: 20px; color: #333; }} h1 {{ color: #2c3e50; border-bottom: 2px solid #3498db; padding-bottom: 10px; }} h2 {{ color: #34495e; margin-top: 30px; }} h3 {{ color: #7f8c8d; }} pre {{ background: #f8f9fa; padding: 15px; border-radius: 5px; overflow-x: auto; }} ul {{ line-height: 1.8; }} blockquote {{ border-left: 4px solid #3498db; margin: 0; padding-left: 15px; color: #666; }}
    text
    {content}
    ''' ``` ### Technical Analysis The export command reads arbitrary content from a Markdown file and interpolates it into a `
    text
    ` element without HTML escaping. A `
    text
    ` element does not neutralize HTML syntax.
    
    An attacker can include a closing `
    ` tag in the input, followed by active HTML or JavaScript. The browser will close the intended container and parse the remaining payload as executable markup. This is a stored injection because the payload is persisted in the exported HTML file. ### Attack Path 1. An attacker supplies or shares a crafted Markdown resume containing: ```html
    text
       ```
    
    2. The victim exports it to HTML:
    
       ```bash
       python cli.py export --input malicious.md --format html --output resume.html
       ```
    
    3. The export function inserts the content directly between `
    text
    ` and `
    `. 4. The attacker's closing tag terminates the intended text container. 5. Opening the resulting HTML file causes ...[truncated 540 chars]
    Remediation
    View remediation
    `. - Use `html.escape(content, quote=True)` from Python's standard library. - Do not rely on `
    text
    ` or `` elements as security boundaries.
    - If the intended behavior is actual Markdown rendering, process the input with a maintained Markdown parser and sanitize the resulting HTML with a strict allowlist.
    - Add a regression test verifying that `
    `, `

    T08 · Insecure Dependencies

    Note
    Location
    SKILL.md:16
    Finding

    Unpinned and Unverified Package Installation Instruction

    Content
    View full analysis
    Remediation
    View remediation
    Vulnerability Patterns
    • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
    • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
    • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
    • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
    • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
    Findings (7)

    Missing User Warnings

    Medium
    Category
    Not specified by scanner
    Confidence
    94% confidence
    Finding

    The skill explicitly collects and processes sensitive personal data including name, email, phone number, location, education, and employment history, but provides no privacy notice, retention policy, consent guidance, or warning about handling/exporting that data. This creates a real privacy and compliance risk because users may expose personally identifiable information without understanding where it is stored, transmitted, or included in generated outputs.

    Content

    No source excerpt is available for this finding.

    Natural-Language Policy Violations

    Medium
    Category
    Not specified by scanner
    Confidence
    94% confidence
    Finding

    This code presents user-facing strings in Chinese and later hard-codes the generated HTML document language to zh-CN, indicating the skill assumes a specific language/locale. The policy forbids forcing a language or locale without user opt-in or a clearly documented regional justification.

    Content

    No source excerpt is available for this finding.

    Natural-Language Policy Violations

    Medium
    Category
    Not specified by scanner
    Confidence
    98% confidence
    Finding

    The exported HTML explicitly sets lang="zh-CN", which forces a specific locale in generated output regardless of user preference. There is no visible option or documentation in this file allowing the user to choose another language or locale.

    Content

    No source excerpt is available for this finding.

    Natural-Language Policy Violations

    Medium
    Category
    Not specified by scanner
    Confidence
    94% confidence
    Finding

    The file's natural-language output and labels are overwhelmingly fixed in Chinese, and the HTML document explicitly sets lang="zh-CN". There is no indication that users can choose another language or that the Chinese-only behavior is a documented regional constraint, which may violate language/locale policy requirements.

    Content

    No source excerpt is available for this finding.

    Missing User Warnings

    Medium
    Category
    Not specified by scanner
    Confidence
    98% confidence
    Finding

    The HTML renderer inserts user-controlled resume fields directly into HTML elements and the document title without escaping special characters. If any field contains HTML or JavaScript, opening or embedding the generated resume can trigger stored XSS, allowing script execution in the viewer's browser or web app context.

    Content

    No source excerpt is available for this finding.

    Natural-Language Policy Violations

    Medium
    Category
    Not specified by scanner
    Confidence
    89% confidence
    Finding

    This Python test file uses Chinese-only natural-language strings in the module docstring, class docstrings, and test descriptions, with no indication that the skill is region-specific or that language is configurable. Under the stated policy, forcing a specific language without user opt-in 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
    78% confidence
    Finding

    The entire skill description, examples, templates, and usage context are presented only in Chinese, with no indication that users may choose another language or that the skill is intentionally restricted to a Chinese-language context. Under the policy, forcing a specific language without opt-in can be a natural-language policy concern.

    Content

    No source excerpt is available for this finding.

    Static analysis

    No suspicious patterns detected.