Back to skill

Security audit

sn-ppt-workbench

Security checks for vulnerabilities and agentic risk

Overview

This is a real PPT workbench, but it can expose an unauthenticated editing server on the network and use local credentials, so it needs review before installation.

Install only if you are comfortable running a local PPT editor server with write access to the selected deck and optional agent/API credentials. Keep it bound to 127.0.0.1, avoid shared networks or 0.0.0.0 unless protected by an authenticated tunnel, replace the documented ppt-editor-dev key with a unique secret, and review/rotate any Hermes or provider keys used with this version.

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

T05 · Unauthorized Access and Privilege Escalation

Error
Location
workbench-runtime/dist-server/index.mjs:38440
Finding

Unauthenticated Network-Exposed Workbench API Permits Privileged Operations

Content
View full analysis
str: if args.host.strip(): return args.host.strip() env_host = _clean_env("WORKBENCH_HOST") if env_host: return env_host # Forwarding/canvas URLs usually proxy from localhost. Without one, expose # all interfaces only in container-like environments where localhost points # at the wrong network namespace for the user. if public_url: return "127.0.0.1" return "0.0.0.0" if _looks_like_docker_or_wsl() else "127.0.0.1" ``` The server initializes its routes without an authentication or authorization middleware: ```js var app = (0, import_express.default)(); var port = Number.parseInt(process.env.PORT ?? "8787", 10); var host = process.env.HOST ?? process.env.WORKBENCH_HOST ?? "127.0.0.1"; var server = null; var shutdownScheduled = false; app.use(import_express.default.json({ limit: "50mb" })); ``` An unauthenticated caller can terminate the service: ```js app.post("/api/workbench/shutdown", (_request, response) => { const payload = { ok: true, pid: process.pid, message: shutdownScheduled ? "Workbench server shutdown is already scheduled." : "Workbench server is shutting down." }; response.once("finish", scheduleShutdown); response.json(payload); }); ``` The same unauthenticated API can send messages through the configured credentialed agent bridge: ```js app.post("/api/chat/send", async (request, response, next) => { try { const message = requireString(request.body?.message, "message"); const result = await sendWorkbenchChat(message, request.body?.context); response ...[truncated 5895 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/open_workbench.py:382
Finding

Gateway and Agent API Keys Are Passed Through Process Command-Line Arguments

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
references/gateway-auth.md:28
Finding

Predictable Development Credential Is Recommended and Used as an Authentication Fallback

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (45)

Tp2

High
Category
MCP Tool Poisoning
Confidence
85% confidence
Finding

Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.

Content

No source excerpt is available for this finding.

Tp2

High
Category
MCP Tool Poisoning
Confidence
85% confidence
Finding

Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.

Content

No source excerpt is available for this finding.

Tp2

High
Category
MCP Tool Poisoning
Confidence
85% confidence
Finding

Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description is about opening an existing PPT deck in a WebUI/workbench, including deck discovery behavior and explicitly not regenerating slides. The supplied code does none of that. Instead, it implements a markdown viewer component with markdown-it parsing, entity decoding, link/image handling, syntax fence rendering, Mermaid support, citation interactions, and asynchronous loading of markdown content. There is no logic for detecting ppt_decks, opening SenseNova HTML slides, launching a PPT editor/workbench, or managing deck_dir selection. This is a materially different primary purpose, so the description does not accurately represent the code chunk.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

This code chunk does not implement the declared skill behavior. The description claims a focused action: opening an existing/generated PPT deck in a WebUI/workbench, with deck directory selection and local deck auto-detection while avoiding regeneration steps. However, the provided code is a generic compiled frontend runtime bundle. It contains React DOM internals, event dispatch, hydration, stylesheet/script preloading, and React Router history/path matching/navigation logic. Those are infrastructure details for a web app, not the skill logic that identifies decks or opens a specific PPT workbench for existing SenseNova HTML slides. While such runtime code could support a PPT workbench application, this chunk itself does not demonstrate the declared primary purpose or the specific capabilities described.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The declared description frames the skill narrowly as opening an existing PPT deck in the WebUI without running generation-related steps. However, the supplied code chunk is not just a thin launcher/open action. It is a substantial WebUI frontend bundle containing many additional capabilities: APIs for reading deck metadata/files, querying session/runtime, stopping the server, monitoring workbench progress, fetching and posting style selections, opening workspaces, sending chat requests, and streaming audit/analysis results. The embedded UI strings also describe interactive editing, AI-assisted analysis, export/download actions, and generation-progress views. While some of this may support the broader workbench experience, these are materially broader capabilities than the declared purpose of simply opening an existing deck for preview/editing. Therefore the description does not accurately represent what this code chunk actually does.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
90% confidence
Finding

