Back to skill

Security audit

Hugo Blog Agent

Security checks for vulnerabilities and agentic risk

Overview

The skill is mainly a Hugo blog setup guide, but it includes root-level nginx reload automation and unsafe publishing defaults that deserve user review before installation.

Review the nginx and automation sections before use. Treat the service reload commands as administrator-only, run validation and reload separately, and add an explicit confirmation or deployment gate. Avoid enabling raw HTML unless required, validate or escape post titles before generating content, and decide whether nginx access logs are appropriate for your privacy and retention obligations.

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

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:176
Finding
Stored HTML Injection Through Unvalidated Post Titles and Unsafe Rendering## Vulnerability Details **File Location**: `SKILL.md:35-43` and `SKILL.md:174-200` **Vulnerability Type**: Stored HTML injection and potential stored cross-site scripting **Risk Level**: Medium The vulnerable configuration enables raw HTML rendering: ```toml [markup] [markup.goldmark] [markup.goldmark.renderer] unsafe = true hardWraps = false ``` The post-generation function then writes an externally supplied title directly into YAML front matter and Markdown content without validation or context-sensitive escaping: ```bash create_agent_post() { local title="$1" local filename="$(echo "$title" | iconv -t ascii//TRANSLIT | sed 's/[^a-zA-Z0-9]/-/g' | tr '[:upper:]' '[:lower:]')" local date="$(date -I)" hugo new "posts/${date}-${filename}.md" # Front matter optimization cat > "content/posts/${date}-${filename}.md" << EOF --- title: "${title}" date: $(date -Iseconds) draft: false tags: ["AI", "agent"] description: "${title} article" author-type: "agent" content-structure: "linear" --- # ${title} ``` ### Technical Analysis The first argument to `create_agent_post` is treated as trusted content. Although the derived filename is filtered, the original `title` value is inserted verbatim into two distinct syntactic contexts: 1. A double-quoted YAML front-matter value. 2. Markdown page content. Quotes, line breaks, YAML delimiters, Markdown syntax, and HTML elements are not escaped. A crafted multiline title can therefore terminate or modify the intended YAML value, introduce additional front-matter properties, or place attacker-controlled HTML into the post body. Hugo is separately configured with Goldmark's `unsafe` option enabled. This permits raw HTML embedded in Markdown to be emitted into the generated site rather than removed. If an attacker can influence the title passed to the script, this combination can result in stored HT ...[truncated 1941 chars]
Remediation
## Remediation Suggestions 1. Disable raw HTML rendering unless it is an explicit and strictly controlled requirement: ```toml [markup] [markup.goldmark] [markup.goldmark.renderer] unsafe = false ``` 2. Validate titles before use. Apply a reasonable length limit, reject control characters and line breaks, and permit only the character classes required by the publishing workflow. 3. Do not construct YAML front matter through direct heredoc interpolation. Use a structured YAML, TOML, or JSON serializer that correctly escapes quotes, line breaks, and delimiters. 4. Escape the title separately for each output context. YAML escaping is not equivalent to Markdown or HTML escaping. 5. If limited raw HTML is required, sanitize generated content with a maintained allowlist-based HTML sanitizer before publication. 6. Add automated tests using titles containing quotes, multiline input, YAML delimiters, Markdown links, and HTML elements. Verify that these values cannot alter front matter or produce active markup. 7. Deploy a restrictive Content Security Policy as defense in depth, such as prohibiting inline scripts and limiting script and frame sources. This should supplement rather than replace correct validation and output encoding.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (6)

Hidden Instructions

High
Category
Prompt Injection
Content
<meta name="viewport" content="width=device-width, initial-scale=1">
    <title>{{ if .IsHome }}{{ .Site.Title }}{{ else }}{{ .Title }} | {{ .Site.Title }}{{ end }}</title>
    
    <!-- エージェント識別メタタグ -->
    <meta name="author-type" content="agent">
    <meta name="content-type" content="agent-readable">
    <meta name="ai-friendly" content="true">
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Chaining Abuse

High
Category
Tool Misuse
Content
fi

# nginx設定リロード
sudo nginx -t && sudo systemctl reload nginx

echo "ブログ更新完了: $(date)"
```
Confidence
87% confidence
Finding
The chained command `sudo nginx -t && sudo systemctl reload nginx` couples validation and service modification in a single step, making it easy for an agent or user to trigger a live reload immediately after a successful syntax check. This reduces opportunities for review and increases the chance of unintended operational changes.

Context-Inappropriate Capability

Medium
Confidence
91% confidence
Finding
The skill goes beyond Hugo content generation and includes system administration guidance for configuring nginx and operating a production web server. In an agent skill context, this broadens the action surface to infrastructure changes that can affect host availability, security posture, and other sites on the machine.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The script performs privileged commands to test and reload nginx using sudo without any warning that it modifies live system state. If executed by an agent or inattentive user, this can disrupt service, fail due to privilege prompts, or apply unsafe configuration changes on the host.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
fi

# nginx設定リロード
sudo nginx -t && sudo systemctl reload nginx

echo "ブログ更新完了: $(date)"
```
Confidence
96% confidence
Finding
The presence of sudo in an automation script means the skill encourages root-level execution for routine blog update workflows. In agent-assisted environments, privileged execution increases the blast radius of mistakes or prompt-induced actions and can modify critical system services.

Missing User Warnings

Low
Confidence
88% confidence
Finding
The nginx example enables access logging specifically for agent access analysis without disclosing the privacy and data-retention implications. This can lead operators to collect visitor metadata unintentionally, creating compliance and privacy risk.

Static analysis

No suspicious patterns detected.