Back to skill

Security audit

GLM-V-Resume-Screen

Security checks for vulnerabilities and agentic risk

Overview

This resume-screening skill is coherent and purpose-aligned, but it sends resume contents to Zhipu's external API and should only be used when that is acceptable.

Before installing, confirm your organization allows resumes and screening criteria to be sent to Zhipu's API. Avoid uploading unnecessary personal data, store ZHIPU_API_KEY securely, prefer an isolated environment with pinned dependencies for PyMuPDF, and remember that saved Markdown/JSON outputs may contain sensitive applicant information.

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

T08 · Insecure Dependencies

Note
Location
SKILL.md:36
Finding
Unpinned Third-Party Dependency Installation<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:36` and `scripts/resume_screen.py:59-63` **Vulnerability Type**: Unpinned package installation and supply-chain exposure **Risk Level**: Low ### Vulnerable Code `SKILL.md:36`: ```markdown > **Local PDF:** Local PDF files are converted page-by-page into images (base64) before sending to the model. `PyMuPDF` is required (`pip install PyMuPDF`). URL files support full formats including pdf/docx/txt. ``` `scripts/resume_screen.py:59-63`: ```python if not HAS_PYMUPDF: raise RuntimeError( "PyMuPDF is required to process local PDF files. " "Install it with: pip install PyMuPDF" ) ``` ### Technical Analysis The documented installation command retrieves the latest package version selected by the Python package index at installation time. It does not pin a reviewed version or verify package hashes. Consequently, separate installations of the same Skill can receive different dependency code. The Skill does not install the dependency automatically, and no evidence shows that the legitimate `PyMuPDF` package is currently malicious. The issue is therefore a supply-chain hardening weakness rather than evidence of an active malicious payload. Exploitation depends on compromise of the package distribution channel, a malicious future release, or manipulation of the package index used in the user's environment. The flagged base64 and network behavior is not itself a confirmed vulnerability. Local PDF pages are intentionally converted to base64-encoded PNG data URLs and sent over HTTPS to the fixed Zhipu API endpoint for the declared cloud-based resume-screening operation. This behavior is disclosed in the Skill documentation and is functionally necessary when processing local PDFs. ### Attack Path 1. An attacker compromises the package publisher, package repository, or package-resolution path used by the victim. 2. The attacker makes a malicious version of `PyMuPDF` available under ...[truncated 965 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Add a dependency file that pins a reviewed `PyMuPDF` release: ```text PyMuPDF==<reviewed-version> ``` 2. Generate and publish cryptographic hashes for the approved distribution, then instruct users to install with hash verification: ```bash python -m pip install --require-hashes -r requirements.txt ``` 3. Keep the lock file and hashes under version control and update them only after reviewing new releases. 4. Recommend installation in an isolated virtual environment with the minimum filesystem and network permissions needed for resume processing. 5. Document the external data flow clearly: local resume pages and screening criteria are transmitted to Zhipu's API. Users should obtain candidate consent, avoid submitting unnecessary personal data, and apply applicable retention and privacy requirements. ]]>
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • System Prompt LeakageDirect Leakage, Indirect Extraction, Tool-Based Exfiltration
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (16)

Direct Prompt Extraction

High
Category
System Prompt Leakage
Content
> **Local PDF / 本地 PDF:** Local PDF files are converted page-by-page into images (base64) before sending to the model. `PyMuPDF` is required (`pip install PyMuPDF`). URL files support full formats including pdf/docx/txt.
> 本地 PDF 会自动逐页转为图片(base64)传给模型,需要安装 `PyMuPDF`(`pip install PyMuPDF`)。URL 文件支持 pdf/docx/txt 等全格式。

### 📋 Output Display Rules (MANDATORY)

After running the script, **you must display the complete screening result (Markdown table) exactly as returned**. Do not summarize, truncate, or only say "screening completed". Users need each candidate's detailed analysis to decide.
Confidence
91% confidence
Finding
The mandatory instruction to display the complete model-returned screening result exactly as returned removes an important safety layer against prompt-injection or malicious content embedded in resumes. Since resume text is untrusted input that may be echoed or transformed by the model, forcing verbatim display can expose harmful instructions, sensitive extracted data, or manipulative content directly to downstream users.

Lp3

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding
The skill declares capabilities that imply network access, environment-variable use, and file writing, but it does not explicitly scope or constrain those tools in the manifest. That creates an authorization ambiguity where an agent may invoke broader capabilities than the user expects, increasing the chance of unintended data exfiltration or filesystem side effects during resume processing.

Intent-Code Divergence

Medium
Confidence
89% confidence
Finding
The documentation inconsistently states that local PDF input is supported while other sections imply only URL input is allowed. In a resume-screening skill handling sensitive personal data, this confusion can cause operators to submit files through unintended paths and misunderstand what content is uploaded externally.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The skill processes resumes and explicitly notes that local PDF pages are converted to base64 images and sent to an external model service, yet it lacks a clear privacy warning or consent step. Because resumes contain highly sensitive personal and employment data, sending them off-platform without prominent disclosure materially increases privacy and compliance risk.

Whitespace Padding

Medium
Category
Prompt Injection
Content
## Resource Links

| Resource        | Link                                                                                                                              |
| --------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| **Get API Key** | [https://bigmodel.cn/usercenter/proj-mgmt/apikeys](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)                              |
| **API Docs**    | [Chat Completions / 对话补全](https://docs.bigmodel.cn/api-reference/%E6%A8%A1%E5%9E%8B-api/%E5%AF%B9%E8%AF%9D%E8%A1%A5%E5%85%A8) |
Confidence
70% confidence
Finding
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.

Session Persistence

Medium
Category
Rogue Agent
Content
This script reads the key from the `ZHIPU_API_KEY` environment variable and shares it with other Zhipu skills.
脚本通过 `ZHIPU_API_KEY` 环境变量获取密钥,与其他智谱技能共用同一个 key。

**Get Key / 获取 Key:** Visit [Zhipu Open Platform API Keys / 智谱开放平台 API Keys](https://bigmodel.cn/usercenter/proj-mgmt/apikeys) to create or copy your key.

**Setup options / 配置方式(任选一种):**
Confidence
77% confidence
Finding
This duplicate finding reflects the same underlying risk: persistent environment/config storage of a reusable API key shared among related skills. In a system that handles sensitive resumes and performs outbound network calls, broad key reuse increases the consequences of misuse or credential disclosure.

Session Persistence

Medium
Category
Rogue Agent
Content
This script reads the key from the `ZHIPU_API_KEY` environment variable and shares it with other Zhipu skills.
脚本通过 `ZHIPU_API_KEY` 环境变量获取密钥,与其他智谱技能共用同一个 key。

**Get Key / 获取 Key:** Visit [Zhipu Open Platform API Keys / 智谱开放平台 API Keys](https://bigmodel.cn/usercenter/proj-mgmt/apikeys) to create or copy your key.

**Setup options / 配置方式(任选一种):**
Confidence
77% confidence
Finding
This duplicate finding reflects the same underlying risk: persistent environment/config storage of a reusable API key shared among related skills. In a system that handles sensitive resumes and performs outbound network calls, broad key reuse increases the consequences of misuse or credential disclosure.

Intent-Code Divergence

Medium
Confidence
93% confidence
Finding
The CLI reference and error-handling guidance conflict with the earlier supported-input table, especially around local-path support. This inconsistency can mislead users into unsafe assumptions about what data sources are accepted and how the skill behaves when handling private resumes.

Natural-Language Policy Violations

Medium
Confidence
96% confidence
Finding
The default system and user prompts require Chinese output and use Chinese labels, and saved markdown headings are also in Chinese. This imposes a specific language/locale behavior without opt-in or configuration, which matches the language policy violation criteria.

Intent-Code Divergence

Medium
Confidence
96% confidence
Finding
The interface and docstring describe URL-only handling, but the implementation also accepts local PDFs and converts them into images for upload to the external GLM-V API. This mismatch can cause operators to unintentionally exfiltrate local resume contents they did not expect the tool to read and transmit.

Missing User Warnings

Medium
Confidence
97% confidence
Finding
The tool sends full resume contents and screening criteria to a third-party API without an explicit user-facing privacy warning or consent step. Because resumes commonly contain sensitive personal data, this creates a real confidentiality and compliance risk if users assume processing is local.

External Transmission

Medium
Category
Data Exfiltration
Content
}

    try:
        response = requests.post(
            API_BASE_URL, headers=headers, json=payload, timeout=180
        )
    except requests.exceptions.Timeout:
Confidence
96% confidence
Finding
This code performs external transmission of resume data to a remote API endpoint. In this skill context, the transmission is expected for functionality, but it is still security-relevant because highly sensitive applicant information leaves the local environment and may trigger privacy, confidentiality, or regulatory concerns.

Natural-Language Policy Violations

Low
Confidence
81% confidence
Finding
The usage examples and output format center on Chinese screening criteria and Chinese table headers/results, and the default system prompt description does not state that users may choose another language. Because the skill presents a specific language expectation without explicit opt-in or language-choice guidance, it may violate a language/locale policy requiring user choice.

Natural-Language Policy Violations

Low
Confidence
83% confidence
Finding
Several returned error messages mix English and Chinese, forcing a specific locale in user-visible text. Because the file provides no language selection or documented region-specific scope, this is a natural-language policy issue.

Description-Behavior Mismatch

Low
Confidence
84% confidence
Finding
The manifest describes reading resumes, comparing them to criteria, and outputting a Markdown table, which suggests an evaluation function rather than filesystem modification. In addition to printing results, the CLI can write Markdown or JSON output to a user-specified path, which is broader behavior than the manifest explicitly states.

Missing User Warnings

Low
Confidence
90% confidence
Finding
When --output is used, the tool writes screening results and criteria to disk, potentially storing personal or confidential hiring data in plaintext without warning. This can increase exposure on shared systems, backups, or developer workstations.

Static analysis

No suspicious patterns detected.