The declared description is narrowly about opening an already-generated PPT deck in a WebUI without performing generation or export. However, this code chunk exposes many broader capabilities beyond simply opening/previewing an existing deck: POST endpoints for slides patch/apply/edit apply, deck asset uploads, chat attachments, export APIs, and UI controls for preview/apply actions. It also includes unrelated operational controls such as AI/agent health inspection and server/runtime shutdown. While some editing behavior is consistent with a workbench, the presence of export, upload, and system-control functionality means the supplied code does materially more than the declared purpose suggests. Therefore the description does not accurately represent the actual behavior of this code chunk.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description is narrowly about opening an existing/generated PPT deck in a WebUI/workbench without running generation steps. The supplied code chunk is not just a thin opener/launcher or deck auto-detection routine; it is the actual full-featured frontend implementation of the workbench. It includes extensive editing, inspection, export, presentation, notifications, and AI-assisted analysis/chat capabilities. While these may belong inside a PPT workbench, they materially exceed the declared purpose of merely opening/previewing/editing an existing deck and specifically include undeclared capabilities like deck audit/chat integration, export tooling, direct DOM editing operations, and presentation mode. The mismatch is therefore significant: the code’s primary behavior is a comprehensive editor/workbench frontend, not just opening the WebUI for an existing deck.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The declared description is narrowly scoped to opening an already generated PPT deck in the WebUI/workbench without running generation or export steps. The supplied code does much more: it implements the main interactive workbench application, including editing, AI-assisted modifications, chat with an agent bridge, audits/inspection, style selection, export/download, uploads, and presentation mode. These are materially broader capabilities than simply opening or previewing an existing deck. While opening/loading a deck is part of the behavior, it is not an accurate or complete representation of the code’s actual primary function.

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 106)May include surrounding context.

md
When bypassing `open_workbench.py` and invoking the workbench launcher directly, use subcommands:

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The script searches multiple local .env locations, extracts gateway-related secrets, and injects them into the child process automatically. This creates credential access and propagation behavior beyond the stated purpose of opening a workbench, increasing the blast radius if the child process, launcher, or logs are compromised.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
98% confidence
Finding

This code enumerates Hermes-related .env files specifically to locate a gateway secret. In the context of a skill that only claims to open a PPT editor, that constitutes unnecessary credential discovery and increases the chance of secret misuse or unintentional disclosure.

Content

Scanner excerpt · scripts/open_workbench.py (reported line 198)May include surrounding context.

python
"""Yield Hermes env files that may contain the Gateway bridge secret."""
    value = _clean_env("HERMES_HOME")
    if value:
        yield Path(value).expanduser() / ".env"
    if os.name == "nt":
        local_app_data = os.environ.get("LOCALAPPDATA", "").strip()
        if local_app_data:

Credential Access

High
Category
Privilege Escalation
Confidence
98% confidence
Finding

The Windows LOCALAPPDATA Hermes .env lookup is another credential-harvesting path that broadens access to locally stored secrets without clear necessity for the advertised feature. Multiple fallback paths make the behavior more invasive and harder for users to understand or control.

Content

Scanner excerpt · scripts/open_workbench.py (reported line 202)May include surrounding context.

python
if os.name == "nt":
        local_app_data = os.environ.get("LOCALAPPDATA", "").strip()
        if local_app_data:
            yield Path(local_app_data) / "hermes" / ".env"
    yield Path.home() / ".hermes" / ".env"

Credential Access

High
Category
Privilege Escalation
Confidence
98% confidence
Finding

Reading the user's ~/.hermes/.env file to discover API keys is credential access behavior unrelated to simply opening an existing deck in a WebUI. This is especially risky because home-directory secrets are often shared across workflows, so compromise of this tool or its child process could expose broader account access.

Content

Scanner excerpt · scripts/open_workbench.py (reported line 203)May include surrounding context.

python
local_app_data = os.environ.get("LOCALAPPDATA", "").strip()
        if local_app_data:
            yield Path(local_app_data) / "hermes" / ".env"
    yield Path.home() / ".hermes" / ".env"


