Back to skill

Security audit

QC Data Processor

Security checks for vulnerabilities and agentic risk

Overview

This QC spreadsheet analysis skill appears purpose-built rather than malicious, but it needs review because its MCP tools can read any CSV or Excel path the server process can access without path scoping.

Install only if you trust the MCP clients that can call it and run it with filesystem access limited to the intended QC data directory. Avoid pointing it at broad home, shared-drive, customer, finance, or HR spreadsheet locations unless those contents are authorized for analysis, and prefer pinned dependencies or a reviewed lockfile before production use.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
Findings (2)

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
tools/parse_data.py:13
Finding

Unrestricted Local Spreadsheet Access Through Caller-Controlled Paths

Content
View full analysis
pd.DataFrame: if not os.path.exists(file_path): raise FileNotFoundError(f"File not found: {file_path}") ext = os.path.splitext(file_path)[1].lower() try: if ext == ".csv": return pd.read_csv(file_path) elif ext in (".xlsx", ".xls"): return pd.read_excel(file_path) else: raise ValueError(f"Unsupported file format: {ext}") except Exception as e: raise ValueError(f"Failed to read {file_path}: {e}") ``` `tools/spc_analyze.py:276-282`: ```python file_path = data_schema.get("_file_path") if file_path: df = pd.read_csv(file_path) if file_path.endswith(".csv") else pd.read_excel(file_path) else: return {"error": "Cannot access original data file. Provide _file_path in data_schema."} values = pd.to_numeric(df[column], errors="coerce").dropna().values ``` `tools/reliability_analyze.py:239-246`: ```python def qc_reliability_analyze(data_schema: dict, time_column: str, censor_column: str, distribution: str = "auto") -> dict: file_path = data_schema.get("_file_path") if not file_path: return {"error": "Cannot access original data file. Provide _file_path in data_schema."} df = pd.read_csv(file_path) if file_path.endswith(".csv") else pd.read_excel(file_path) ``` ### Technical Analysis The MCP interface accepts caller-controlled filesystem paths without canonicalization, directory confinement, authorization checks, or an approved-file registry. The parser only verifies that the path exists and has a supported extension. The downstrea ...[truncated 2637 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
requirements.txt:1
Finding

Unbounded and Unhashed Third-Party Dependency Resolution

Content
View full analysis
=1.0.0 pandas>=2.0.0 openpyxl>=3.0.0 numpy>=1.24.0 scipy>=1.10.0 reliability>=0.8.0 ``` ### Technical Analysis Every dependency is specified using only an open-ended minimum version. There are no exact version pins, upper bounds, lock file entries, package hashes, or source constraints. As a result, two installations performed at different times can retrieve materially different package versions. A future compromised, malicious, or unexpectedly incompatible release satisfying the lower-bound constraint could be selected automatically. The `reliability` package is declared even though the audited implementation performs its reliability calculations using NumPy and SciPy and does not import that package in the reviewed source. An unnecessary dependency increases the installation and supply-chain attack surface without providing an observed runtime benefit. No evidence was found that the currently named packages are malicious. This finding concerns the unsafe dependency-resolution policy and the exposure it creates during future installation or updates. ### Attack Path 1. A user or deployment system installs the project using `pip install -r requirements.txt`. 2. The package resolver queries its configured package index. 3. It selects the newest available versions satisfying the broad lower bounds. 4. A compromised future release, compromised package-index response, or otherwise unreviewed package version is downloaded. 5. Without expected hashes, the installation process has no project-level integrity check against a reviewed artifact set. 6. Malicious package installation logic or imported package code executes with the privileges of the installing or server process. This attack path depends on a dependency or package-distribution chann ...[truncated 729 chars]
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • 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
Findings (21)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The skill advertises analysis functionality but also relies on local file access via _file_path without clearly declaring that behavior or the associated data-handling risks. This can lead to unintended processing of local sensitive manufacturing or customer data and creates a trust gap between documented scope and actual operational behavior.

Content

No source excerpt is available for this finding.

Anti-Refusal Statement

High
Category
Anti-Refusal
Confidence
80% confidence
Finding

Skill instructs the agent to omit warnings, disclaimers, or ethical commentary. Stripping safety caveats hides risk from the user and is a common jailbreak preamble.

Content

Scanner excerpt · tests/test_reliability.py (reported line 59)May include surrounding context.

python
def test_small_sample_warning():
    schema = qc_parse_data(DATA_PATH)
    result = qc_reliability_analyze(schema, "time", "censor")
    # 30 samples, no warning expected
    assert result.get("warning") is None

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The trigger list includes broad terms like '日报', '周报', '客诉', and 'QC', which may cause the skill to activate in contexts where the user did not intend manufacturing data processing. Over-broad invocation increases the chance that unrelated or sensitive files are routed to this skill and processed unnecessarily.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The trigger list includes broad, common terms such as '日报', '周报', '客诉', and 'QC', which can cause the skill to be invoked for loosely related conversations rather than explicit requests for SPC or reliability analysis. In a file-processing skill that accepts CSV/Excel paths, overbroad invocation increases the chance of unintended data handling or the agent selecting this skill when a narrower, safer action was intended.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The function returns user-facing interpretation text only in Chinese for Weibull results, which enforces a specific language/locale in natural-language output. The file provides no option for user language selection or documented justification for a Chinese-only locale.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

This returned interpretation string is natural-language output presented only in Chinese. Because the file does not offer any locale choice or explicit region-specific justification, it violates the language/locale policy criteria.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The daily, weekly, 8D, and reliability renderers hard-code Chinese headings and narrative text, which enforces a specific language for generated reports. This is a natural-language policy concern because the file provides no mechanism for the user to choose language or explicitly opt into Chinese output.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

