Back to skill

Security audit

Match jobs through resumes

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its resume-job-matching purpose, but it under-discloses privacy risk by saving full parsed resume text to a predictable local plaintext file.

Review this skill before installing if you will process real resumes. Run it only in a private working directory, avoid shared folders, delete resume_parsed_result.json after use, and consider redacting contact details before using web search or AI analysis. Verify and pin dependencies yourself if you install the optional parser/OCR packages.

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
scripts/resume_parser.py:89
Finding

Resume Personally Identifiable Information Stored in a Predictable Plaintext File

Content
View full analysis

Vulnerability Details

File Location: scripts/resume_parser.py, lines 89-102
Vulnerability Type: Predictable plaintext storage of sensitive resume data
Risk Level: Medium

Vulnerable Code

python
return {
    "raw_text": text,
    "file_type": file_ext,
    "file_path": file_path
}

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("用法: python resume_parser.py <简历文件路径>")
        sys.exit(1)

    result = parse_resume(sys.argv[1])
    # 输出到文件避免编码问题
    import json
    output_path = "resume_parsed_result.json"
    with open(output_path, "w", encoding="utf-8") as f:
        json.dump(result, f, ensure_ascii=False, indent=2)

Technical Analysis

The parser stores the complete extracted resume text and original source path in an unencrypted JSON file named resume_parsed_result.json in the current working directory. Resume content commonly includes sensitive personally identifiable information such as names, telephone numbers, email addresses, home addresses, employment history, and education records.

The output file has a fixed, predictable name. The code does not explicitly apply restrictive file permissions, verify that the destination is not a symbolic link, create the file atomically, or remove it after processing. Its effective permissions therefore depend on the process umask and surrounding filesystem configuration.

Opening the path with mode w also follows an existing symbolic link. In a shared or attacker-controlled working directory, another local user could pre-create resume_parsed_result.json as a symbolic link to a file writable by the victim. The parser would then truncate and replace that destination with JSON data.

Attack Path

  1. An attacker obtains read or write access to the directory from which the parser will be executed.
  2. For confidentiality loss, the attacker waits for the parser to create resume_parsed_result.json wit ...[truncated 1052 chars]
Remediation
View remediation

Remediation Suggestions

  1. Avoid persistent storage by default. Return the parsed result through standard output or keep it in memory when possible.
  2. Require callers to provide an explicit output destination instead of using a fixed filename in the current directory.
  3. Create output files atomically and with owner-only permissions, such as mode 0600.
  4. Refuse to write through symbolic links. Use secure creation flags such as O_CREAT | O_EXCL | O_NOFOLLOW where supported.
  5. If replacement is required, write to a securely created temporary file in the destination directory and atomically rename it.
  6. Omit file_path unless it is operationally necessary, or store only a sanitized filename.
  7. Add a documented retention policy and securely delete temporary parsing results when they are no longer required.
  8. Warn users that extracted resume data contains sensitive personal information and should not be placed in shared directories.

T08 · Insecure Dependencies

Note
Location
scripts/resume_parser.py:10
Finding

Unpinned Third-Party Package and OCR Installation Guidance

Content
View full analysis

Vulnerability Details

File Location: scripts/resume_parser.py, lines 10-12
Vulnerability Type: Unpinned third-party dependencies and externally hosted binary guidance
Risk Level: Low

Vulnerable Code

python
# 依赖安装说明:
# pip install pdfplumber python-docx pytesseract pillow python-magic-bin
# 安装Tesseract OCR引擎:https://github.com/UB-Mannheim/tesseract/wiki

Technical Analysis

The documented installation command retrieves multiple packages without pinning exact versions or requiring cryptographic hashes. Consequently, installations performed at different times may resolve to different dependency versions and transitive dependency sets. A compromised package release, malicious dependency update, or upstream account compromise could introduce attacker-controlled code during installation or subsequent imports.

The Windows OCR installation guidance also directs users to an externally hosted distribution page without specifying an approved release, checksum, signature, or repository-controlled integrity record. This prevents users from reliably verifying that the downloaded binary is the artifact reviewed by the project.

