Back to skill

Security audit

GI Excel PDF Process

Security checks for vulnerabilities and agentic risk

Overview

This skill is a straightforward Excel/PDF file-processing helper with minor documentation and dependency hygiene issues, but no hidden, persistent, deceptive, or unrelated behavior was found.

Install this only in an environment appropriate for parsing untrusted documents, and prefer pinned or locked dependency versions. Review the broad trigger wording and Chinese-only help text if you need predictable routing or English-facing usage, but the inspected behavior fits normal Excel/PDF processing.

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
requirements.txt:1
Finding
Unbounded Third-Party Dependency Versions## Vulnerability Details **File Location**: `requirements.txt:1-3` **Additional Locations**: `SKILL.md:54`, `SKILL.md:82` **Vulnerability Type**: Unrestricted dependency resolution without version locking or integrity verification **Risk Level**: Low ### Vulnerable Code ```text pandas>=2.0.0 openpyxl>=3.0.0 pdfplumber>=0.10.0 ``` The installation instructions in `SKILL.md` also install dependencies without version or integrity controls: ```bash pip install pandas openpyxl ``` ```bash pip install pdfplumber ``` ### Technical Analysis Each dependency has only a minimum version constraint and no upper bound, exact pin, lockfile, or cryptographic hash. Consequently, package installation may resolve to any future version published under these package names. The listed packages are recognizable PyPI projects; no evidence of typosquatting, dependency confusion, or an actively malicious release was identified. The risk is nevertheless present at the supply-chain boundary because the installed code can differ from the versions covered by this audit. If a package publisher account, distribution infrastructure, or future release is compromised, installation or import of the resolved package could execute attacker-controlled code. ### Attack Path 1. An attacker compromises a dependency publisher account or the relevant package distribution process. 2. The attacker publishes a malicious release whose version satisfies the unrestricted minimum-version constraint. 3. A user follows the documented installation instructions or installs `requirements.txt`. 4. The package resolver selects the malicious release because no exact version or hash is required. 5. Attacker-controlled package code executes during installation or when the extraction scripts import the affected dependency. This path requires an external supply-chain compromise; the audited repository does not itself retrieve an untrusted custom pac ...[truncated 505 chars]
Remediation
## Remediation Suggestions 1. Pin each direct dependency to a reviewed exact version rather than using unrestricted minimum versions. 2. Generate and commit a reproducible lockfile that includes transitive dependencies. 3. Record cryptographic hashes and install with hash verification, such as: ```bash pip install --require-hashes -r requirements.txt ``` 4. Update `SKILL.md` so its installation commands reference the reviewed dependency manifest rather than installing unconstrained packages directly. 5. Perform dependency updates through a controlled review process that includes vulnerability scanning, changelog review, and testing. 6. Install and run the Skill in a least-privileged, isolated environment with restricted filesystem and network access.
Vulnerability Patterns
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • 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
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (11)

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding
The implemented code only supports Excel-to-CSV extraction/conversion from a specified sheet, with an optional row limit. This partially fits the Excel extraction portion of the description, but materially falls short of the broader declared purpose: there is no PDF handling, no table parsing beyond normal Excel sheet reading, no report generation, and no CSV input processing despite CSV being listed in the description. Therefore the description overstates the skill's capabilities relative to the supplied code.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding
The description claims a broader document-processing skill covering Excel, CSV, PDF, table parsing, data extraction, and report generation. The actual code only implements PDF text/table extraction. While PDF extraction and table parsing are consistent with part of the description, the code does not handle spreadsheet files or generate reports. This is a material scope mismatch between the declared purpose and the implemented behavior.

Vague Triggers

Medium
Confidence
91% confidence
Finding
The trigger description is broad enough to activate on generic mentions of spreadsheets, reports, or PDF extraction, which can cause the skill to be selected outside its intended narrow file-processing use case. Over-broad routing can expose file-handling workflows, dependencies, or automated processing steps in contexts where they are unnecessary or inappropriate, increasing the chance of unsafe data handling or prompt-scope confusion.

Natural-Language Policy Violations

Medium
Confidence
79% confidence
Finding
The instructional content is entirely in Chinese, and the skill does not state that language choice depends on user preference or that the tool is region-specific. This can create an implicit locale constraint without user opt-in, which matches the policy category for language or locale violations.

Vague Triggers

Medium
Confidence
88% confidence
Finding
The Chinese 'when to use' section uses ambiguous phrases like '表格', '报表', and '表单' without clear boundaries, which can match many ordinary conversations unrelated to file parsing. In an agent setting, ambiguous triggers can lead to incorrect tool or skill invocation, broadening the attack surface for unintended file operations or mishandling of sensitive user content.

Unpinned Dependencies

Low
Category
Supply Chain
Content
pandas>=2.0.0
openpyxl>=3.0.0
pdfplumber>=0.10.0
Confidence
96% confidence
Finding
The dependency is specified with a lower bound only, which allows installation of any newer release and prevents reproducible builds. This increases supply-chain risk because vulnerable or breaking versions could be resolved at install time without review, especially in a file-processing skill that handles untrusted documents.

Unverifiable Dependency: pandas has 1 known advisory(ies) (CVE-2020-13091 (** DISPUTED ** pandas through 1.0.3 can unserialize and execute commands from an)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
82% confidence
Finding
Because pandas is not pinned, it is impossible to verify from this manifest whether deployment will use a version affected by known advisories. Although the cited pandas issue is disputed and may not apply in many real deployments, the lack of version pinning still creates uncertainty and weakens assurance for a component used in file ingestion workflows.

Unpinned Dependencies

Low
Category
Supply Chain
Content
pandas>=2.0.0
openpyxl>=3.0.0
pdfplumber>=0.10.0
Confidence
96% confidence
Finding
The openpyxl requirement is unpinned, so different environments may install different versions with different security properties. For a skill that parses spreadsheet files from users, dependency drift raises risk because parser libraries are common targets for malicious file-triggered bugs.

Unverifiable Dependency: openpyxl has 2 known advisory(ies) (CVE-2017-5992 (Improper Restriction of XML External Entity Reference in Openpyxl); CVE-2017-5992 (Openpyxl 2.4.1 resolves external entities by default, which allows remote attack)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
90% confidence
Finding
The manifest does not pin openpyxl, so an affected version with known XML external entity issues could be installed without visibility. This is more dangerous in this skill's context because it processes spreadsheet files, and parser flaws in libraries handling untrusted office documents can be triggered by malicious inputs.

Unpinned Dependencies

Low
Category
Supply Chain
Content
pandas>=2.0.0
openpyxl>=3.0.0
pdfplumber>=0.10.0
Confidence
95% confidence
Finding
Using an unpinned pdfplumber version permits uncontrolled upgrades and non-reproducible installations. In a PDF-processing skill, that matters because document parsers operate on attacker-controlled input and should be kept to vetted versions only.

Natural-Language Policy Violations

Low
Confidence
95% confidence
Finding
The docstring, installation message, and CLI help strings are all written only in Chinese, which imposes a specific language on users without any opt-in or alternative locale support. The policy allows fixed locale behavior only when it is explicitly justified or when users are given a choice, neither of which appears here.

Static analysis

No suspicious patterns detected.