Security Vulnerability Report
中文
CVE-2026-23885 CVSS 6.4 MEDIUM

CVE-2026-23885

Published: 2026-01-19 22:16:02
Last Modified: 2026-04-09 14:54:28

Description

Alchemy is an open source content management system engine written in Ruby on Rails. Prior to versions 7.4.12 and 8.0.3, the application uses the Ruby `eval()` function to dynamically execute a string provided by the `resource_handler.engine_name` attribute in `Alchemy::ResourcesHelper#resource_url_proxy`. The vulnerability exists in `app/helpers/alchemy/resources_helper.rb` at line 28. The code explicitly bypasses security linting with `# rubocop:disable Security/Eval`, indicating that the use of a dangerous function was known but not properly mitigated. Since `engine_name` is sourced from module definitions that can be influenced by administrative configurations, it allows an authenticated attacker to escape the Ruby sandbox and execute arbitrary system commands on the host OS. Versions 7.4.12 and 8.0.3 fix the issue by replacing `eval()` with `send()`.

CVSS Details

CVSS Score
6.4
Severity
MEDIUM
CVSS Vector
CVSS:3.1/AV:L/AC:H/PR:H/UI:N/S:U/C:H/I:H/A:H

Configurations (Affected Products)

cpe:2.3:a:alchemy-cms:alchemy_cms:*:*:*:*:*:*:*:* - VULNERABLE
cpe:2.3:a:alchemy-cms:alchemy_cms:*:*:*:*:*:*:*:* - VULNERABLE
Alchemy CMS < 7.4.12
Alchemy CMS < 8.0.3

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
需要身份验证的高权限用户通过构造特定engine_name参数触发eval()执行恶意代码

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-23885", "sourceIdentifier": "[email protected]", "published": "2026-01-19T22:16:02.453", "lastModified": "2026-04-09T14:54:27.540", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "Alchemy is an open source content management system engine written in Ruby on Rails. Prior to versions 7.4.12 and 8.0.3, the application uses the Ruby `eval()` function to dynamically execute a string provided by the `resource_handler.engine_name` attribute in `Alchemy::ResourcesHelper#resource_url_proxy`. The vulnerability exists in `app/helpers/alchemy/resources_helper.rb` at line 28. The code explicitly bypasses security linting with `# rubocop:disable Security/Eval`, indicating that the use of a dangerous function was known but not properly mitigated. Since `engine_name` is sourced from module definitions that can be influenced by administrative configurations, it allows an authenticated attacker to escape the Ruby sandbox and execute arbitrary system commands on the host OS. Versions 7.4.12 and 8.0.3 fix the issue by replacing `eval()` with `send()`."}, {"lang": "es", "value": "Alchemy es un motor de sistema de gestión de contenido de código abierto escrito en Ruby on Rails. Antes de las versiones 7.4.12 y 8.0.3, la aplicación utiliza la función `eval()` de Ruby para ejecutar dinámicamente una cadena proporcionada por el atributo `resource_handler.engine_name` en `Alchemy::ResourcesHelper#resource_url_proxy`. La vulnerabilidad existe en `app/helpers/alchemy/resources_helper.rb` en la línea 28. El código omite explícitamente el análisis de seguridad con `# rubocop:disable Security/Eval`, indicando que el uso de una función peligrosa era conocido pero no mitigado adecuadamente. Dado que `engine_name` se obtiene de definiciones de módulos que pueden ser influenciadas por configuraciones de administración, permite a un atacante autenticado escapar de la sandbox de Ruby y ejecutar comandos de sistema arbitrarios en el sistema operativo anfitrión. Las versiones 7.4.12 y 8.0.3 solucionan el problema reemplazando `eval()` por `send()`."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:L/AC:H/PR:H/UI:N/S:U/C:H/I:H/A:H", "baseScore": 6.4, "baseSeverity": "MEDIUM", "attackVector": "LOCAL", "attackComplexity": "HIGH", "privilegesRequired": "HIGH", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "availabilityImpact": "HIGH"}, "exploitabilityScore": 0.5, "impactScore": 5.9}, {"source": "[email protected]", "type": "Primary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H", "baseScore": 9.9, "baseSeverity": "CRITICAL", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "LOW", "userInteraction": "NONE", "scope": "CHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "availabilityImpact": "HIGH"}, "exploitabilityScore": 3.1, "impactScore": 6.0}]}, "weaknesses": [{"source": "[email protected]", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-95"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:alchemy-cms:alchemy_cms:*:*:*:*:*:*:*:*", "versionEndExcluding": "7.4.12", "matchCriteriaId": "6F247A42-8A2A-4EB9-98D9-6D29401B36FF"}, {"vulnerable": true, "criteria": "cpe:2.3:a:alchemy-cms:alchemy_cms:*:*:*:*:*:*:*:*", "versionStartIncluding": "8.0.0", "versionEndExcluding": "8.0.3", "matchCriteriaId": "7950D68F-3FA8-4C37-8AC4-0F0D8D5B9110"}]}]}], "references": [{"url": "https://github.com/AlchemyCMS/alchemy_cms/commit/55d03ec600fd9e07faae1138b923790028917d26", "source": "[email protected]", "tags": ["Patch"]}, {"url": "https://github.com/AlchemyCMS/alchemy_cms/commit/563c4ce45bf5813b7823bf3403ca1fc32cb769e7", "source": "[email protected]", "tags": ["Patch"]}, {"url": "https://github.com/AlchemyCMS/alchemy_cms/releases/tag/v7.4.12", "source": "[email protected]", "tags": ["Release Notes"]}, {"url": "https://github.com/AlchemyCMS/alchemy_cms/releases/tag/v8.0.3", "source": "[email protected]", "tags": ["Release Notes"]}, {"url": "https://github.com/AlchemyCMS/alchemy_cms/security/advisories/GHSA-2762-657x-v979", "source": "[email protected]", "tags": ["Vendor Advisory"]}]}}