The listed python-magic-bin package is not imported by the audited parser, unnecessarily expanding the dependency and supply-chain attack surface.

Attack Path

  1. A user follows the dependency installation comments to enable resume parsing.
  2. pip resolves the latest available versions because no lockfile, exact versions, or hashes are supplied.
  3. An upstream package, transitive dependency, package-maintainer account, package index, or externally hosted OCR artifact is compromised.
  4. The user installs or imports the compromised component.
  5. Malicious package installation hooks, imported Python code, or the OCR executable runs with the privileges of the user performing the installation or invoking the parser.

This exploitation path depends on compromise or malicious m ...[truncated 718 chars]

Remediation
View remediation

Remediation Suggestions

  1. Add a reviewed dependency manifest and lockfile containing exact versions.
  2. Use a hash-verified requirements file and install with pip install --require-hashes -r requirements.txt.
  3. Pin all direct and transitive dependencies through a reproducible dependency-management process.
  4. Document a trusted package index and avoid uncontrolled fallback indexes.
  5. Identify an approved Tesseract release and publish its expected cryptographic checksum or signature-verification procedure.
  6. Prefer official operating-system package repositories or official signed project releases when available.
  7. Remove python-magic-bin from the installation instructions unless the project begins using it.
  8. Periodically scan and update locked dependencies through a controlled review and testing process.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • 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 (11)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

声明描述的是一个面向求职场景的智能分析助手,核心能力应包括接收简历文件并执行岗位匹配、企业背景调查和适配评估。而提供的代码片段只是在本地读取Markdown文件并生成PDF,属于报告导出/格式转换功能。虽然“评估报告导出”为求职助手的潜在辅助环节,但从该代码本身看,其主要目的与声明的核心功能明显不一致,且未体现声明中的关键能力。因此应判定为描述与实际行为不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

声明描述的是一个高层求职分析助手,核心能力应包括基于简历进行岗位匹配、企业信息调查和适配度评估。但提供的代码块只做输入文件存在性检查、按文件类型提取文本(PDF/Word/图片OCR),并输出原始解析结果到JSON文件。这属于简历解析的基础预处理功能,可能是上游支撑模块,但就该代码块本身而言,其实际行为与声明的主要用途存在明显差距。未发现额外敏感资源访问或隐藏外部通信,但主要功能与描述不一致,因此应判定为不匹配。

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill is designed to process highly sensitive resume data and then perform broad external searches and AI-assisted analysis, but it does not warn users that personal data may be transmitted to external services. This creates a meaningful privacy and compliance risk because resumes often contain names, phone numbers, emails, employment history, education, and other personally identifiable information.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

This markdown template is entirely written in Chinese and does not indicate that the user can choose another language or locale. Under the stated policy, forcing a specific language without user opt-in is a natural-language policy violation unless the locale restriction is explicitly documented and justified.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The file’s natural-language user-facing description is entirely in Chinese, and the CLI usage/output strings likewise assume Chinese-only interaction. There is no indication that the skill is region-specific or that users may choose another 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
89% confidence
Finding

The module docstring presents the skill purpose only in Chinese, and the rest of the user-facing strings follow the same pattern. This can violate language/locale policy when a skill forces a specific language without user opt-in or documented justification.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script writes parsed resume data, including potentially highly sensitive personal information, to a local JSON file by default. Resumes commonly contain PII such as names, phone numbers, email addresses, employment history, and education records, so persisting the full extracted text without explicit user consent or retention controls creates unnecessary privacy and data exposure risk.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The skill's natural-language interface and instructions are entirely presented in Chinese, and the description does not indicate that users may interact in other languages or that the Chinese-only constraint is intentional and justified. Under the policy, forcing a specific language without opt-in can be a locale/language policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
91% confidence
Finding

This markdown file contains user-facing natural-language content exclusively in Chinese, and it does not state that the skill is Chinese-only or offer any language/locale choice. Per the 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
87% confidence
Finding

The module docstring and all user-facing messages are written in Chinese, including errors and usage output, with no indication that another language is supported. 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.

Static analysis

No suspicious patterns detected.