Back to skill

Security audit

油价智能提醒

Security checks for vulnerabilities and agentic risk

Overview

This skill is not clearly malicious, but it needs review because enabling it can create a recurring cron job and several advertised safety/configuration controls are not implemented.

Review before installing. Only enable it if you are comfortable with a recurring cron job that keeps running, contacts the NDRC website, and writes local state. Ask the publisher to add explicit confirmation, the exact cron entry, disable/remove instructions, duplicate-job protection, and real implementations for the advertised configuration and duplicate-reminder controls.

Vulnerability Patterns
  • System PersistenceInstalls backdoors, hooks, services, or scheduled tasks that survive the run
  • 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 (1)

T06 · System Persistence

Error
Location
SKILL.md:31
Finding

Automatic Installation of a Persistent Scheduled Task

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 31–35
Vulnerability Type: System Persistence
Risk Level: High

Vulnerable Code Snippet

markdown
After the user asks Nova to enable oil-price reminders, Nova automatically:

1. Creates the `memory/oil_state.json` state file
2. Creates a cron job, triggered every 3 days
3. Records the next price-adjustment window

The original Skill text explicitly states that Nova automatically creates a state file and a cron job after the reminder feature is enabled.

Technical Analysis

The Skill instructs the Agent to modify the host's task scheduler by creating a recurring cron job. A cron entry survives the current Skill invocation and causes code to execute automatically in future sessions. This is cross-session system persistence and is therefore classified as T06: System Persistence.

Although recurring execution is related to the advertised reminder function, the instructions do not require explicit confirmation immediately before modifying the scheduler. They also do not specify:

  • The exact command and arguments to be installed.
  • A unique identifier or ownership marker for the cron entry.
  • The account and privilege context under which it will run.
  • An expiration or automatic cleanup policy.
  • Procedures for listing, disabling, and removing the task.
  • Controls preventing duplicate or incorrectly scoped entries.

The monitoring script itself performs recurring HTTPS requests to the declared NDRC website, updates /workspace/memory/oil_state.json, and prints a reminder. No evidence was found that it retrieves executable code, executes remote content, accesses credentials, or escalates privileges. The risk arises from the Skill's instruction to establish persistent scheduled execution.

Attack Path

  1. A user asks the Agent to enable the oil-price reminder.
  2. The Agent loads and follows the instructions in SKILL.md.
  3. The Agent creates the persistent state file under `/wo ...[truncated 1140 chars]
Remediation
View remediation

Remediation Suggestions

  1. Do not create cron entries automatically merely because the reminder feature was requested.
  2. Immediately before scheduler modification, request explicit user approval and display the complete proposed cron expression, executable path, arguments, execution account, and state-file location.
  3. Prefer a platform-managed reminder or scheduler API that provides ownership, authorization, auditing, lifecycle controls, and automatic cleanup.
  4. If cron is necessary, install a narrowly scoped entry that:
    • Uses an absolute path to the packaged script and interpreter.
    • Uses fixed arguments rather than user-controlled shell text.
    • Runs with the least-privileged account required.
    • Has a unique, recognizable ownership marker.
    • Prevents duplicate entries.
    • Uses a constrained environment and safe file permissions.
  5. Add an expiration date or bounded execution count unless the user explicitly requests indefinite monitoring.
  6. Document and implement commands for listing, disabling, and removing the task.
  7. Remove both the scheduler entry and associated state data when the user disables or uninstalls the Skill.
  8. Log creation, execution, modification, and removal of the scheduled task so users can audit persistent activity.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • 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
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (11)

Tp4

High
Category
MCP Tool Poisoning
Confidence
92% confidence
Finding

The documented behavior overclaims functionality such as configurable scheduling, city support, and duplicate-suppression logic that is not actually implemented. This is dangerous because users and platform operators may make trust and deployment decisions based on false assumptions, leading to unintended cron creation, repeated notifications, or incorrect automation behavior.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding

The skill describes capabilities that involve shell execution (curl) and persistent file writes, but it does not declare any explicit tool scope or permissions boundary. This creates a security and governance gap: an agent may be granted more capability than the user understands, and reviewers cannot verify least-privilege operation from the manifest alone.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The trigger phrase 什么时候加油 is broad everyday language and may activate the skill during ordinary conversation without clear user intent to enable monitoring or scheduling. In this skill’s context, accidental activation is more serious because the skill claims it will create cron jobs and persistent state, which are side effects beyond a simple one-shot response.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill indicates that enabling it will create cron jobs and write persistent local state, but this side effect is not clearly disclosed upfront in the main description as a user warning. Hidden persistence and scheduling reduce informed consent and can surprise users with ongoing background execution or retained data.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script description and all reminder messages are hard-coded in Chinese, with no indication that the user can choose another language or that the skill is intentionally limited to a Chinese-speaking locale. This is a natural-language policy concern because it enforces a specific language without user opt-in.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The manifest describes configurable monitoring frequency, city-specific configuration, and anti-duplicate reminder state handling. In this file, the script only performs a single check when run, uses no city-specific logic at all, and persists state without any logic to suppress repeat reminders based on prior notifications.

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/oil_monitor.py (reported line 16)May include surrounding context.

python
def curl(url):
    try:
        r = subprocess.run(['curl', '-s', url], capture_output=True, text=True, timeout=12)
        return r.stdout
    except: return ""

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

This Python code fetches remote content from an external government website using curl and writes persistent state to /workspace/memory/oil_state.json, but it provides no confirmation prompt, logging, print statement, or explanatory comments/docstring disclosing these actions. For a code file, these safety-relevant operations warrant at least some visible disclosure to the user.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The manifest suggests the reminder is based on monitoring NDRC announcements and judging upcoming adjustment windows. However, the code computes the next adjustment date from a fixed date seed and weekday counting, independent of the fetched announcement content, so the reminder timing is not actually driven by the monitored source.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
80% confidence
Finding

SQP-3 applies to all file types and covers language or locale policy issues. The file forces a single language in the skill description and trigger phrases without indicating user opt-in or offering an alternative language, which can violate an organizational expectation of language choice.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
82% confidence
Finding

For an oil-price reminder skill, fetching official web pages is expected, but spawning a system subprocess to do so is a broader execution capability than the manifest implies. The stated purpose is monitoring and reminding, not invoking external binaries or shell-adjacent tooling.

Content

No source excerpt is available for this finding.