Back to skill

Security audit

data-parser-toolkit

Security checks for vulnerabilities and agentic risk

Overview

The skill is a mostly coherent data parser, but it can fetch arbitrary URLs and process archives without limits, so it needs review before installation.

Install only in an isolated environment and use it on trusted data. Avoid enabling URL parsing unless destinations are explicitly approved, and be careful with archive files and conversion/export paths because large archives can exhaust resources and output files may overwrite existing data.

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

Error
Location
data_parser.py:488
Finding

Unrestricted URL Retrieval Enables Server-Side Request Forgery

Content
View full analysis
str: """从URL读取内容""" try: import urllib.request with urllib.request.urlopen(url, timeout=timeout) as response: return response.read().decode('utf-8', errors='ignore') except Exception as e: self.warnings.append(f'URL读取失败: {url}') self._stats['errors'] += 1 raise def parse_from_url(self, url: str, timeout: int = 30): """直接从URL解析""" content = self.read_from_url(url, timeout) if url.endswith('.csv'): import io return pd.read_csv(io.StringIO(content)) elif url.endswith('.json'): return json.loads(content) return content ``` ### Technical Analysis `parse_from_url()` accepts a caller-controlled URL and forwards it directly to `urllib.request.urlopen()` without validating: - The URL scheme - The destination hostname or port - The resolved IP address - Whether the destination is loopback, private, link-local, or otherwise reserved - Redirect destinations - The response content length Consequently, a caller can instruct the process to connect to internal services that are inaccessible from the caller's own network position. Depending on supported URL handlers and the runtime environment, non-HTTP resources may also be reachable. A timeout only restricts how long the request may block; it does not restrict where the request can go or how much response data may be read. ### Attack Path 1. An attacker supplies a crafted URL to a service or agent workflow that exposes `parse_from_url()` or `read_from_url()`. 2. The URL points to a sensitive internal destination, such as: - A loopback administrative service - A private network host - A link-local cloud metadata endpo ...[truncated 1060 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
data_parser_enhanced.py:17
Finding

Unbounded Archive Decompression Enables Resource Exhaustion

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
requirements.txt:1
Finding

Unpinned Dependencies Create Non-Reproducible and Mutable Supply-Chain Resolution

Content
View full analysis
=2.0.0 ``` The installation documentation also recommends mutable package and repository installation: ```bash pip install pandas openpyxl chardet ``` ```bash pip install pandas openpyxl chardet pyarrow xlrd matplotlib ``` ```bash git clone https://github.com/XiLi/data-parser-toolkit.git cd data-parser-toolkit pip install -e . ``` ### Technical Analysis Four dependencies have no version constraint, and `xlrd>=2.0.0` permits any later release. No cryptographic hashes or lockfile are present. As a result, identical installation commands can resolve to different artifacts at different times. The documented Git installation also clones a mutable repository state without requiring a reviewed commit or release tag. Installing a package can execute build-system or installation logic, so compromise of a dependency, package registry account, or remote source can affect downstream installations. This finding does not establish that any currently named dependency is malicious. The vulnerability is the absence of controls that make dependency resolution reproducible and constrain installations to reviewed artifacts. ### Attack Path 1. A user or automated deployment runs the documented `pip install` command or installs from `requirements.txt`. 2. The package resolver selects the latest release satisfying the broad or absent constraints. 3. A future compromised, malicious, or incompatible release is selected automatically. 4. Package build or installation logic executes in the installation environment. 5. Malicious package code can subsequently execute when imported, or installation-time code can act with the privileges of the installer. For the Git installation path: 1 ...[truncated 839 chars]
Remediation
View remediation
openpyxl== chardet== pyarrow== xlrd== ``` 2. Generate and commit a lockfile that also records transitive dependencies. 3. Use cryptographic hashes and install with `pip --require-hashes`. 4. Rebuild pinned dependencies regularly after vulnerability and compatibility review rather than resolving unrestricted latest releases. 5. Use an approved internal package mirror or repository allowlist where practical. 6. Run dependency vulnerability scanning in continuous integration. 7. Install into an isolated virtual environment or container using a non-privileged account. 8. For Git-based installation, pin the source to a reviewed commit hash and verify provenance rather than cloning a mutable default branch. 9. Keep dependency declarations and README installation instructions synchronized so users do not bypass the pinned dependency set. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (23)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
80% confidence
Finding

The markdown includes examples for saving cleaned data, converting XLSX to CSV, batch folder conversion, and merging files, all of which can create or overwrite files, but no warning is given about output paths, overwrites, or backing up data. Under SQP-2 for markdown files, omissions around behaviors that could affect user data should be flagged.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The README advertises parsing directly from remote URLs and retry/fallback network behavior without warning that input may be fetched from external systems. In a skill environment, this can lead to unreviewed outbound requests, processing of attacker-controlled remote content, and possible SSRF-style misuse or accidental data transmission depending on how the implementation resolves URLs.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The README primarily describes a data parsing toolkit, but the OpenClaw/Claude Code section suddenly introduces unrelated workflow, charting, database, and Feishu modules. In an agent-skill context, this kind of scope expansion is dangerous because it can mislead users or orchestrators into importing broader-capability components than expected, increasing the attack surface and enabling unintended data access or external side effects.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

This is a markdown file, so SQP-2 applies to missing user warnings in the skill description. The README advertises "自动修复损坏文件" and "一键数据清洗" and the quick-start example writes a cleaned output file, but it does not warn users about possible data alteration, loss of original formatting, or the need to review outputs before use.

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 file contains user-facing instructions almost exclusively in Chinese, which effectively forces a specific language for use of the skill. The policy allows locale constraints only when they are explicitly justified or when the user is given a language/locale choice, neither of which is present here.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The top-level natural-language description is written in Chinese and presents the skill as a Chinese-language tool, with no indication that users can choose another language. Under the policy, forcing a specific language without user opt-in is a locale/language policy concern.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The module docstring claims support for both XLSX and XLS formats, and a dedicated parse_xls method exists. However, parse() sends both '.xlsx' and '.xls' inputs to parse_xlsx at L141-L142, while parse_xls is never used there, which contradicts the documented behavior for legacy XLS handling.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

This code performs filesystem writes via df.to_csv in xlsx_to_csv, creating or overwriting output content, but there is no confirmation prompt, visible user disclosure, or warning near the operation. The same pattern supports batch conversion behavior elsewhere, so users may not be explicitly alerted that new files will be created or replaced.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill is presented as a local data-file parser, but it also performs arbitrary network fetches via urlopen and parses remote content. This expands the trust boundary and can enable SSRF-like behavior, access to internal resources, unexpected data exfiltration paths, or parsing of attacker-controlled content in environments where the skill runs with network access.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The export_template function writes CSV or Excel files to the provided output_path, which can create or overwrite user files. The code contains no confirmation, warning message, or nearby documentation alerting users to this filesystem modification.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The convert_folder signature and docstring imply generic batch conversion controlled by output_format. In practice, it only processes .xlsx files and always calls xlsx_to_csv at L692, ignoring output_format except for the destination file extension, so the behavior contradicts the stated interface intent.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
72% confidence
Finding

The prominent natural-language documentation is presented in Chinese and does not indicate that other languages are supported or that the Chinese-only presentation is a justified regional constraint. SQP-3 covers language or locale policy violations when a specific language is effectively forced without user opt-in.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

SQP-3 applies to all file types and includes language or locale policy violations. This README is explicitly presented in Chinese, but it does not indicate that the language is optional, region-specific, or paired with an alternative language version for users who may not read Chinese.

Content

No source excerpt is available for this finding.

Dynamic attribute access via getattr()

Low
Category
Dangerous Code Execution
Confidence
50% confidence
Finding

Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.

Content

Scanner excerpt · data_parser.py (reported line 553)May include surrounding context.

python
last_error = None
        for method_name in fallbacks:
            try:
                method = getattr(self, method_name)
                return method(path)
            except Exception as e:
                last_error = e

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
92% confidence
Finding

This Python file contains user-facing natural-language content only in Chinese, including the module docstring and function docstrings such as "使用示例", "示例: 自动解析", and "示例: 数据清洗". The file does not indicate that Chinese is optional, configurable, or justified by a region-specific purpose, which can violate a language/locale policy requiring user choice.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
95% confidence
Finding

The dependency on pandas is unpinned, which makes builds non-reproducible and allows future installs to silently pull different versions, including potentially vulnerable or malicious releases if the supply chain is compromised. In a security-sensitive agent skill, this increases exposure because behavior and transitive dependency risk can change over time without review.

Content

Scanner excerpt · requirements.txt (reported line 1)May include surrounding context.

text
pandas
openpyxl
chardet
pyarrow

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
88% confidence
Finding

pandas has a known disputed advisory history, and because the manifest does not pin a version, it is impossible to determine whether installations are affected. Even when an advisory is disputed, the inability to verify deployed versions is a security weakness because vulnerable releases could still be selected in some environments.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
95% confidence
Finding

The openpyxl dependency is unpinned, so installations may resolve to different versions over time and undermine reproducibility and security review. Because this package processes spreadsheet files, an unexpected version with parser-related flaws could increase risk when handling untrusted input.

Content

Scanner excerpt · requirements.txt (reported line 2)May include surrounding context.

text
pandas
openpyxl
chardet
pyarrow
xlrd>=2.0.0

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
94% confidence
Finding

openpyxl has historical XXE-related advisories, and the unpinned requirement prevents verification that a safe version will be installed. Since this library parses spreadsheet/XML-derived content, unresolved version selection can materially increase risk if the skill ever opens untrusted files.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
92% confidence
Finding

The chardet dependency is unpinned, which creates supply-chain and reproducibility risk by allowing uncontrolled version drift across environments. While not directly indicating an exploit, it weakens dependency integrity and complicates assurance for the skill.

Content

Scanner excerpt · requirements.txt (reported line 3)May include surrounding context.

text
pandas
openpyxl
chardet
pyarrow
xlrd>=2.0.0

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
96% confidence
Finding

The pyarrow dependency is unpinned, allowing arbitrary future versions to be installed without explicit review. This is more concerning than a generic library because pyarrow has had multiple security advisories and commonly handles complex binary/data file formats, which can increase attack surface when the skill processes external data.

Content

Scanner excerpt · requirements.txt (reported line 4)May include surrounding context.

text
pandas
openpyxl
chardet
pyarrow
xlrd>=2.0.0

Unverifiable Dependency: pyarrow has 9 known advisory(ies) (CVE-2023-47248 (PyArrow: Arbitrary code execution when loading a malicious data file); CVE-2019-12408 (Missing Initialization of Resource in Apache Arrow); CVE-2019-12410 (Missing Initialization of Resource in Apache Arrow) +6 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
97% confidence
Finding

pyarrow has multiple known advisories, including code-execution risk when loading malicious data files, and the unpinned manifest makes it impossible to verify whether a safe release is used. In the context of a data-processing skill with file-handling libraries, this materially raises the attack surface if untrusted datasets are processed.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
50% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · requirements.txt (reported line 5)May include surrounding context.

text
openpyxl
chardet
pyarrow
xlrd>=2.0.0

Static analysis

No suspicious patterns detected.