Back to skill

Security audit

Deep Research → NotebookLM Orchestrator

Security checks for vulnerabilities and agentic risk

Overview

This skill has a coherent research-to-NotebookLM purpose, but it uses detached background scripts, automatic agent triggering, and unsafe shell evaluation that need review before install.

Review this skill before installing. It is not clearly malicious, but it should be hardened: avoid eval, use a private unpredictable task directory, require explicit approval before background agent-triggered continuation, and make Discord messaging/download behavior clear.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:397
Finding

Arbitrary Command Execution Through an Untrusted Download Command and Shell eval

Content
View full analysis
> nlm-poll.log 2>&1 || true ``` ### Technical Analysis The polling script reads `download_cmd` from `artifacts.json` and passes the resulting string to the shell through `eval`. Unlike direct execution with a fixed executable and argument array, `eval` reparses the assembled value as shell syntax. Consequently, shell operators, command substitutions, redirections, and additional commands embedded in `download_cmd` are interpreted and executed. The script also interpolates `NOTEBOOK_ID`, `ART_ID`, and `OUTPUT_FILE` into the evaluated command. Although these values are placed inside a quoted argument to `eval`, that quoting protects only the initial construction of the string; it does not provide safe argument boundaries when `eval` reparses the resulting command. `artifacts.json` is stored in the workflow's temporary task directory and is explicitly treated as writable workflow state. If an attacker can modify this file—particularly in conjunction with the predictable temporary-directory issue described separately—the attacker can replace the expected command with arbitrary shell syntax. ### Attack Path 1. A workflow is launched with artifact downloading enabled. 2. The script creates or consumes `artifacts.json` in the task directory. 3. An attacker with write access to that file changes an entry such as: ```json { "type": "audio", "id": "abc123", "download_cmd": "nlm download audio; attacker_command" } ``` 4. NotebookLM reports that the corresponding artifac ...[truncated 1001 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:91
Finding

Predictable Shared Temporary Workspace Permits Workflow-State Tampering

Content
View full analysis
_/ ``` The resulting directory is later trusted when background scripts are launched: ```bash cd /tmp/deep-research-to-notebooklm// nohup bash dr-poll.sh > /dev/null 2>&1 & ``` ```bash cd /tmp/deep-research-to-notebooklm// nohup bash nlm-poll.sh > /dev/null 2>&1 & ``` ### Technical Analysis The workflow uses a shared `/tmp` hierarchy with a task-directory name based on a minute-resolution timestamp and a topic-derived slug. This naming scheme is predictable and does not guarantee exclusive creation. `mkdir -p` succeeds when the target already exists, so it does not detect an attacker-precreated directory. The instructions do not establish a restrictive `umask`, explicitly set directory permissions, verify ownership, reject symbolic links, or atomically create state files. The workflow later trusts scripts and data files in this directory, including: - `dr-poll.sh` - `nlm-poll.sh` - `task.json` - `artifacts.json` - `completed.json` - Log and completion-marker files Long-running background polling increases the time available for tampering. The risk is especially significant for `artifacts.json`, because another finding shows that its `download_cmd` field is passed to `eval`. Exploitability depends on the permissions and local threat model of the runtime environment. A correctly configured private parent directory could reduce the risk, but the documented workflow does not create or require one. ### Attack Path 1. A local attacker predicts the task-directory name from the current time and research-topic slug, or observes the directory after creation. 2. The attacker precreates the directory, replaces a workflow file, or introduces a symbolic link before the Agent writes all state. 3. Be ...[truncated 1205 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (7)

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The file sets the default language to zh-CN and reiterates that default in the workflow defaults, which can force a specific locale unless the user notices and overrides it. This matches the language/locale policy concern because the skill does not make language choice explicitly opt-in before applying the default.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The task template explicitly sets "language": "zh-CN", reinforcing a fixed locale choice in operational configuration. Because this configuration is used as the workflow basis, it risks generating outputs in a specific language without explicit opt-in.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill explicitly instructs the agent to enter a triggered mode that skips all user confirmations after receiving an internally generated message. That enables a background script to cause additional agent actions from persisted state without fresh user consent, which is a cross-phase autonomy/control-boundary issue and can be abused if the trigger content or task state is tampered with.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
87% confidence
Finding

Launching dr-poll.sh with nohup creates a detached background process that persists beyond the interactive session and continues acting on stored task state. Persistence is risky here because the script can later send messages and trigger agent actions asynchronously, reducing user visibility and increasing the blast radius if the task directory or parameters are modified.

Content

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

bash
cd /tmp/deep-research-to-notebooklm/<task-dir>/
nohup bash dr-poll.sh > /dev/null 2>&1 &

Session Persistence

Medium
Category
Rogue Agent
Confidence
88% confidence
Finding

Launching nlm-poll.sh with nohup similarly creates a persistent background worker that can continue polling, downloading files, and messaging users after the initiating session ends. In this skill, that persistence is more sensitive because it can operate on generated artifacts and local file paths without immediate supervision.

Content

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

bash
cd /tmp/deep-research-to-notebooklm/<task-dir>/
nohup bash nlm-poll.sh > /dev/null 2>&1 &

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The documentation states that all notifications use direct messaging only, but the implementation also invokes openclaw agent, which causes agent-side processing rather than mere notification. This mismatch is dangerous because reviewers and users may underestimate the skill's autonomous execution capability and approve behavior they would otherwise scrutinize.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
77% confidence
Finding

The code includes a direct messaging capability via openclaw message send --channel discord, which is not mentioned in the manifest description. While notifications may support the workflow, direct Discord-channel operations are a separate capability from generating research and NotebookLM artifacts and are not declared as part of the skill's purpose.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.