def _load_env_file(file_path: Path) -> dict[str, str]:

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The service launches external programs and converter scripts via child process execution, which is a significant privilege escalation over a simple local UI opener. Because command templates and converter locations can be influenced by environment configuration, compromise of config or invocation context could lead to arbitrary command execution with the service's privileges.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The runtime exposes export endpoints that trigger deck conversion and packaging workflows, despite the skill metadata claiming it only opens an existing workbench and does not run export generation. This broadens the skill's authority and attack surface: a caller expecting a passive preview tool can cause side-effecting file generation and downstream tool execution.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The runtime performs network fetches both to download third-party vendor assets and to call AI/model endpoints. In a skill presented as a local PPT workbench opener, this is dangerous because it introduces supply-chain risk, unexpected outbound network access, and potential exfiltration of slide/deck content.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The workbench proxies chat and audit traffic to external or local agent backends, including WebUI, gateway, REST, and ACP/stdio bridges. This creates a hidden outbound control channel and can leak deck contents, prompts, and local file context to other services, which is materially riskier than merely opening a local editor UI.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The bundle clearly exposes capabilities far beyond simply opening or previewing an existing deck: it includes direct editing, patch/apply/save flows, exports, asset uploads, AI chat, workspace/session management, and runtime/server controls. This is dangerous because a skill advertised as a low-risk viewer/workbench opener can unexpectedly mutate local content or control backend processes, violating least privilege and increasing blast radius if invoked automatically or with untrusted inputs.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
95% confidence
Finding

The bundle can post style selections and open workspaces via /api/workbench/style-selection and /api/workspaces/sensenova/open, which goes beyond merely opening the requested existing deck. In this skill context, such actions can change workflow state, redirect the user into different workspaces, or influence downstream generation behavior without matching the declared limited intent.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The bundle can post style selections and open workspaces via /api/workbench/style-selection and /api/workspaces/sensenova/open, which goes beyond merely opening the requested existing deck. In this skill context, such actions can change workflow state, redirect the user into different workspaces, or influence downstream generation behavior without matching the declared limited intent.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding

The skill invokes Python and Node helpers, reads environment variables, auto-discovers files, and may expose a WebUI over the network, yet it declares no explicit tool or permission scope. That increases the blast radius because an agent could execute shell/network/file actions not clearly constrained by policy or user review.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill recommends binding the workbench to 0.0.0.0 for Docker/WSL or remote/LAN access, which can expose the editor and any deck contents to other hosts on the network if no firewall, auth, or tunnel protections exist. Because the same document also discusses writable agent bridging and API keys, accidental exposure could leak sensitive slides or enable unauthorized interaction with the workbench.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The documentation repeatedly uses and recommends the shared default key ppt-editor-dev, including advice to set both gateway and workbench to that value. Even though the service is described as loopback-only by default, a predictable shared credential materially weakens authentication if the bind scope changes, local tunneling is introduced, or multiple local users/processes can reach the service.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/gateway-auth.md (reported line 33)May include surrounding context.

API_SERVER_KEY=ppt-editor-dev

text
2. Restart the Hermes Gateway (full restart, not hot reload).
3. Verify: `curl http://127.0.0.1:8642/v1/models -H "Authorization: Bearer ppt-editor-dev"`

### Default port

Static analysis

Detected: suspicious.dangerous_exec, suspicious.dynamic_code_execution, suspicious.env_credential_access (+2 more)

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
workbench-runtime/bin/sensenova-ppt-workbench.mjs:466

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
workbench-runtime/dist-server/index.mjs:33609

Dynamic code execution detected.

Critical
Code
suspicious.dynamic_code_execution
Location
workbench-runtime/dist-server/index.mjs:1030

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
workbench-runtime/bin/sensenova-ppt-workbench.mjs:122

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
workbench-runtime/dist-server/index.mjs:476

Potential obfuscated payload detected.

Warn
Code
suspicious.obfuscated_code
Location
workbench-runtime/dist-server/index.mjs:2578

Potential obfuscated payload detected.

Warn
Code
suspicious.obfuscated_code
Location
workbench-runtime/dist/assets/MarkdownArtifactViewer-0j-iJPy3.js:2

Sensitive-looking file read is paired with a network send.

Warn
Code
suspicious.potential_exfiltration
Location
workbench-runtime/bin/sensenova-ppt-workbench.mjs:84