Back to skill

Security audit

DeckLingo for PPTX

Security checks for vulnerabilities and agentic risk

Overview

This PPTX translation skill is coherent, but it should go to Review because it can send deck text to Google Translate without a clear consent step and creates world-writable presentation files.

Review before installing on confidential decks. Use only if you are comfortable with selected PPTX text being sent to Google through deep-translator, run it in a private directory or isolated environment, avoid untrusted PPTX files, and consider pinning dependencies before use.

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 (4)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/translate_pptx_text.py:198
Finding

Unhardened XML and ZIP Processing of Untrusted PPTX Files

Content
View full analysis
list[str]: source_pattern = pattern_for(source_lang) found: Counter[str] = Counter() for name in iter_text_files(list(files), prefixes): root = etree.fromstring(files[name]) for paragraph in root.findall(".//a:p", namespaces=NS): text, _ = paragraph_text_nodes(paragraph) if text and matches_source_lang(text, source_lang) and not should_skip(text, skip_patterns): found[text] += 1 ``` The entire PPTX archive is also loaded into memory without limits: ```python with zipfile.ZipFile(temp_path, "r") as src: files = {name: src.read(name) for name in src.namelist()} ``` The scan-only implementation uses the same pattern: ```python with zipfile.ZipFile(path) as archive: for name in archive.namelist(): if not name.endswith(".xml") or not any(name.startswith(prefix) for prefix in prefixes): continue root = etree.fromstring(archive.read(name)) ``` ### Technical Analysis PPTX files are ZIP archives containing attacker-controlled XML. The scripts pass this XML directly to `lxml.etree.fromstring()` without constructing a hardened parser that explicitly disables DTD loading, external entity resolution, and network access. They also do not reject `DOCTYPE` declarations. In addition, ZIP entries are read without limits on: - Total uncompressed package size - Individual entry size - Number of entries - Compression ratio - XML depth, nod ...[truncated 1732 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/translate_pptx_text.py:189
Finding

Presentation Content Is Transmitted to an External Translation Service Without Explicit Consent

Content
View full analysis
GoogleTranslator: source = normalize_translator_lang(source_lang) target = normalize_translator_lang(target_lang) return GoogleTranslator(source=source, target=target) def translate_paragraphs( texts: list[str], translator: GoogleTranslator, glossary: dict[str, str], ) -> tuple[dict[str, str], int]: mapping: dict[str, str] = {} glossary_hits = 0 for text in texts: if text in glossary: mapping[text] = glossary[text] glossary_hits += 1 else: mapping[text] = translator.translate(text) return mapping, glossary_hits ``` The external backend is imported directly: ```python from deep_translator import GoogleTranslator ``` ### Technical Analysis The Skill extracts text from presentations and passes every selected non-glossary paragraph to `GoogleTranslator.translate()`. The affected data can include: - Slide text - Speaker notes - Layout text - Slide-master text - Personal names - Internal project information - Confidential business or technical material This network transmission is intrinsic to the implementation, but the user-facing documentation describes the package as supporting “local automation” and does not clearly state that presentation text is sent to Google through `deep-translator`. The workflow does not require an explicit network opt-in, provide a pre-transmission preview, or offer a bundled offline translation backend. Skip patterns only exclude explicitly matched text. They do not provide general secret detection, redaction, or data-loss prevention. ### Attack Path 1. A user supplies a confidential PPTX and requests translation. 2. The Skill extract ...[truncated 884 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/translate_pptx_text.py:259
Finding

World-Writable Output, Backup, and Temporary Presentation Files

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
requirements.txt:1
Finding

Unbounded Third-Party Dependency Versions Create Supply-Chain Exposure

