CVE-2026-75926
Full vulnerability record from the local CVENow database.
Description
Hugo 0.161.0 placed the Node asset pipelines behind the Node.js permission model so that code running through PostCSS, Babel, or TailwindCSS could not reach the file system outside the project directory. Hugo 0.162.0 added tailwindcss to the AllowChildProcess default in config/security/securityConfig.go, which makes nodePermissionArgs in common/hexec/exec.go append --allow-child-process whenever the tool being launched is named tailwindcss. TailwindCSS loads the site's tailwind.config.js through require at startup, so top-level code in that file executes inside the permitted Node process and can call child_process to spawn a shell. The spawned process is not a Node process and inherits none of the permission flags, so it runs with the full privileges of the account performing the build. Building a site whose theme, module, or starter template supplies the Tailwind configuration therefore yields arbitrary command execution rather than the confined file access the permission model was introduced to enforce. Hugo 0.165.0 removes tailwindcss from the default security.exec.allow list, so the tool is no longer launched under the default configuration.
View original CVE JSON
{
"id": "CVE-2026-75926",
"sourceIdentifier": "[email protected]",
"published": "2026-08-18T16:18:24.443",
"lastModified": "2026-10-22T22:10:00.250",
"vulnStatus": "Analyzed",
"cveTags": [],
"descriptions": [
{
"lang": "en",
"value": "Hugo 0.161.0 placed the Node asset pipelines behind the Node.js permission model so that code running through PostCSS, Babel, or TailwindCSS could not reach the file system outside the project directory. Hugo 0.162.0 added tailwindcss to the AllowChildProcess default in config/security/securityConfig.go, which makes nodePermissionArgs in common/hexec/exec.go append --allow-child-process whenever the tool being launched is named tailwindcss. TailwindCSS loads the site's tailwind.config.js through require at startup, so top-level code in that file executes inside the permitted Node process and can call child_process to spawn a shell. The spawned process is not a Node process and inherits none of the permission flags, so it runs with the full privileges of the account performing the build. Building a site whose theme, module, or starter template supplies the Tailwind configuration therefore yields arbitrary command execution rather than the confined file access the permission model was introduced to enforce. Hugo 0.165.0 removes tailwindcss from the default security.exec.allow list, so the tool is no longer launched under the default configuration."
},
{
"lang": "es",
"value": "Hugo 0.161.0 colocó las tuberías de activos de Node detrás del modelo de permisos de Node.js para que el código que se ejecuta a través de PostCSS, Babel o TailwindCSS no pudiera acceder al sistema de archivos fuera del directorio del proyecto. Hugo 0.162.0 añadió tailwindcss al valor predeterminado de AllowChildProcess en config/security/securityConfig.go, lo que hace que nodePermissionArgs en common/hexec/exec.go añada --allow-child-process cada vez que la herramienta que se lanza se llama tailwindcss. TailwindCSS carga el archivo tailwind.config.js del sitio a través de require al inicio, por lo que el código de nivel superior en ese archivo se ejecuta dentro del proceso Node permitido y puede llamar a child_process para generar un shell. El proceso generado no es un proceso Node y no hereda ninguna de las banderas de permiso, por lo que se ejecuta con todos los privilegios de la cuenta que realiza la compilación. La compilación de un sitio cuyo tema, módulo o plantilla de inicio proporciona la configuración de Tailwind, por lo tanto, produce la ejecución arbitraria de comandos en lugar del acceso confinado a archivos que el modelo de permisos fue introducido para hacer cumplir. Hugo 0.165.0 elimina tailwindcss de la lista predeterminada security.exec.allow, por lo que la herramienta ya no se lanza bajo la configuración predeterminada."
}
],
"affected": [
{
"source": "[email protected]",
"affectedData": [
{
"vendor": "gohugoio",
"product": "hugo",
"defaultStatus": "unaffected",
"repo": "https://github.com/gohugoio/hugo",
"packageURL": "pkg:golang/github.com/gohugoio/hugo",
"versions": [
{
"version": "0.162.0",
"lessThan": "0.165.0",
"versionType": "semver",
"status": "affected"
}
]
}
]
}
],
"metrics": {
"cvssMetricV40": [
{
"source": "[email protected]",
"type": "Secondary",
"cvssData": {
"version": "4.0",
"vectorString": "CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X",
"baseScore": 9.3,
"baseSeverity": "CRITICAL",
"attackVector": "LOCAL",
"attackComplexity": "LOW",
"attackRequirements": "NONE",
"privilegesRequired": "NONE",
"userInteraction": "PASSIVE",
"vulnConfidentialityImpact": "HIGH",
"vulnIntegrityImpact": "HIGH",
"vulnAvailabilityImpact": "HIGH",
"subConfidentialityImpact": "HIGH",
"subIntegrityImpact": "HIGH",
"subAvailabilityImpact": "HIGH",
"exploitMaturity": "NOT_DEFINED",
"confidentialityRequirement": "NOT_DEFINED",
"integrityRequirement": "NOT_DEFINED",
"availabilityRequirement": "NOT_DEFINED",
"modifiedAttackVector": "NOT_DEFINED",
"modifiedAttackComplexity": "NOT_DEFINED",
"modifiedAttackRequirements": "NOT_DEFINED",
"modifiedPrivilegesRequired": "NOT_DEFINED",
"modifiedUserInteraction": "NOT_DEFINED",
"modifiedVulnConfidentialityImpact": "NOT_DEFINED",
"modifiedVulnIntegrityImpact": "NOT_DEFINED",
"modifiedVulnAvailabilityImpact": "NOT_DEFINED",
"modifiedSubConfidentialityImpact": "NOT_DEFINED",
"modifiedSubIntegrityImpact": "NOT_DEFINED",
"modifiedSubAvailabilityImpact": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"valueDensity": "NOT_DEFINED",
"vulnerabilityResponseEffort": "NOT_DEFINED",
"providerUrgency": "NOT_DEFINED"
}
}
],
"cvssMetricV31": [
{
"source": "[email protected]",
"type": "Secondary",
"cvssData": {
"version": "3.1",
"vectorString": "CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H",
"baseScore": 8.6,
"baseSeverity": "HIGH",
"attackVector": "LOCAL",
"attackComplexity": "LOW",
"privilegesRequired": "NONE",
"userInteraction": "REQUIRED",
"scope": "CHANGED",
"confidentialityImpact": "HIGH",
"integrityImpact": "HIGH",
"availabilityImpact": "HIGH"
},
"exploitabilityScore": 1.8,
"impactScore": 6.0
}
],
"ssvcV203": [
{
"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"ssvcData": {
"timestamp": "2026-08-19T00:00:00+00:00",
"id": "CVE-2026-75926",
"options": [
{
"exploitation": "none"
},
{
"automatable": "no"
},
{
"technicalImpact": "total"
}
],
"role": "CISA Coordinator",
"version": "2.0.3"
}
}
]
},
"weaknesses": [
{
"source": "[email protected]",
"type": "Secondary",
"description": [
{
"lang": "en",
"value": "CWE-1188"
}
]
}
],
"configurations": [
{
"nodes": [
{
"operator": "OR",
"negate": false,
"cpeMatch": [
{
"vulnerable": true,
"criteria": "cpe:2.3:a:gohugo:hugo:*:*:*:*:*:*:*:*",
"versionStartIncluding": "0.162.0",
"versionEndExcluding": "0.165.0",
"matchCriteriaId": "8B91618D-3DFE-4521-A68B-4CC07DA37D91"
}
]
}
]
}
],
"references": [
{
"url": "https://github.com/gohugoio/hugo",
"source": "[email protected]",
"tags": [
"Product"
]
},
{
"url": "https://github.com/gohugoio/hugo/blob/v0.164.0/common/hexec/exec.go#L292-L295",
"source": "[email protected]",
"tags": [
"Product"
]
},
{
"url": "https://github.com/gohugoio/hugo/blob/v0.164.0/config/security/securityConfig.go#L72-L79",
"source": "[email protected]",
"tags": [
"Product"
]
},
{
"url": "https://github.com/gohugoio/hugo/commit/8a55df7af2e6da31297245cc54fa2e3b521d93e8",
"source": "[email protected]",
"tags": [
"Patch"
]
},
{
"url": "https://github.com/gohugoio/hugo/issues/15178",
"source": "[email protected]",
"tags": [
"Issue Tracking",
"Patch",
"Vendor Advisory"
]
},
{
"url": "https://www.vulncheck.com/advisories/hugo-to-x-node-permission-model-bypass-via-default-tailwindcss-child-process-grant",
"source": "[email protected]",
"tags": [
"Exploit",
"Patch",
"Third Party Advisory"
]
}
]
}