Back to skill

Security audit

PDF 文档处理

Security checks for vulnerabilities and agentic risk

Overview

ClawScan rates this PDF processing skill suspicious with medium confidence because scanners report capabilities not disclosed in its description and other review concerns; this does not establish malicious intent.

Consider the suspicious Review verdict before installing. The main concerns are undisclosed PDF capabilities and unclear tool scope; dependency versions are also unresolved. Coverage is incomplete: Skillspector reports 15 of 16 components scanned and one analyzer degraded, so the evidence does not establish that the skill is safe.

Vulnerability Patterns
  • 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
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Vulnerability Patterns
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Output HandlingUnvalidated Output Injection, Cross-Context Output, Unbounded Output
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (10)

Description-Behavior Mismatch

High
Category
MCP Tool Poisoning
Confidence
89% confidence
Finding

The chunk focuses on PDF encryption and access-control management, which the description does not declare. These are distinct document-security capabilities rather than implementation details of the listed operations. No unrelated resource access or password bypass is shown.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
MCP Tool Poisoning
Confidence
88% confidence
Finding

The command performs image extraction rather than any of the specifically declared operations. Although it remains within the general domain of PDF processing, image extraction is a distinct, undeclared capability rather than an implementation detail of text or table extraction.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
MCP Tool Poisoning
Confidence
87% confidence
Finding

Merging and splitting match the description, and page rotation is ordinary supporting PDF manipulation. However, explicitly removing password protection is an additional security-relevant capability not disclosed in the declared purpose. The command uses a known password; it does not crack passwords or bypass authentication. Declared features absent from this code chunk are not themselves treated as mismatches.

Content

No source excerpt is available for this finding.

Skill declares no tool scope ('permissions' or 'allowed-tools') but code capabilities were detected: file_read, file_write, shell.

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.

The repair example replaces the original PDF without warning the user.

Medium
Category
Output Handling
Confidence
97% confidence
Finding

The troubleshooting example recommends --replace-input without explaining that it replaces the source document, so an agent could unexpectedly modify a user's original PDF. Qpdf normally preserves an original backup for this operation, reducing the risk of permanent loss, but the instruction still makes an avoidable integrity-changing action the default.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/pdf_forms_test.py (reported line 208)May include surrounding context.

python
data["form_fields"][0]["entry_bounding_box"] = [10, 10, 100, 50]
        path = self.json_file("invalid.json", data)
        script = Path(__file__).with_name("check_bounding_boxes.py")
        result = subprocess.run([sys.executable, str(script), str(path)], capture_output=True, text=True)
        self.assertEqual(result.returncode, 1)
        self.assertIn("intersection", result.stdout)

Unverifiable Dependency: pypdf has 119 known advisory(ies) (CVE-2026-84310 (pypdf: Possible long runtimes/large memory usage when retrieving outlines); CVE-2026-48156 (pypdf: Possible long runtimes for zero-only width values in cross-reference stre); CVE-2026-24688 (pypdf has possible Infinite Loop when processing outlines/bookmarks) +116 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
40% confidence
Finding

OSV returned advisories for this package, but its resolved version is unknown. A package-name lookup does not establish whether the installed release is affected by those advisories.

Content

No source excerpt is available for this finding.

Unverifiable Dependency: reportlab has 8 known advisory(ies) (CVE-2023-33733 (Reportlab vulnerable to remote code execution); CVE-2020-28463 (Server-side Request Forgery (SSRF) via img tags in reportlab); CVE-2019-19450 (ReportLab vulnerable to remote code execution via paraparser) +5 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
40% confidence
Finding

OSV returned advisories for this package, but its resolved version is unknown. A package-name lookup does not establish whether the installed release is affected by those advisories.

Content

No source excerpt is available for this finding.

Unverifiable Dependency: Pillow has 212 known advisory(ies) (CVE-2026-112390 (Pillow: Infinite loop in MIC n_frames when the embedded TIFF); CVE-2026-96638 (Pillow: BMP RLE decoder memory-amplification DoS via unbounded delta escape / ab); CVE-2026-112391 (Pillow: PdfParser can recurse without limit in get_value() and linearize_page_tr) +209 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
40% confidence
Finding

OSV returned advisories for this package, but its resolved version is unknown. A package-name lookup does not establish whether the installed release is affected by those advisories.

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 · scripts/pdf_forms_test.py (reported line 45)May include surrounding context.

python
def form(self, field_type="choice", **kwargs):
        path = self.root / "form.pdf"
        c = canvas.Canvas(str(path))
        getattr(c.acroForm, field_type)(name="field", x=30, y=600, **kwargs)
        c.showPage()
        c.save()
        return path