Back to skill

Security audit

pptx

Security checks for vulnerabilities and agentic risk

Overview

This PowerPoint skill largely matches its stated purpose, but it uses risky local conversion code and dependency practices that should be reviewed before installation.

Install only if you are comfortable with a skill that runs local Office conversion tools, mutates unpacked presentation files, and installs JavaScript dependencies. Use it on copies of decks, avoid untrusted Office files until archive limits are added, and prefer pinned local dependency installation. The LD_PRELOAD shim should be removed or redesigned before use in a shared or sensitive environment.

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
scripts/office/soffice.py:53
Finding

Predictable LD_PRELOAD Library Enables Local Code Execution

Content
View full analysis
dict: env = os.environ.copy() if platform.system() == "Linux": env["SAL_USE_VCLPLUGIN"] = "svp" if _needs_shim(): shim = _ensure_shim() env["LD_PRELOAD"] = str(shim) return env _SHIM_SO = Path(tempfile.gettempdir()) / "lo_socket_shim.so" def _needs_shim() -> bool: # AF_UNIX / LD_PRELOAD shim is Linux-only; skip on Windows and macOS if not hasattr(socket, "AF_UNIX"): return False try: s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) s.close() return False except OSError: return True def _ensure_shim() -> Path: if _SHIM_SO.exists(): return _SHIM_SO src = Path(tempfile.gettempdir()) / "lo_socket_shim.c" src.write_text(_SHIM_SOURCE) subprocess.run( ["gcc", "-shared", "-fPIC", "-o", str(_SHIM_SO), str(src), "-ldl"], check=True, capture_output=True, ) src.unlink() return _SHIM_SO ``` ### Technical Analysis The code stores a native shared library at the fixed, predictable path `/tmp/lo_socket_shim.so`. When that path already exists, `_ensure_shim()` returns it without verifying: - File ownership - File type - Whether it is a symbolic link - File permissions - Integrity or cryptographic hash - Whether it was generated from the embedded source - Whether another process replaced it between validation and use The returned file is subsequently assigned to `LD_PRELOAD` and loaded into the LibreOffice process. Native shared libraries can define constructor functions that execute immediately when the process starts. Therefore, trusting an existing library at a shared temporary path creates a direct arbitrary-code-execution primiti ...[truncated 1812 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
package-lock.json:14
Finding

Unsafe Dependency Sources and Unpinned Global Package Installation

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/office/unpack.py:46
Finding

Unbounded Office Archive Extraction Enables Resource-Exhaustion Attacks

