Back to skill

Security audit

Mba Thesis Workflow

Security checks across malware telemetry and agentic risk

Overview

This thesis-writing skill is mostly coherent, but it contains unsafe local execution paths and under-scoped persistent automation that warrant Review before installation.

Install only if you are comfortable reviewing and fixing the unsafe parsing and path handling first. At minimum, replace eval() with strict JSON parsing, validate paper_name so it cannot escape the workspace, remove or gate the phase1_3_skip path, narrow auto-trigger rules, and avoid storing email or confidential thesis material unless you understand where local files and LLM calls will go.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • 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
  • Output HandlingUnvalidated Output Injection, Cross-Context Output, Unbounded Output
Findings (23)

eval() call detected

High
Category
Dangerous Code Execution
Content
# 尝试提取 JSON(可能在 markdown 代码块中)
        json_match = re.search(r'\{[\s\S]*\}', response)
        if json_match:
            result = eval(json_match.group())  # 安全的简单解析
        else:
            result = eval(response)  # 直接解析
    except Exception:
Confidence
99% confidence
Finding
result = eval(json_match.group()) # 安全的简单解析

eval() call detected

High
Category
Dangerous Code Execution
Content
if json_match:
            result = eval(json_match.group())  # 安全的简单解析
        else:
            result = eval(response)  # 直接解析
    except Exception:
        return {
            "ok": False,
Confidence
99% confidence
Finding
result = eval(response) # 直接解析

eval() call detected

High
Category
Dangerous Code Execution
Content
try:
        json_match = re.search(r'\{[\s\S]*\}', response)
        if json_match:
            result = eval(json_match.group())
        else:
            result = eval(response)
        return {"ok": True, **result}
Confidence
99% confidence
Finding
result = eval(json_match.group())

eval() call detected

High
Category
Dangerous Code Execution
Content
if json_match:
            result = eval(json_match.group())
        else:
            result = eval(response)
        return {"ok": True, **result}
    except Exception as e:
        return {
Confidence
99% confidence
Finding
result = eval(response)

Lp3

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding
The skill advertises no declared permissions, yet the workflow explicitly instructs file reads/writes, shell execution, cron creation, and Python script invocation. This breaks least-privilege expectations and can cause the host agent to execute powerful local actions without the user or platform having a clear permission model for them.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The declared purpose says this is a thesis-writing workflow, but the described behavior extends into installation, dependency inspection, local state management, document parsing, strict conversion, and collection/storage of personal configuration data. That mismatch is dangerous because users may consent to a writing assistant while unknowingly granting a broader automation tool access to local data and execution capabilities.

Context-Inappropriate Capability

Medium
Confidence
87% confidence
Finding
The document explicitly maps the workflow to broad generic tool invocation primitives such as sessions_spawn, exec, and hermes chat. In a thesis-writing skill, exposing or normalizing generic execution and sub-agent spawning is more capability than necessary and can enable prompt-influenced command execution, uncontrolled delegation, or data exfiltration if later implemented without strict restrictions.

Intent-Code Divergence

Medium
Confidence
96% confidence
Finding
The code comments state that skipping Phase 1.3 should be disabled in production, but the public orchestrate() entrypoint still exposes action="phase1_3_skip" and directly invokes skip_phase1_3(). That lets a caller bypass the intended mandatory attribution/confirmation gate and proceed to Phase 2 with empty content hints, weakening workflow integrity and any safety or quality controls that depend on Phase 1.3.

Intent-Code Divergence

High
Confidence
96% confidence
Finding
The comment labeling eval as a 'safe simple parse' is itself dangerous because it misrepresents a code execution sink as harmless parsing. This increases the likelihood the unsafe pattern will survive review, be copied elsewhere, or be trusted in a security-sensitive workflow.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
A thesis-review workflow has no legitimate need to execute code contained in model output, so this is an unnecessary and high-risk capability. The mismatch between business purpose and implementation means prompt injection from reviewed content can escalate into arbitrary code execution without any valid functional reason.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The auxiliary parse_review_response() function duplicates the same unnecessary code-execution behavior in the manual LLM path. That makes the vulnerability easier to trigger in alternate workflows and harder to eliminate because the dangerous logic exists in multiple places.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
`paper_name` is passed directly into `os.path.join(WORKSPACE, paper_name)` and the resulting path is created and later used for reads/writes/deletes without validating that it stays under the workspace. An attacker can supply values like `../../some/other/path` or an absolute path to escape `~/.openclaw/workspace`, causing unauthorized file creation, overwrite, or deletion on the local system.

Context-Inappropriate Capability

Medium
Confidence
91% confidence
Finding
The module exposes a deletion primitive via `outline_delete`, and because the state path is derived from unsanitized `paper_name`, that deletion can target files outside the intended workspace when combined with path traversal. Even aside from traversal, exposing destructive deletion is broader than necessary for a thesis-writing workflow and increases the blast radius of misuse or prompt-induced actions.

Vague Triggers

Medium
Confidence
88% confidence
Finding
The trigger rules are broad enough to force invocation based on generic keywords like '论文', 'MBA', or any request for DOCX output with thesis-like filenames. Overbroad auto-triggering can unexpectedly route unrelated user tasks into a shell- and file-capable workflow, increasing the chance of unwanted script execution, file generation, or stateful automation.

Missing User Warnings

Low
Confidence
83% confidence
Finding
The script writes personal information, including email addresses, to a local config.env file without warning the user about persistent storage or applying restrictive file permissions. While not credential theft, this can expose personal data to other local users or to accidental inclusion in backups, logs, or source control.

Missing User Warnings

Medium
Confidence
84% confidence
Finding
The function sends document-derived headings to an externally supplied LLM callback without any consent gate, disclosure, or data-minimization control. In academic workflows, headings can reveal research topics, client names, institutions, or confidential project structure, so silent transmission to a third-party model can create a real confidentiality and compliance risk.

Missing User Warnings

High
Confidence
95% confidence
Finding
This path transmits full unclassified document paragraphs to an external LLM callback, which is more sensitive than sending headings alone because it may include unpublished research content, personal data, proprietary information, or regulated material. Because the transfer is automatic and there is no warning, policy control, or redaction, the risk of unintended disclosure is substantial in this thesis-writing context.

Missing User Warnings

Medium
Confidence
80% confidence
Finding
The reviewer sends full node content, and potentially bridge text, to an injected llm_func without any built-in disclosure, minimization, or trust boundary checks. In a thesis workflow, these fields may contain confidential drafts, proprietary research, or personal data, so forwarding them to external services can create data leakage risk.

Ssd 3

Medium
Confidence
90% confidence
Finding
`chapter_hints` and `content_hint` are user-controlled text that are inserted verbatim into the generated prompt package and text output with no sanitization, scoping, or instruction/data separation. In an LLM workflow, this creates a prompt-injection channel where untrusted hints can override writer behavior, cause retention or disclosure of prior context, or manipulate downstream agents into ignoring boundaries.

Unvalidated Output Injection

High
Category
Output Handling
Content
if json_match:
            result = eval(json_match.group())  # 安全的简单解析
        else:
            result = eval(response)  # 直接解析
    except Exception:
        return {
            "ok": False,
Confidence
99% confidence
Finding
eval(response

Unvalidated Output Injection

High
Category
Output Handling
Content
if json_match:
            result = eval(json_match.group())
        else:
            result = eval(response)
        return {"ok": True, **result}
    except Exception as e:
        return {
Confidence
99% confidence
Finding
eval(response

Credential Access

High
Category
Privilege Escalation
Content
read -p "作者姓名: " AUTHOR_NAME

    # 写入 config.env
    cat > "$SKILL_DIR/config.env" << EOF
# MBA Thesis Workflow 配置(自动生成)
WORKSPACE_ROOT=$WORKSPACE_ROOT
Confidence
86% confidence
Finding
.env

Credential Access

High
Category
Privilege Escalation
Content
read -p "作者姓名: " AUTHOR_NAME

    # 写入 config.env
    cat > "$SKILL_DIR/config.env" << EOF
# MBA Thesis Workflow 配置(自动生成)
WORKSPACE_ROOT=$WORKSPACE_ROOT
USER_EMAIL=$USER_EMAIL
Confidence
85% confidence
Finding
.env"

VirusTotal

63/63 vendors flagged this skill as clean.

View on VirusTotal

Static analysis

Detected: suspicious.dynamic_code_execution

Dynamic code execution detected.

Critical
Code
suspicious.dynamic_code_execution
Location
scripts/reviewer.py:158