Content
View full analysis
=5.0.0 deep-translator>=1.11.4 ``` The documented installation command is: ```bash pip install -r requirements.txt ``` ### Technical Analysis Both dependencies use lower-bound-only constraints. A fresh installation may therefore select any future version accepted by the resolver, including versions that were never reviewed or tested by the project. Transitive dependencies are likewise not locked or hash-verified. Python packages can execute code during installation and at runtime. This is particularly security-sensitive for this project because: - `lxml` processes attacker-controlled presentation XML. - `deep-translator` handles presentation text and controls outbound communication with the translation provider. - No lock file or package hashes establish the exact reviewed dependency set. - Builds performed at different times may install materially different code. No evidence was found that either named dependency is currently malicious or typosquatted. The confirmed weakness is the absence of reproducible, integrity-verified dependency resolution. ### Attack Path 1. A user follows the documented `pip install -r requirements.txt` command. 2. The resolver selects the newest versions satisfying the lower bounds, including transitive packages. 3. A future compromised, malicious, or unexpectedly incompatible release is selected automatically. 4. Package-controlled code executes during installation or when the translation scripts import and invoke the dependency. 5. Such code would run with the privileges of the user performing installation or translation and could access the files and network resources available to that user. ### Impact Assessment The potential scope equals the permissions of the account installing or running the Skill. A compromised dep ...[truncated 271 chars]
Remediation
View remediation
Vulnerability Patterns
  • 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 Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (12)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared purpose says the skill translates PowerPoint decks into Chinese, English, Japanese, and other languages while preserving layout and glossary consistency. The supplied code does something much narrower: it opens a PPTX as a ZIP archive, parses XML for slide-related text, filters paragraphs by likely source language, and outputs a JSON summary of matched text occurrences. While scanning notes/layouts/masters is relevant to presentation processing, the primary behavior is auditing/extracting text statistics, not localization. There is no translation engine, no glossary application, no PPTX rewriting, and no preservation/editability workflow implementation. Therefore the description materially overstates and misrepresents the actual behavior.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 12)May include surrounding context.

md
environments, and other agent runtimes that can execute local scripts and read `SKILL.md`.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding

The skill advertises and documents shell execution plus file read/write behavior, but it does not declare any explicit tool scope such as permissions or allowed-tools. In an agent runtime, that ambiguity can cause the skill to receive broader capabilities than intended, increasing the chance of unsafe file access or command execution when processing user-supplied paths and arguments.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill enables implicit invocation without defining any bounded trigger conditions, exclusions, or user-confirmation safeguards. That can cause the agent to automatically route presentation files or translation requests into this skill in situations the user did not clearly intend, increasing the risk of unintended data exposure or unauthorized processing of potentially sensitive deck contents.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The language-detection logic falls back to Chinese when no language is provided, and the CLI also defaults --source-lang to zh. This imposes a specific language/locale behavior by default rather than offering a neutral default or explicit user choice, which can violate language/locale policy expectations.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The CLI sets --source-lang default to zh, which means users who do not opt in are subject to a specific language assumption. This is a natural-language policy concern unless the tool is clearly documented as a China-specific workflow.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script sends slide text to Google Translate via deep_translator.GoogleTranslator, which means potentially sensitive presentation content leaves the local environment and is transmitted to a third-party service. In a PPTX localization skill, decks often contain confidential business, legal, or product information, so the lack of an explicit warning, consent step, or offline option creates a real data exposure risk.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
96% confidence
Finding

The dependency specifier lxml>=5.0.0 is unpinned, so builds may resolve to different versions over time, reducing reproducibility and making it harder to ensure that only vetted releases are installed. In a translation skill that processes user-supplied PPTX/XML content, relying on an uncontrolled parser version increases supply-chain and patch-management risk, even if it is not an immediate exploitable flaw by itself.

Content

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

text
lxml>=5.0.0
deep-translator>=1.11.4

Unverifiable Dependency: lxml has 14 known advisory(ies) (CVE-2021-43818 (lxml's HTML Cleaner allows crafted and SVG embedded scripts to pass through); CVE-2014-3146 (lxml Cross-site Scripting Via Control Characters); CVE-2021-28957 (lxml vulnerable to Cross-Site Scripting ) +11 more), 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

lxml has multiple historical advisories, but because the manifest does not pin an exact version, it is impossible to verify from this file whether the installed release is patched. Given this skill handles editable PowerPoint decks, which are ZIP/XML-based and can contain attacker-controlled content, uncertainty around the XML parsing library version is a real security concern.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
98% confidence
Finding

The dependency specifier deep-translator>=1.11.4 is unpinned, allowing installation of any later release, including potentially compromised or breaking versions. This is more concerning here because deep-translator has a prior supply-chain advisory, so leaving it open-ended increases the chance of pulling an unsafe package during installation or rebuilds.

Content

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

text
lxml>=5.0.0
deep-translator>=1.11.4

Unverifiable Dependency: deep-translator has 1 known advisory(ies) (PYSEC-2022-252 (The deep-translator project on PyPI was taken over via user account compromise v)), 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

deep-translator has a known supply-chain-related advisory, and the unpinned manifest prevents verification that the installed version avoids the affected release(s). Because this skill may automatically process sensitive deck text and send content through translation workflows, a compromised dependency could affect confidentiality or execution integrity.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
85% confidence
Finding

The ui_messages function returns Chinese only for zh* inputs and defaults every other locale to English. This imposes a specific language choice without explicit opt-in or documentation that English is the only supported non-Chinese UI language.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.