Content
View full analysis
tuple[None, str]: input_path = Path(input_file) output_path = Path(output_directory) suffix = input_path.suffix.lower() if not input_path.exists(): return None, f"Error: {input_file} does not exist" if suffix not in {".docx", ".pptx", ".xlsx"}: return None, f"Error: {input_file} must be a .docx, .pptx, or .xlsx file" try: output_path.mkdir(parents=True, exist_ok=True) with zipfile.ZipFile(input_path, "r") as zf: zf.extractall(output_path) xml_files = list(output_path.rglob("*.xml")) + list(output_path.rglob("*.rels")) for xml_file in xml_files: _pretty_print_xml(xml_file) ``` Validation repeats the unrestricted extraction: ```python if path.is_file() and path.suffix.lower() in [".docx", ".pptx", ".xlsx"]: temp_dir = tempfile.mkdtemp() with zipfile.ZipFile(path, "r") as zf: zf.extractall(temp_dir) unpacked_dir = Path(temp_dir) ``` Redlining validation also extracts an original document without resource limits: ```python with tempfile.TemporaryDirectory() as temp_dir: temp_path = Path(temp_dir) try: with zipfile.ZipFile(self.original_docx, "r") as zip_ref: zip_ref.extractall(temp_path) ``` ### Technical Analysis DOCX, PPTX, and XLSX files are ZIP containers. Checking only the filename extension does not establish that an ...[truncated 2323 chars]
Remediation
View remediation
None: entries = zf.infolist() if len(entries) > MAX_ENTRIES: raise ValueError("Archive contains too many entries") total_size = 0 for info in entries: if info.file_size > MAX_ENTRY_SIZE: raise ValueError(f"Archive member is too large: {info.filename}") total_size += info.file_size if total_size > MAX_TOTAL_SIZE: raise ValueError("Archive expands beyond the allowed total size") if info.file_size and info.compress_size == 0: raise ValueError(f"Invalid compression metadata: {info.filename}") if info.compress_size: ratio = info.file_size / info.compress_size if ratio > MAX_RATIO: raise ValueError(f"Suspicious compression ratio: {info.filename}") with zipfile.ZipFile(input_path, "r") as zf: valid ...[truncated 206 chars]
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
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
Findings (47)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

A mismatch between broad PPTX promises and a narrower thumbnail-generation or limited utility implementation is still a security-relevant trust issue, though lower impact than code-execution findings. It can cause over-invocation and unnecessary exposure of local files to conversion or extraction steps when a simpler, safer path would suffice.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

A mismatch between broad PPTX promises and a narrower thumbnail-generation or limited utility implementation is still a security-relevant trust issue, though lower impact than code-execution findings. It can cause over-invocation and unnecessary exposure of local files to conversion or extraction steps when a simpler, safer path would suffice.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

A mismatch between broad PPTX promises and a narrower thumbnail-generation or limited utility implementation is still a security-relevant trust issue, though lower impact than code-execution findings. It can cause over-invocation and unnecessary exposure of local files to conversion or extraction steps when a simpler, safer path would suffice.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

A mismatch between broad PPTX promises and a narrower thumbnail-generation or limited utility implementation is still a security-relevant trust issue, though lower impact than code-execution findings. It can cause over-invocation and unnecessary exposure of local files to conversion or extraction steps when a simpler, safer path would suffice.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

A mismatch between broad PPTX promises and a narrower thumbnail-generation or limited utility implementation is still a security-relevant trust issue, though lower impact than code-execution findings. It can cause over-invocation and unnecessary exposure of local files to conversion or extraction steps when a simpler, safer path would suffice.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

A mismatch between broad PPTX promises and a narrower thumbnail-generation or limited utility implementation is still a security-relevant trust issue, though lower impact than code-execution findings. It can cause over-invocation and unnecessary exposure of local files to conversion or extraction steps when a simpler, safer path would suffice.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

A mismatch between broad PPTX promises and a narrower thumbnail-generation or limited utility implementation is still a security-relevant trust issue, though lower impact than code-execution findings. It can cause over-invocation and unnecessary exposure of local files to conversion or extraction steps when a simpler, safer path would suffice.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
87% confidence
Finding

A mismatch between broad PPTX promises and a narrower thumbnail-generation or limited utility implementation is still a security-relevant trust issue, though lower impact than code-execution findings. It can cause over-invocation and unnecessary exposure of local files to conversion or extraction steps when a simpler, safer path would suffice.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

A mismatch between broad PPTX promises and a narrower thumbnail-generation or limited utility implementation is still a security-relevant trust issue, though lower impact than code-execution findings. It can cause over-invocation and unnecessary exposure of local files to conversion or extraction steps when a simpler, safer path would suffice.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

A mismatch between broad PPTX promises and a narrower thumbnail-generation or limited utility implementation is still a security-relevant trust issue, though lower impact than code-execution findings. It can cause over-invocation and unnecessary exposure of local files to conversion or extraction steps when a simpler, safer path would suffice.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

A mismatch between broad PPTX promises and a narrower thumbnail-generation or limited utility implementation is still a security-relevant trust issue, though lower impact than code-execution findings. It can cause over-invocation and unnecessary exposure of local files to conversion or extraction steps when a simpler, safer path would suffice.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

A mismatch between broad PPTX promises and a narrower thumbnail-generation or limited utility implementation is still a security-relevant trust issue, though lower impact than code-execution findings. It can cause over-invocation and unnecessary exposure of local files to conversion or extraction steps when a simpler, safer path would suffice.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

A mismatch between broad PPTX promises and a narrower thumbnail-generation or limited utility implementation is still a security-relevant trust issue, though lower impact than code-execution findings. It can cause over-invocation and unnecessary exposure of local files to conversion or extraction steps when a simpler, safer path would suffice.

Content

No source excerpt is available for this finding.

Vague Triggers

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The trigger text is excessively broad, matching common words like 'deck,' 'slides,' and 'presentation' regardless of actual intent. In an agentic environment, that can cause frequent unsolicited activation, unnecessary file access, and invocation of shell-backed document tooling in conversations that only mention presentations abstractly.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: image-size==1.2.1 — 2 advisory(ies): CVE-2025-71329 (image-size: JXL and HEIF parsers allow denial of service through infinite loops); CVE-2025-71330 (image-size: ICNS parser allows denial of service through an infinite loop)

High
Category
Supply Chain
Confidence
97% confidence
Finding

The project depends on image-size 1.2.1, which is flagged with denial-of-service advisories involving infinite loops in JXL, HEIF, and ICNS parsing. In a PPTX skill, user-supplied images are a plausible input path, so processing a crafted image while building or reading presentations could hang the process and disrupt service.

Content

No source excerpt is available for this finding.

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · scripts/office/soffice.py (reported line 56)May include surrounding context.

python
def get_soffice_env() -> dict:
    env = os.environ.copy()
    if platform.system() == "Linux":
        env["SAL_USE_VCLPLUGIN"] = "svp"

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

This code conditionally sets LD_PRELOAD to inject a custom shared library into a child process, and it builds that library on demand from source. LD_PRELOAD-based code injection is a highly privileged execution mechanism far beyond normal PPTX handling, and in the skill context it materially increases the attack surface by enabling arbitrary native code to run inside spawned processes.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The manifest describes a skill for handling PowerPoint .pptx files, but this file is explicitly a validator for Word document XML and implements DOCX-specific logic such as WordprocessingML namespaces, comment markers, paragraph counting, and durableId repair. That is a semantic mismatch between the skill's claimed scope and the actual behavior implemented here.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The skill declares no explicit tool scope even though its instructions direct use of shell commands, file reads/writes, and environment-dependent tooling. This increases the blast radius if the skill is auto-invoked or misused, because an agent may assume broad authority to execute external programs against local files without a least-privilege boundary.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

This markdown file documents clean.py as removing slides not in <p:sldIdLst>, unreferenced media, and orphaned relationships, which is a destructive operation affecting presentation contents. While the behavior is described, there is no clear cautionary warning to the user to verify backups or confirm that cleanup may permanently delete content.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

The manifest describes a skill for creating, reading, editing, and otherwise handling .pptx files. Declaring a direct dependency on Playwright introduces a general browser automation capability, which is not an obvious or necessary requirement for local PPTX manipulation and expands the skill's operational capability beyond its stated purpose.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This code writes new slide and relationship XML files directly into the user-supplied unpacked directory, and later functions also modify existing PPTX metadata files. While the module docstring explains functionality, it does not clearly warn that running the script will mutate the target presentation contents on disk without confirmation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

This code performs a file write that overwrites word/document.xml in place, which can materially modify user document data. Although the module docstring explains the transformation, there is no confirmation prompt, user-facing log/print, or inline warning near the write operation itself to disclose that the file is being rewritten.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
82% confidence
Finding

The manifest frames the skill as handling .pptx files, but this helper's core behavior is subprocess execution of external binaries, including a compiler. While invoking LibreOffice itself may support document handling, invoking gcc to build native code is a separate capability not justified by the skill's user-facing purpose.

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/office/soffice.py (reported line 69)May include surrounding context.

python
def run_soffice(args: list[str], **kwargs) -> subprocess.CompletedProcess:
    env = get_soffice_env()
    return subprocess.run([get_soffice_cmd()] + args, env=env, **kwargs)

Static analysis

No suspicious patterns detected.