CVE-2026-89259 Overview
CVE-2026-89259 affects Hugo, the widely used static site generator written in Go. Starting from Hugo v0.161.0, the framework executes Node.js tools under Node's permission model to restrict filesystem access during builds. TailwindCSS, included in the default security.exec.allow list, requires highly permissive Node.js flags (--allow-addons, --allow-child-process, --allow-worker) to function. These permissive flags allow a Node.js tool invoked during a build to read and write files outside the project working directory, bypassing the mitigations introduced for GHSA-x597-9fr4-5857. The issue was fixed in Hugo v0.165.0.
Critical Impact
A malicious Hugo site or theme built with TailwindCSS enabled can escape the sandbox and access arbitrary files on the build host.
Affected Products
- Hugo static site generator versions after v0.43 and before v0.165.0
- Hugo builds that include TailwindCSS in security.exec.allow
- Continuous integration pipelines that build untrusted Hugo sites or themes
Discovery Timeline
- 2026-09-11 - CVE-2026-89259 published to the National Vulnerability Database
- 2026-09-11 - Last updated in NVD database
Technical Details for CVE-2026-89259
Vulnerability Analysis
Hugo introduced a Node.js permission model in v0.161.0 to sandbox external tool execution during site builds. The framework maintains a security.exec.allow list controlling which binaries the build process can invoke. TailwindCSS shipped in the default allow list, and its runtime requires --allow-addons, --allow-child-process, and --allow-worker flags. These flags neutralize the filesystem restrictions the permission model was designed to enforce. An attacker who controls Hugo input files or a theme can execute Node.js code with access to files outside the project directory. The weakness maps to [CWE-250: Execution with Unnecessary Privileges].
Root Cause
The root cause is an insufficient permission boundary. Hugo trusted the Node.js permission model to contain child processes, but TailwindCSS's operational requirements forced Hugo to grant permissions that defeated the sandbox. The default allow list exposed every user building Tailwind-enabled sites to the bypass.
Attack Vector
An attacker delivers a malicious Hugo project, theme, or module containing crafted TailwindCSS configuration or plugin code. When a victim runs hugo to build the site, Node.js executes attacker-controlled code with permissive flags. The code can read secrets, source code, or SSH keys outside the working directory, and write payloads such as backdoors or modified build artifacts. Automated build systems processing untrusted content face the highest exposure.
No verified proof-of-concept code is publicly available. See the GitHub Security Advisory and the VulnCheck Advisory on Hugo for further technical detail.
Detection Methods for CVE-2026-89259
Indicators of Compromise
- Node.js processes spawned by hugo accessing files outside the site's working directory
- Unexpected child processes or worker threads originating from TailwindCSS plugins during builds
- Build logs showing invocation of node with --allow-addons, --allow-child-process, or --allow-worker on Hugo versions before v0.165.0
- New or modified files in user home directories or CI runner filesystems following a Hugo build
Detection Strategies
- Inventory Hugo installations across developer workstations and CI runners and flag versions below v0.165.0
- Audit hugo.toml and hugo.yaml configurations for the default security.exec.allow entry containing ^tailwindcss$
- Monitor CI/CD pipelines for Hugo builds processing third-party themes, modules, or pull request content
- Review Node.js execution telemetry for permission flags that broaden filesystem or process access
Monitoring Recommendations
- Log all process executions spawned by static site generators in build environments and forward them to a central data store for analysis
- Alert on file access by build-time Node.js processes to paths outside the project directory
- Track outbound network connections from build agents during Hugo builds to identify data exfiltration attempts
How to Mitigate CVE-2026-89259
Immediate Actions Required
- Upgrade Hugo to v0.165.0 or later on all developer machines and CI/CD runners
- Restrict Hugo builds of untrusted sites, themes, or pull requests until upgrades complete
- Rotate secrets accessible from build environments if unverified Hugo builds ran on shared infrastructure
- Isolate build agents in ephemeral, least-privilege containers to limit blast radius
Patch Information
Hugo v0.165.0 removes tailwindcss from the default security.exec.allow list. Users who require TailwindCSS must explicitly opt in through configuration and accept the residual risk. Review the GitHub Security Advisory GHSA-vrm6-x8vp-mv2r for release notes and upgrade guidance.
Workarounds
- Define a restrictive security.exec.allow list in hugo.toml that excludes tailwindcss when upgrading is not immediately possible
- Build only trusted sites and vetted themes on hosts running vulnerable Hugo versions
- Run Hugo builds inside sandboxed containers with read-only mounts for anything outside the site directory
# Configuration example: restrictive security.exec.allow in hugo.toml
[security.exec]
allow = ['^go$', '^git$']
osEnv = ['(?i)^((HTTPS?|NO)_PROXY|PATH(EXT)?|APPDATA|TE?MP|TERM|GO\w+|(XDG_CONFIG_)?HOME|USERPROFILE)$']
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