This code emits multiple natural-language rule descriptions such as '单点超出3σ控制限' and '连续9点中心线同侧' directly in returned alarm objects. Because the file provides no user opt-in, localization setting, or justification that the skill is China/Chinese-specific, it forces a specific language on downstream users and violates the language/locale policy criterion.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The skill processes uploaded/local CSV and Excel files that may contain proprietary manufacturing metrics, customer names, or failure data, but it does not warn users about that sensitivity. Lack of disclosure can lead to accidental exposure or inappropriate handling of confidential operational data.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
95% confidence
Finding

The dependency is specified with a lower bound only, which allows installation of any newer release, including versions with breaking changes or newly introduced vulnerabilities. For a server-side MCP component, this weakens supply-chain control and makes builds non-reproducible, so security posture cannot be reliably validated over time.

Content

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

text
mcp>=1.0.0
pandas>=2.0.0
openpyxl>=3.0.0
numpy>=1.24.0

Unverifiable Dependency: mcp has 12 known advisory(ies) (CVE-2025-53366 (MCP Python SDK vulnerability in the FastMCP Server causes validation error, lead); CVE-2025-66416 (Model Context Protocol (MCP) Python SDK does not enable DNS rebinding protection); CVE-2026-52870 (MCP Python SDK: Experimental task handlers allow any client to access and cancel) +9 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

The mcp package has known advisories, and because the manifest does not pin a version, it is impossible to determine whether deployments will install an affected release. This is more concerning than typical library drift because mcp is central to the server functionality and may expose network-facing attack surface directly.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
95% confidence
Finding

Using an unpinned pandas version permits arbitrary later releases to be installed, which can introduce vulnerable or incompatible code paths without notice. In a data-processing skill that likely ingests external files, dependency drift increases the risk of unexpected exposure through parser or deserialization issues.

Content

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

text
mcp>=1.0.0
pandas>=2.0.0
openpyxl>=3.0.0
numpy>=1.24.0
scipy>=1.10.0

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

Pandas has at least one advisory and the lack of an exact version means the installed release cannot be verified as safe. In this QC data-processing context, pandas is likely used on externally supplied datasets, so version uncertainty adds avoidable supply-chain and parser-safety risk.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
96% confidence
Finding

The openpyxl dependency is unpinned, so deployments may resolve to different versions with different security characteristics. Since this skill likely processes Excel files, parser-library version drift is more relevant than usual because file parsing libraries have historically had XML and content-handling issues.

Content

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

text
mcp>=1.0.0
pandas>=2.0.0
openpyxl>=3.0.0
numpy>=1.24.0
scipy>=1.10.0
reliability>=0.8.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
92% confidence
Finding

Openpyxl has historical XML-related advisories, and the unpinned requirement prevents verification that a safe version will be installed. Because this skill likely opens Excel workbooks from users or other systems, uncertainty around the spreadsheet parser increases the risk from maliciously crafted files.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
93% confidence
Finding

An unpinned numpy version creates non-reproducible builds and can silently introduce vulnerable or unstable releases into the environment. While numpy is often lower-risk than network-facing packages, it remains part of the trusted execution base and should be controlled in production workflows.

Content

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

text
mcp>=1.0.0
pandas>=2.0.0
openpyxl>=3.0.0
numpy>=1.24.0
scipy>=1.10.0
reliability>=0.8.0

Unverifiable Dependency: numpy has 16 known advisory(ies) (CVE-2014-1859 (Numpy arbitrary file write via symlink attack); CVE-2021-41495 (NumPy NULL Pointer Dereference); CVE-2021-33430 (NumPy Buffer Overflow (Disputed)) +13 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
80% confidence
Finding

Numpy has multiple historical advisories, and without version pinning there is no assurance that deployed environments avoid affected releases. Although the direct exploitability may be context-dependent, unverifiable core scientific dependencies still represent a real supply-chain hygiene weakness.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
93% confidence
Finding

Specifying scipy with only a minimum version allows unreviewed future releases to be installed, undermining reproducibility and making security review unverifiable. Because scipy may be used for reliability and statistical analysis here, compromised or buggy versions could affect both integrity and stability of the service.

Content

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

text
pandas>=2.0.0
openpyxl>=3.0.0
numpy>=1.24.0
scipy>=1.10.0
reliability>=0.8.0

Unverifiable Dependency: scipy has 4 known advisory(ies) (CVE-2013-4251 (SciPy creates insecure temporary directories); CVE-2013-4251 (The scipy.weave component in SciPy before 0.12.1 creates insecure temporary dire); CVE-2023-25399 (A refcounting issue which leads to potential memory leak was discovered in scipy) +1 more), 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

Scipy has known advisories, and the manifest does not allow verification that the installed version is outside vulnerable ranges. In a server performing statistical computations, this primarily affects supply-chain trust and service stability rather than obviously direct remote compromise, but it remains a valid weakness.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
88% confidence
Finding

The reliability package is also unpinned, which permits uncontrolled dependency drift. Even if no specific advisory is cited here, unpinned third-party packages still expand supply-chain risk and make incident triage harder because the deployed version is not guaranteed.

Content

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

text
openpyxl>=3.0.0
numpy>=1.24.0
scipy>=1.10.0
reliability>=0.8.0

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
85% confidence
Finding

The skill explicitly processes uploaded Excel/CSV quality data, which may contain sensitive manufacturing metrics, customer identifiers, or complaint information, but it provides no warning or handling guidance for sensitive data. This omission can lead users to submit confidential files without understanding privacy, retention, or minimization expectations.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.